2012-10-12 4 views
3

저는 WPF를 처음 사용하기 때문에 MVVM Light Toolkit을 사용하는 WPF 응용 프로그램에서 여러 화면을 탐색 할 때 모범 사례로 추천합니다. WPF에 익숙치 않아 올바른 용어가 "보기 전환", "페이지 탐색", "창 변경"또는 다른 것과 관련이 있는지 확실하지 않아서 내 용어가 틀린 경우 실례합니다. WPF는 인정 될 것이다).화면 간 전환 WPF

내가 원하는 작업을 명확히하기 : 사용자가 앞뒤로 이동할 수 있어야하는 3 개의 전체 화면 페이지 /보기가있는 응용 프로그램이 있습니다. 이러한 뷰는 절대로 동시에 표시되지 않으므로 탭 컨트롤의 탭과 가장 쉽게 비교할 수 있습니다. 단 탭 컨트롤은 일반적으로 제공되는 탭 스트립을 원하지 않습니다. 대신 페이지/뷰를 프로그래밍 방식으로 전환하고 싶습니다.

나는 흐름 답변을 통해 다음과 같은 스택에, 몇 가지 다른 접근을 본 적이

:

  1. https://stackoverflow.com/a/6114865/1081879
  2. How to navigate through windows with MVVM Light for WPF?

을 그래서 정말 난 그냥 궁금 위의 어느 방법에 내가 가야 할 방향이야? 저는 이미 실제로 첫 번째 대답을 구현했습니다. 그러나 이것이 데이터 템플릿의 "남용"/ "해킹"인지 또는 프레임 워크의 사용 방법인지 확실하지 않습니다.

마지막으로 MVVM Light은 다른 툴킷이이 기능을 기본적으로 제공하는 경우 사용할 수있는 가장 적합한 툴킷이 아닙니다. 누구든지이 개념에 비추어 볼 수 있고, 아마도 더 적합한 툴킷을 추천 할 수 있습니까?

는 우리의 견해의 계층 적 설명을 만들 수 있습니다 :

감사합니다, 탐색의

+1

실제로 WPF가 어떻게 작동하는지 알 수 있습니다. 응용 프로그램은 사용자가 만든 개체 (ViewModels/Models)로 구성되며 DataTemplates 및 UI 개체를 사용하여 WPF에게 응용 프로그램 그리기 방법을 지시합니다. WinForms와는 반대되는 점은 UI 개체에서 응용 프로그램을 빌드하고 필요한 데이터를 제공한다는 것입니다. – Rachel

+0

제가 정확히 언급 한 두 번째 답변의 탐색 기능은 무엇입니까? –

+0

이전에는이 ​​코드를 사용하지 않았지만 같은 것을 수행하는 프레임 워크 인 것 같습니다. 객체를 "현재"페이지로 설정하고, ViewModelLocator를 사용하여 올바른 뷰를 찾아 페이지를 그립니다. – Rachel

답변

1

내가 실제로 질문 한 내용은 위에 나열된 두 가지 접근법 중 하나가 실제로 일반적으로 사용되고 견고한 접근법 중 하나를 나타내는 참조였습니다.

드디어이에 발견 한 :보기 모델의 데이터 템플릿을 사용하는 첫 번째 방법을 호출 http://msdn.microsoft.com/en-us/library/gg405484%28v=PandP.40%29.aspx

.

1

신속하고 더러운 예 (이 뭔가 맞춤법이 틀린 경우 VS에서 수정 프로그램을 적용하십시오, 그래서 여기되지 작성되었습니다) :

public abstract Class ViewModelBase : INotifyPropertyChanged{} 
    public abstract Class ViewModelNavigationBase : ViewModelBase {} 
    public Class ViewModel1 : ViewModelNavigationBase {} 
    public Class ViewModel2 : ViewModelNavigationBase {} 
    public Class ViewModel3 : ViewModelNavigationBase {} 

    public Class MainViewModel : ViewModelBase 
    { 
     private ViewModelNavigationBase currentViewModel; 
     public ViewModelNavigationBase CurrentViewModel 
     { 
     get{return currentViewModel;} 
     set 
     { 
      currentViewModel = value; 
      OnPropertyChanged("CurrentViewModel");     
     } 
     }   

     private const int numberOfPages = 3 ; 
     private int index; 
     private ViewModelNavigationBase[numberOfPages] pages; 
     .... 
     ... OnNavigateCommand() 
     { 
      index++; 
      index = index % numberOfPages; 
      CurrentViewModel = pages[index]; 
     } 

} 

자원 :

 <local:MainViewModel x:Key="MainVm" /> 

    <DataTemplate TargetType={x:Type local:ViewModel1}> 
     <local:View1 /> 
    </DataTemplate> 

    <DataTemplate TargetType={x:Type local:ViewModel2}> 
     <local:View2 /> 
    </DataTemplate> 

    <DataTemplate TargetType={x:Type local:ViewModel3}> 
     <local:View3 /> 
    </DataTemplate> 

X aml :

<Window x:Name="MainWindow" 
     DataContext={StaticResource MainVm}> 
     <StackPanel> 
      <ContentControl Content={Binding CurrentViewModel} /> 
      <Button Content="Navigate" Command="{Binding NavigateCommand}"/> 
     </StackPanel>  
</Window>  
+0

감사합니다. 이미 연결된 첫 번째 답변에 따라 구현되었습니다. 나는 이것이 왜 두 번째 대답보다 선호되고, 어느 것이 올바른 길인지 궁금합니다. –

+0

MVVM Light 툴킷에서 wpf 프레임 워크의 일부가 아닌 타사 라이브러리를 사용하는 경우 프레임 워크를 구현하는 것이 자신의 코드를 유지 관리 할 수 ​​있고 더 명확한 그림을 얻을 수 있기 때문에 이점이 더 많다고 생각합니다. 프레임 워크가 작동하는 방식. –