C# WPF关于打开窗口和后退按钮的良好实践
我是WPF MVVM C的初学者程序员。当用户安装我的应用程序时,他将遵循教程。所以,对于教程的每个“屏幕”,我都创建了一个窗口。 在每个屏幕上,我都有一个后退按钮 因此,我对打开新窗口并返回到上一个窗口的良好实践感到困惑。最好的方法是什么?目前,我正在做: 第一个窗口(下一步按钮)-ViewModel1C# WPF关于打开窗口和后退按钮的良好实践,c#,wpf,mvvm,C#,Wpf,Mvvm,我是WPF MVVM C的初学者程序员。当用户安装我的应用程序时,他将遵循教程。所以,对于教程的每个“屏幕”,我都创建了一个窗口。 在每个屏幕上,我都有一个后退按钮 因此,我对打开新窗口并返回到上一个窗口的良好实践感到困惑。最好的方法是什么?目前,我正在做: 第一个窗口(下一步按钮)-ViewModel1 <Button Command="{Binding NextWindowCommand}" > public void NextWindow(object parameter)
<Button Command="{Binding NextWindowCommand}" >
public void NextWindow(object parameter)
{
var newWindow = new Window2();
newWindow.Show();
newWindow.DataContext = new ViewModel2();
CloseWindow();
}
首先,很高兴知道你的窗口中有什么教程,它只是文本还是控件来填充?比如文本框、复选框和其他东西。
如果您希望避免每次用户点击下一个或上一个按钮时创建新窗口,我建议您创建一次窗口,然后创建一个集合列表,将窗口添加到集合中,然后在用户按下下一个或上一个按钮时使用可见性隐藏窗口。您可以使用集合索引来导航集合中的窗口,并使用选定的窗口属性来获取正确的窗口并将其设置为可见或将其置于最前面。首先,最好了解您的窗口中有哪些教程内容,它是要填充的文本还是控件?比如文本框、复选框和其他东西。
如果您希望避免每次用户点击下一个或上一个按钮时创建新窗口,我建议您创建一次窗口,然后创建一个集合列表,将窗口添加到集合中,然后在用户按下下一个或上一个按钮时使用可见性隐藏窗口。您可以使用集合索引来导航集合中的窗口,并使用选定的窗口属性来获取正确的窗口并将其设置为可见或置于前面。如果您希望根据
视图模型动态切换视图,则使用数据模板
是合适的:
<Window>
<Window.Resources>
<DataTemplate DataType="{x:Type ViewModelA}">
<localControls:ViewAUserControl/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModelB}">
<localControls:ViewBUserControl/>
</DataTemplate>
<Window.Resources>
<ContentPresenter Content="{Binding CurrentView}"/>
</Window>
要查看完整的工作示例
要下载示例,如果您想根据视图模型动态切换视图,可以使用数据模板
:
<Window>
<Window.Resources>
<DataTemplate DataType="{x:Type ViewModelA}">
<localControls:ViewAUserControl/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModelB}">
<localControls:ViewBUserControl/>
</DataTemplate>
<Window.Resources>
<ContentPresenter Content="{Binding CurrentView}"/>
</Window>
要查看完整的工作示例
要下载示例,请下载项目的良好实践:
使用框架管理您的窗口(如Caliburn.Micro或MVVM Light)
使用DI包装视图模型
MVVM的优点之一是“返回”操作几乎是免费的。当用户离开一个窗口转到新窗口时,请记住堆栈上的旧视图模型。当他单击“后退”时,只需关闭当前窗口,从堆栈中弹出视图模型,并显示它
项目的良好实践:
使用框架管理您的窗口(如Caliburn.Micro或MVVM Light)
使用DI包装视图模型
MVVM的优点之一是“返回”操作几乎是免费的。当用户离开一个窗口转到新窗口时,请记住堆栈上的旧视图模型。当他单击“后退”时,只需关闭当前窗口,从堆栈中弹出视图模型,并显示它
嘿,谢谢你的回答。但是我在哪里添加这个数据模板,在使用XAML时?@Lücks我已经更新了我的答案。请看我的最新答案。@Lücks可以自由提问。如果你觉得我的回答对你有帮助,你可以把我的回答标记为回答。它将简化其他人未来的搜索。我选择与Caliburn.Micro合作,但你的答案确实是一个很好的选择。谢谢嘿,谢谢你的回答。但是我在哪里添加这个数据模板,在使用XAML时?@Lücks我已经更新了我的答案。请看我的最新答案。@Lücks可以自由提问。如果你觉得我的回答对你有帮助,你可以把我的回答标记为回答。它将简化其他人未来的搜索。我选择与Caliburn.Micro合作,但你的答案确实是一个很好的选择。谢谢
<Window>
<Window.Resources>
<DataTemplate DataType="{x:Type ViewModelA}">
<localControls:ViewAUserControl/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModelB}">
<localControls:ViewBUserControl/>
</DataTemplate>
<Window.Resources>
<ContentPresenter Content="{Binding CurrentView}"/>
</Window>
<Window x:Class="SimpleMVVMExample.ApplicationView"
...The code omitted for the brevity...
Title="Simple MVVM Example with Navigation" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type ViewModelA}">
<localControls:ViewAUserControl/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModelB}">
<localControls:ViewBUserControl/>
</DataTemplate>
</Window.Resources>
<DockPanel>
<Border DockPanel.Dock="Left" BorderBrush="Black" BorderThickness="0,0,1,0">
<ItemsControl ItemsSource="{Binding ListOfViewModels}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Name}"
Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
CommandParameter="{Binding }"
Margin="2,5"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
<ContentControl Content="{Binding CurrentDataTemplateViewModel}" />
</DockPanel>
</Window>