我正在尝试创建一个类和方法,可以在任何窗口和页面上使用,以更改主窗口上显示的当前页面。
到目前为止,我得到了:
class MainWindowNavigation : MainWindow
{
public MainWindow mainWindow;
public void ChangePage(Page page)
{
mainWindow.Content = page;
}
}
字符串
主窗口本身:
public MainWindow()
{
InitializeComponent();
MainWindowNavigation mainWindow = new MainWindowNavigation();
mainWindow.ChangePage(new Pages.MainWindowPage());
}
型
不幸的是,这最终导致System.StackOverflowException。
创建这个的主要原因是我希望能够从当前显示在mainWindow.Content中的页面更改mainWindow.Content。
我已经审查了MVVM,但我不认为这是值得使用它的一个小应用程序一样,因为所有我希望它做的是显示一个欢迎页面打开,然后在一边会有几个按钮.一旦按下mainWindow.内容正确地更改到一个页面,用户可以输入登录详细信息,然后在按钮上按下登录页面我想改变mainWindow.内容到不同的页面上成功验证输入的登录详细信息。
3条答案
按热度按时间vddsk6oq1#
使用MVVM是绝对好的,因为它将简化您的需求的实现。WPF是为与MVVM模式一起使用而构建的,这意味着大量使用数据绑定和数据模板。
任务很简单,为每个视图创建一个
UserControl
(或DataTemplate
),例如,WelcomePage
和LoginPage
及其相应的视图模型WelcomePageViewModel
和LoginPageViewModel
。ContentControl
将显示页面。主要的技巧是,当使用隐式
DataTemplate
(没有定义x:Key
的模板资源),XAML解析器将自动查找并应用正确的模板,其中DataType
匹配ContentControl
的当前内容类型。这使得导航非常简单,因为您只需从页面模型集合中选择当前页面,并通过数据绑定将此页面设置为ContentControl
或ContentPresenter
的Content
属性:用法
主窗口.xaml
字符串
实现
1.创建单独的页面控件(承载页面内容的控件)。这可以是
Control
,UserControl
,Page
或简单的DataTemplate
:欢迎页面.xaml
型
登录页面.xaml
型
1.创建页面模型:
IPage.cs
型
WelcomePageViewModel.cs
型
LoginPageViewModel.cs
型
1.创建页面标识符的枚举(以消除XAML和C#中的魔术字符串):
PageName.cs
型
1.创建
MainViewModel
来管理页面及其导航:MainViewModel.cs
RelayCommand
的实现可以在型
krugob8w2#
您可能希望将
MainWindowNavigation
定义为一个静态类,并使用一个方法简单地更改当前MainWindow
的Content
:字符串
然后,您可以从任何类调用该方法,而无需引用
MainWindow
:型
cxfofazt3#
我发现了一个解决方案,如何在不将所有对象初始化存储在内存中的情况下进行简化导航。在我看来,这个解决方案允许您保存
MVVM
模式并实现更少的内存开销。MainWindow.xaml
字符串
MainWindowViewModel.cs
型
LoginPage.xaml
型
当点击“Go to login”按钮时,它将调用
NaviateCmd
命令,该命令又将调用方法Navigate
并传递Page
的Type
,您希望在MainWindow.xaml
中显示。然后在方法Navigate
中创建页面的示例,设置必要的数据绑定并将其放置在SelectedContent
属性中。如果您想将导航设置为不同的页面,您可以在
Button
的CommandParameter
属性中传递所需页面的不同Type
。