2017-06-15 1 views
0

J'ai un contrôle utilisateur dans lequel plusieurs régions Prism sont définies pour l'injection de vues. J'ai décidé d'utiliser la navigation dans la vue Prism pour gérer le ma "SelectedMenuContentRegion" basée sur les actions de l'utilisateur (comme indiqué ci-dessous) et j'ai rencontré un problème. Je suis sûr que le problème est avec mon utilisation, mais je n'ai pas été capable de comprendre ce que je fais mal. J'ai le contrôle utilisateur suivant qui contient un contrôle WPF personnalisé.Prism 6 Gestionnaire de régions RequestNavigate ne parvient pas à naviguer dans certaines régions

<Grid> 
    <commonwpfcontrols:NavigationPane Background="{StaticResource SecondaryColorBrush}" IsExpanded="False" MenuItems="{Binding MenuItems}"> 
    <commonwpfcontrols:NavigationPane.Content> 
     <ContentControl prism:RegionManager.RegionName="MapRegion"/> 
    </commonwpfcontrols:NavigationPane.Content> 
    <commonwpfcontrols:NavigationPane.SelectedMenuContent> 
     <ContentControl prism:RegionManager.RegionName="SelectedMenuContentRegion"/> 
    </commonwpfcontrols:NavigationPane.SelectedMenuContent> 
    </commonwpfcontrols:NavigationPane> 

    <Grid> 
    <ContentControl prism:RegionManager.RegionName="ApplicationOverlay"/> 
    </Grid> 

Il y a 3 régions définies. Si je fais la norme

mRegionManager.RegisterViewWithRegion("SelectedMenuContentRegion",() => mUnityContainer.Resolve<MapSettingsView>()); 

Il fonctionne comme prévu, mais si je me inscrire la vue pour la navigation comme ce qui suit:

mUnityContainer.RegisterTypeForNavigation<MapSettingsView>(); 

et puis essayez de naviguer quelque temps plus tard

mRegionManager.RequestNavigate("SelectedMenuContentRegion ", "MapSettingsView", NavigationComplete); 

Il échoue. J'ai noté dans le débogueur que le gestionnaire de région avait seulement la région "ApplicationOverlay" dans sa liste de régions. J'ai donc changé la région vers laquelle je naviguais, vers la région ApplicationOverlay en test, et cela a fonctionné. J'obtiens le gestionnaire de la région grâce à l'injection de dépendance. Toute indication quant aux raisons pour lesquelles les autres régions définies ne sont pas connues du gestionnaire de région?

Mise à jour Étant donné que des informations plus détaillées sont requises, j'ai créé un petit échantillon autonome qui montre la navigation échouée. Prism Navigation Sample

Répondre

1

Cela dépend du contrôle personnalisé que vous utilisez. Il est possible que les volets de navigation ne fasse pas partie de l'arbre visuel (ou initialisé) jusqu'à plus tard. La raison pour laquelle RegisterViewWithRegion fonctionne est parce qu'il attend jusqu'à ce que la région ait été réalisée avant l'injection. Donc, dites-moi que vous essayez de naviguer avant que les régions aient été initialisées. MISE À JOUR: Merci pour l'exemple, cela permet de résoudre le problème. Honnêtement, je n'ai pas passé du temps à essayer de comprendre pourquoi ça ne fonctionnait pas, mais je l'ai juste fait fonctionner. Tout ce que vous devez le faire donner à vos régions un x: Nom, puis définissez le gestionnaire de la région en utilisant la propriété attachée dans le code:

<ContentControl x:Name="_rightContents" /> 

Et puis dans le code-behind:

public MainWindow(IRegionManager regionManager) 
{ 
    InitializeComponent(); 
    RegionManager.SetRegionManager(_rightContents, regionManager); 
} 
+0

je vais creuser dans la détermination si elles sont réalisées. En utilisant les outils VS2017 pour afficher l'arborescence visuelle en direct, les ContentControls apparaissent dans la liste, mais les régions ne semblent pas être contenues dans le gestionnaire de région. La requête de navigation se produit lorsqu'un utilisateur clique sur un élément de la zone de liste, ce qui est fait après le démarrage/l'initialisation de l'application. –

+0

Les contrôles de contenu ne sont probablement pas ajoutés à l'arborescence visuelle tant que les volets de navigation ne sont pas développés. Juste une supposition. –

+0

Les contrôles de contenu sont ouverts lorsque j'émets la commande pour naviguer. Je vais essayer de réduire ce que j'ai dans un exemple autonome. –