2017-05-24 1 views
0

저는 프리즘과 지역을 사용하여보기 기반 탐색을 작동 시키려고했습니다. MSDN의 설명서를 살펴 보려고했지만 어떤 이유로 작동하지 못하고 잘못된 것을 알지 못합니다. 그래서 이것은 내가 지금까지 무엇을 가지고 있습니다 :Wpf 프리즘 지역 내비게이션

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); 
    } 
} 

사이드 노트 : 나는 나를 탐색 방법 있음을 넣어 한 다음에 많은 자습서 중 하나, 나는 그것을 필요합니까? MainShellViewModel을 시작시 주입되는 기본보기로 사용하고 있습니다.

DashboardViewModel.cs : 나는 내 용기/뷰를 등록 곳에

다음
{ 
    //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? 
    } 

는 등

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 
} 

를 I 대시 보드 (내 현재 시작보기)에서 버튼 클릭만으로 내 컨테이너에 등록 된 다른보기로 전환 할 수 있기를 원합니다.

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"/> 

그러나, 나는 내 영역을 다른 시각을 만들려고 할 때 오류가 점점 계속. 내가 한 일은 DashboardViewModel을 사용하고 _regionManager이라는 또 다른 IRegionManager을 만들고 RequestNavigation을 수행하는 것이 었습니다. 나는 그것을 실행할 때까지 아무런 오류가 없으며 나를 다음보기로 연결시켜야하는 버튼을 눌렀습니다.

도움이 될 것입니다.

감사합니다.

+0

대시 보드 VM 코드의 관련 부분을 표시 할 수 있습니까? 즉, IRegionManager를 만드는 위치와 RequestNavigation() 메서드를 호출하는 위치는 무엇입니까? 또한보고있는 오류 메시지의 세부 정보를 제공 할 수 있습니까?다시 확인하기 만하면 대시 보드 VM에 IRegionManager를 주입해야하며 (기본 VM과 마찬가지로) 부트 스트 래퍼에 IRegionManager를 * 싱글 톤 *으로 등록해야합니다. –

+0

네, 죄송합니다. 방금 추가했습니다. xD – Hypergyzed

답변

1

확실하지,하지만 난 같은으로 실행되었다 오늘. Brian의 코멘트는 필자에게 필요한 힌트를 주었다.

부트 스트 래퍼에 다음 코드가 있습니다. 그러면 두보기가 등록되어 탐색 할 수 있습니다.

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"); 
    } 
} 

이렇게하면 ViewA와 ViewB를 등록하는 MainWindow가 제공됩니다. 이 ViewA의 버튼에서 ViewB에 대한 탐색을 허용하려면 다음 요구 ViewAViewModel에서 수행한다 :

<Button Content="Navigate" Command="{Binding ButtonCommand/> 
: ViewA는 당신이 필요로하는 마지막 것은 물론 버튼 자체 인 XAML 형태로

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"); 
    } 
} 

+0

그래, 그 대답을 얻었습니다. 그것이 내가 한 방식입니다. – Hypergyzed

0

체크 아웃 sampels 17, 18, 및 19 이것은 당신이 올바른 방향으로 가야 도움이 될 것입니다 : 당신은 이미 답을 가지고있는 경우

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

+0

예제를 살펴보고 복제하면 오류가 발생합니다. 나는 그들 모두가 단지 하나의 견해를 가지고 있으며 MainWindow임을 알았다. 글쎄 나는 주성분을 가지고 있는데, 그 껍데기에 주사 한 모습이있다. 내가보기 안의 버튼을 누르면 그 쉘 안에 다른 뷰를 표시하려고 노력 중입니다. 나는 다른 변형을 시도했지만 여전히 운이 없다. 어떤 아이디어? – Hypergyzed

+0

샘플을 실행 했습니까? 그것은 당신이 지역에서 여러보기를 탐색 할 수있는 쉘이 있습니다. 단추를 클릭하면보기간에 쉽게 이동할 수 있습니다. 당신은 아마도 전체 개념 전체를 놓치고있을 것입니다. 실제로는 매우 간단합니다. –

+0

당신이 할 일은 네비게이션을 위해 뷰가 등록되었는지 확인한 다음 IRegionManager.RequestNaviagte를 호출하면됩니다. –