2017-05-24 1 views
0

J'ai essayé de faire fonctionner la navigation basée sur la vue en utilisant Prism et les régions. J'ai essayé de parcourir la documentation sur MSDN, mais pour une raison que j'ignore, je n'arrive pas à la faire fonctionner, et je ne sais pas ce que je fais de mal. Voilà donc ce que je suis arrivé à ce jour:Wpf Prism Region Navigation

MainShellViewModel.cs

//Private Variables 
private readonly IRegionManager _regionManager; 

//Public Variables 
public DelegateCommand<string> NavigateCommand { get; set; } 

//Functions and Methods 
public MainShellViewModel(IRegionManager regionManager) 
{ 
    //Region Manager 
    _regionManager = regionManager; 
    NavigateCommand = new DelegateCommand<string>(Navigate); 
    Initialize(); 
} 

public void Initialize() 
{ 
    //Startup View 
    _regionManager.RegisterViewWithRegion("ViewMainFrame", typeof(Views.Dashboard)); 
} 

public void Navigate(string uri) 
{ 
    //Navigation 
    if(uri != null) 
    { 
     _regionManager.RequestNavigate("ViewMainFrame", uri); 
    } 
} 

note de côté: un des nombreux tutoriels que je suivais me avait mis dans cette méthode Navigate, ai-je besoin? J'utilise MainShellViewModel comme vue principale injectée au démarrage.

