WPF 全屏 (MDI),但不是 MDI

本文关键字:MDI 全屏 WPF | 更新日期: 2023-09-27 18:33:12

我正在使用 WPF 重新设计我的 WinForms 应用程序,我只进入了该项目 2 周,很快就了解到我需要的许多控件不需要自定义控件,而 WPF 允许我轻松设计这些控件。

到目前为止,我有一个MainWindow.xaml,Login.xaml和Menu.xaml,

这个想法是显示登录,验证后显示菜单,然后如果关闭以在主窗口中登录,这将是全屏的。

为了使功能正常工作,我只是使用 WindowStyle="none" 创建了登录和菜单表单并将其居中到屏幕上,这显然不起作用,因为仍然有一个表单但没有链接到主表单。

在 winforms 中,我使用了 MDI,但阅读此论坛并查看问题 MDI 是不受欢迎的,我查看了选项卡控件。 到目前为止,我可以找到有关使用1表单显示它的教程,但找不到合适的教程来登录>菜单>登录

我不想被勺子喂食,这个项目只是一个尝试掌握 WPF 的实践项目,但有很多与该主题相关的问题,每个人都以不同的方式处理它。

谢谢

WPF 全屏 (MDI),但不是 MDI

在不创建过于复杂的答案,也不包括对您来说显然陌生的概念(如 DelegateCommand(s( 或 WindowManager(的情况下,这是一个全屏应用程序的基本示例,显示了许多不同的"子窗口"(它们本身不是窗口,而是 UserControls(

主窗口:

<Window x:Class="FullScreenAppSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        WindowState="Maximized"
        WindowStyle="None">
</Window>

代码隐藏:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void ShowLogin()
    {
        var loginview = new LoginView();
        this.Content = loginview;
    }
    private void ShowMenu()
    {
        var menu = new MenuView();
        this.Content = menu;
    }
}

登录视图:

<UserControl x:Class="FullScreenAppSample.Login.LoginView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <!-- your login screen UI here -->
</UserControl>

菜单视图:

<UserControl x:Class="FullScreenAppSample.Menu.MenuView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <!-- your Menu UI here -->
</UserControl>

这就是所谓的"视图优先"方法,其中视图通过负责实例化其他视图并使它们可见来指示应用程序的"流"。


话虽如此,我将花一分钟来解决您的断言

每个人的处理方式都不同

是的。创建 WPF 应用程序的主流方法是称为 MVVM,它被认为是 Martin Fowler 的表示模型的特定于 WPF 的版本。然而,MVVM有很多解释和许多不同的版本,以及许多MVVM框架,如MVVM Light,Caliburn.Micro和Microsoft's Prism(等等(。

这些框架中的每一个都提供了基本工具(基类、帮助程序类、服务、抽象、事件聚合器等(,以简化大规模复杂 WPF 应用程序的开发。

底线:没有一个明确的"正确方法"来处理WPF中的View和ViewModel实例化/管理等事情,这将取决于你对MVVM框架的选择和项目的具体情况,例如对可测试性的需求。

就我个人而言,我从几个不同的框架中获取了各种部件和组件(以及概念(,并编写了我自己的ViewModel优先MVVM方法。我建议您花一些时间来分析您的项目需求,并考虑是否使用其中任何一个。

与其从"窗体"和"窗口"的角度思考如何设计此应用程序,就好像它是一个 Web 应用程序一样。登录"屏幕"可以只是放置在其他所有控件之上的用户控件,该控件阻止用户在显示时与下面的任何控件进行交互。

也不要直接引用彼此中的控件。而是将事件添加到每个用户控件,并将它们绑定到 MainWindow 中其他控件中的相应方法。