我必須在WPF C#中編寫應用程序。我的問題是我不知道如何處理多個視圖。直到知道我知道如何使用Prism通過綁定將ViewModel連接到View,在基本級別。通過重寫OnStartup方法和UnityContainer的使用,我學會了一點Unity以在App.xml.cs中註冊ViewModel到View。WPF多視圖加棱鏡和統一
我想知道如何從視圖1導航到視圖2,反之亦然。 我想瀏覽一個按鈕,視圖不同。
你能幫助我嗎?一些建議?
我必須在WPF C#中編寫應用程序。我的問題是我不知道如何處理多個視圖。直到知道我知道如何使用Prism通過綁定將ViewModel連接到View,在基本級別。通過重寫OnStartup方法和UnityContainer的使用,我學會了一點Unity以在App.xml.cs中註冊ViewModel到View。WPF多視圖加棱鏡和統一
我想知道如何從視圖1導航到視圖2,反之亦然。 我想瀏覽一個按鈕,視圖不同。
你能幫助我嗎?一些建議?
這是非常容易與棱鏡導航做到這一點,它不需要你在ViewModel上創建依賴關係,或者使用動態DataTemplates引入性能滯後。我建議閱讀有關Prism導航的文檔。
基本上你使用ReqestNavigate,GoBack的,和GoForward的組合。
酒店還設有一個樣品,你在這裏學習:
https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/View-Switching%20Navigation_Desktop
你也應該看這個過程可以引導您瞭解什麼,你都在問:
https://app.pluralsight.com/library/courses/prism-introduction/table-of-contents
我有很久以前寫的一個例子,它不需要任何框架廢話,根據我的經驗,WPF MVVM框架是沒用的大部分,而且往往簡單的事情複雜化所有你需要的是一個ICommand
實現和ViewModelBase
它實現INotiftyPropertyChanged
,這裏是一個簡單的例子:
XML:
<Window.Resources>
<DataTemplate DataType="{x:Type local:ViewModel1}">
<local:View1/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModel2}">
<local:View2/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModel3}">
<local:View3/>
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<ContentControl Content="{Binding CurrentViewModel}">
</ContentControl>
<StackPanel Orientation="Horizontal" Grid.Row="1" VerticalAlignment="Bottom">
<Button Command="{Binding PrevViewModel}">Previouws View</Button>
<Button Command="{Binding NextViewModel}">Next View</Button>
<Button Command="{Binding SwitchToViewModel}" CommandParameter="{x:Type local:ViewModel1}">Switch To View1</Button>
<Button Command="{Binding SwitchToViewModel}" CommandParameter="{x:Type local:ViewModel2}">Switch To View2</Button>
<Button Command="{Binding SwitchToViewModel}" CommandParameter="{x:Type local:ViewModel3}">Switch To View3</Button>
</StackPanel>
</Grid>
鑑於上述情況時,有史以來CurrentViewModel
屬性更改,視圖將得到一個基於選擇資源,並且窗口的DataContext設置爲MainViewModel
。
主視圖模型如下所示:
public class MainViewModel : ViewModelBase
{
//add instances to all the ViewModels you want to switch between here, and add templates for them in your resources specifying the x:type and the view or data template to be used
public ObservableCollection<ViewModelBase> ViewModels { get; set; } = new ObservableCollection<ViewModelBase>();
private ViewModelBase _currentViewModel;
public ViewModelBase CurrentViewModel {
get { return _currentViewModel; }
set { SetField(ref _currentViewModel, value); }
}
private ICommand _nextViewModel;
public ICommand NextViewModel
{
get
{
return _nextViewModel = _nextViewModel ?? new RelayCommand(p =>
{
CurrentViewModel = ViewModels[ViewModels.IndexOf(CurrentViewModel) +1];
}, p =>
{
return ViewModels.IndexOf(CurrentViewModel) + 1 != ViewModels.Count && CurrentViewModel != null;
});
}
}
public ICommand _prevViewModel;
public ICommand PrevViewModel
{
get
{
return _prevViewModel = _prevViewModel ?? new RelayCommand(p =>
{
CurrentViewModel = ViewModels[ViewModels.IndexOf(CurrentViewModel) - 1];
}, p =>
{
return ViewModels.IndexOf(CurrentViewModel) != 0 && CurrentViewModel!=null;
});
}
}
private ICommand _switchToViewModel;
public ICommand SwitchToViewModel
{
get
{
return _switchToViewModel = _switchToViewModel ?? new RelayCommand(p =>
{
CurrentViewModel = this.ViewModels.FirstOrDefault(vm=>vm.GetType()==p as Type);
}, p =>
{
return this.ViewModels.FirstOrDefault(vm => vm.GetType() != p as Type) != null;
});
}
}
}
結果看起來像
@Adrian對不起,以爲你問的是'wpf',因爲它在問題的標籤中,我不知道任何與IOS相關的東西,請編輯你的問題並詢問你的問題需要準確地等待相關的答案,問題說wpf,而不是iphone或手機或任何跡象表明你沒有使用'wpf'。 –
謝謝。沒關係。你可能有一部智能手機。我問這個問題,因爲我想知道我是否可以在WPF中實現相同的行爲。爲了以防萬一,我會將此頁面加入書籤。 – Adrian
@Adrian是的,你確定你可以!,這是上述想法,你需要上述的唯一變化是隱藏按鈕,而不是禁用它們,如果這就是你需要讓我知道,讓我知道你是如何準確地 –
創建一個區域(例如,' '),註冊您的導航視圖('IUnityContainer.RegisterTypeForNavigation'),然後執行導航命令綁定到你的按鈕('RegionManager.RequestNavigate') –
Haukinger