【问题标题】:WPF FullScreen (MDI) but not MDIWPF 全屏 (MDI) 但不是 MDI
【发布时间】:2013-09-30 11:48:00
【问题描述】:

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

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

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

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

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

的教程

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

谢谢

【问题讨论】:

  • 我很高兴听到这个消息。 WPF 摇滚。 .Net 开发人员应该接受它。你不会后悔这个决定 =)

标签: c# wpf


【解决方案1】:

没有创建一个过于复杂的答案,也没有包含对您来说显然是新的概念,例如DelegateCommand(s) 或WindowManager(s),这是一个全屏应用程序的简单示例,显示了许多不同的“子窗口”(不是窗口本身,而是用户控件)

主窗口:

<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's Presentation Model 的 WPF 特定版本。然而,有许多解释和许多不同版本的 MVVM,包括许多 MVVM Frameworks,例如 MVVM LightCaliburn.Micro 和 Microsoft 的 Prism(以及许多其他版本)。

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

底线:没有明确的“正确方法”来处理 WPF 中的 View 和 ViewModel 实例化/管理之类的事情,这取决于您的 choice of MVVM Framework 和项目的具体情况,例如可测试性的需求。

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

【讨论】:

  • 嘿,再次,我接受了您的建议,在看到其他代码的美丽之后,决定接近并学习 WPF。我假设在主窗口加载时我会调用登录?为了展示它,工作接缝只是想确保我正确调用它!谢谢
  • @JamesSmithyCleave 是的,差不多。尽管您可能需要将登录逻辑和对服务的调用放入ViewModel,而不是在代码后面。这就是这个答案的第二部分的重点,你不应该把业务逻辑放在代码后面。
  • 谢谢,我需要退后一步,看看一些关于 MVVM 的教程,我非常熟悉 cakephp 和其他使用整个模型视图控制器的框架,所以这个想法对我来说并不陌生!
  • 这里没有任何消息功能,你在任何地方闲逛聊天明智吗?需要通过我的 winforms 应用程序来了解一些东西,我目前有大约 30 个表单,不完全确定我是否应该有 30 个视图等,接缝有点矫枉过正!
  • @JamesSmithyCleave 是的,在 SO 聊天中找到我。为什么你会觉得 30 次观看是多余的?我刚刚数了一下,我们这里的应用程序有 1102 个.xaml 文件,并且运行良好。
【解决方案2】:

与其考虑“表单”和“窗口”,不如想想如何设计这个应用程序,就好像它是一个 Web 应用程序一样。登录“屏幕”可以简单地是一个用户控件,位于其他所有控件之上,以防止用户在显示时与下面的任何控件进行交互。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多