DashboardViewModel.cs: (Contient l'erreur)

{ 
    //Private Variables 
    private bool _canExercise = true; 

    //Public Variables 
    public bool CanExercise() 
    { 
     return _canExercise; 
    } 

    RelayCommand _exerciseSelCommand; 
    public ICommand ExerciseSelCommand 
    { 
     get 
     { 
      if (_exerciseSelCommand == null) 
       _exerciseSelCommand = new RelayCommand(ExerciseSel, CanExercise); 

      return _exerciseSelCommand; 
     } 
    } 

    //Dashboard Functions and Methods 
    IRegion _regionManager; 

    private void ExerciseSel() 
    { 
     SoundPlayers.ButtonSound(); 
     _regionManager.RequestNavigate(new Uri("ExerciseView", UriKind.Relative)); //This gives me the error, it says it can't be nullable? 
    } 

Voici où j'inscrire mes conteneurs/vues, etc.

Bootstrapper.cs:

protected override void ConfigureContainer() 
{ 
    base.ConfigureContainer(); 
    #region Region Register Zone 
    //register views here! 
    Container.RegisterType(typeof(object), typeof(Views.LoginView), "LoginView"); 
    Container.RegisterType(typeof(object), typeof(Views.Dashboard), "Dashboard"); 
    Container.RegisterType(typeof(object), typeof(Views.ExerciseView), "SettingsView"); 
    Container.RegisterType(typeof(object), typeof(Views.ResultsView), "ResultsView"); 
    Container.RegisterType(typeof(object), typeof(Views.UserCreationView), "UserCreationView"); 
    #endregion 
} 

Donc, fondamentalement, je Je veux juste être en mesure d'obtenir à partir du tableau de bord (qui est ma vue de démarrage actuelle) à toute autre vue qui est enregistrée dans mes conteneurs sur un clic d'un bouton.

MainShell.xaml:

<Window x:Name="Shell" 
    x:Class="Equinox.Views.MainShell" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    xmlns:prism="http://www.codeplex.com/prism" 
    prism:ViewModelLocator.AutoWireViewModel="True" 
    Title="Equinox" 
    FontFamily="Quicksand" 
    Height="900" 
    Width="1500" 
    SizeToContent="WidthAndHeight" 
    ResizeMode="CanResize" 
    Background="#EEF3F4" 
    WindowStyle="SingleBorderWindow" 
    Icon="/Equinox;component/favicon.ico" 
    WindowStartupLocation="CenterScreen"> 

<!-- Main View Region --> 

<ContentControl x:Name="ContentControlMain" 
       prism:RegionManager.RegionName="ViewMainFrame" 
       Focusable="False"/> 

Cependant, je continue à avoir des erreurs lorsque je tente de faire ma région prendre une autre vue. La façon dont je le faisais était en utilisant mon DashboardViewModel, et en créant un autre IRegionManager nommé _regionManager, et en faisant le RequestNavigation. Je n'ai eu aucune erreur jusqu'à ce que je l'ai couru et ai pressé le bouton qui devrait me relier à la vue suivante.

Toute aide serait appréciée!

Merci!

+0

Pouvez-vous montrer les parties pertinentes du code VM du tableau de bord, c'est-à-dire où vous créez le IRegionManager et où vous appelez sa méthode RequestNavigation()? En outre, pouvez-vous fournir des détails sur le message d'erreur que vous voyez?Juste pour vérifier, vous devriez injecter IRegionManager dans votre VM de tableau de bord (comme vous le faites avec la VM principale), et IRegionManager doit être enregistré comme un * singleton * dans votre bootstrapper. –

+0

Oui, désolé à ce sujet. Je viens de l'ajouter. xD – Hypergyzed

Répondre

1

Je ne sais pas si vous avez déjà la réponse, mais je courais dans le même chose aujourd'hui. Le commentaire de Brian m'a donné l'indice nécessaire.

J'ai le code suivant dans le bootstrapper. Cela permet d'enregistrer les deux points de vue pour permettre la navigation pour les:

public class Bootstrapper : UnityBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    { 
     return Container.Resolve<MainWindow>(); 
    } 

    protected override void InitializeShell() 
    { 
     Application.Current.MainWindow.Show(); 
    } 

    protected override void ConfigureContainer() 
    { 
     base.ConfigureContainer(); 
     Container.RegisterTypeForNavigation<ViewA>("ViewA"); 
     Container.RegisterTypeForNavigation<ViewB>("ViewB"); 
    } 
} 

Cela donne une MainWindow, qui enregistre viewA et viewB. Pour permettre la navigation à viewB d'un bouton viewA, les besoins suivants à faire dans ViewAViewModel:

public class ViewAViewModel: BindableBase 
{ 
    private readonly IRegionManager _regionManager; 

    public ViewAViewModel(IRegionManager regionManager) 
    { 
     _regionManager = regionManager; 

     ButtonCommand= new DelegateCommand(ButtonClicked); 
    }   

    private void ButtonClicked() 
    { 
     _regionManager.RequestNavigate("ContentRegion", "ViewB"); 
    } 
} 

Dans la forme XAML viewA la dernière chose dont vous avez besoin est bien sûr le bouton lui-même:

<Button Content="Navigate" Command="{Binding ButtonCommand/> 
+0

Oui, j'ai eu la réponse, merci l'homme! C'est comme ça que je l'ai fait. – Hypergyzed

0

Découvrez sampels 17, 18 et 19. Cela devrait vous aider à y aller dans la bonne direction:

https://github.com/PrismLibrary/Prism-Samples-Wpf

+0

En regardant les exemples, et en les répliquant, je continue de me donner des erreurs. J'ai remarqué qu'ils ont tous une seule vue et c'est MainWindow. Eh bien j'ai un Mainshelll, et dans cette coquille est une vue que j'ai injectée. J'essaye de l'obtenir pour montrer une autre vue à l'intérieur de cette coquille quand j'appuie sur un bouton à l'intérieur de la vue. J'ai essayé différentes variantes mais toujours pas de chance. Des idées? – Hypergyzed

+0

Avez-vous exécuté les échantillons? Il a un shell qui vous permet de naviguer dans plusieurs vues de la région. Vous pouvez naviguer facilement entre les vues en cliquant sur les boutons. Vous êtes probablement tout simplement en train de manquer complètement le concept. C'est en fait très simple. –

+0

Tout ce que vous faites est de vous assurer que vos vues sont enregistrées pour la navigation, puis appelez IRegionManager.RequestNaviagte et c'est tout. –