【问题标题】:Implementing multiple screens in an Application在应用程序中实现多个屏幕
【发布时间】:2009-10-20 19:00:30
【问题描述】:

奇怪的问题,但让我有点困惑。在过去,当我们有终端和 DOS 时,应用程序通常只有一个“窗口”,那就是全屏窗口。当人们切换功能时,并没有打开新窗口的概念,而是覆盖了主窗口的内容。所以只有一个主窗口,但在其中渲染了多个屏幕。

如何在现代应用程序中创建类似的东西,无论是 WinForms 还是 WPF?

似乎有两种方法:

  • 有多个窗口。这是通常的方法,通常允许用户同时使用多个窗口是有意义的,但这可能不是必需的/不希望的。使用 ShowDialog() 而不是 Show() 是制作第二个 Window Modal 的常用方法。
  • 只有一个窗口,但上面有一个 TabControl。隐藏选项卡并以编程方式切换它们。这接近于“一个窗口,多个屏幕”的行为,但由于您在同一个 Form 类中拥有所有控件,它自然会变得混乱(尽管有人可能会争辩说这会强制对控件进行正确命名。另外,可以推荐使用部分类和每个屏幕一个 .cs)

不知道有没有更好的办法?本质上是说“看,我不关心边框样式/图标或主菜单条之类的东西。我想要的只是将这个屏幕渲染到这个区域”。有点像 ASP.net 母版页,其中实际页面仅定义呈现为占位符的内容。

是否有一些适当的机制来做这样的事情?

或者整个方法有什么问题?

【问题讨论】:

    标签: c# .net wpf winforms xaml


    【解决方案1】:

    一种方法是将每个屏幕实现为用户控件,并根据需要在主窗口中动态加载和卸载这些控件。我在 Windows 移动应用程序中使用了这种方法,并且效果很好。

    【讨论】:

    • +1;我只是在写这个答案的变体。现在我不必了!
    • 这是个好主意,尤其是因为用户控件可以放在其他容器中(8如面板),这使得管理变得轻松。
    【解决方案2】:

    考虑到您提到 WPF,值得一提的是Prism(来自 MPP 的复合 UI 框架)将在单个控制器(用于相同的通用聚合)或多个控制器(跨多个聚合)。

    视图或其演示者都可以触发命令(或通过 IEventAggregator 广播事件),并且您的导航控制器可以通过更改分配给适当“区域”的当前视图来响应(您可能只有一个)。实际上,Prism 的区域模型与 MasterPage/Placeholder 模型非常相似,因此您可能需要研究一下。

    Prism 可能还包括导航历史记录(后退/前进)跟踪,但如果有的话我没有使用过。

    【讨论】:

      【解决方案3】:

      我还没有听说过一个特定的框架来实现这一点,但我会让每个页面成为 UserControl,或者可能是具有所需呈现逻辑的控件的子类。这些页面控件都将是表单的成员,并根据需要添加到其 Controls 集合中(或者如果它们太多,则根据需要创建)。他们将在初始化时设置Dock = DockStyle.Fill 之类的属性。换页时:

      void ChangePage(object sender, EventArgs e)
      {
         Controls.Clear();
         Controls.Add(sender as Control);
      }

      【讨论】:

        【解决方案4】:

        我是一名 C# 开发人员,我可以逐步告诉您,我开始将 UserControl 用于多个屏幕(页面)应用程序。我为一个名为 BasePage 的页面构建了我的基类,它扩展了 UserControl,并为我需要的每个页面(MainPage、SettingsPage 等)扩展了它。在 MainForm(应用程序的唯一形式)中,我添加了一个 BasePage 控件(例如,名为 CurrentPage),我可以在其中加载所需的页面。从 MainForm 我将需要的事件发送到 CurrentPage。我认为这是您需要在一个表单中使用多个表单的此类应用程序的最佳解决方案。这是我用于所有多页应用程序的结构。

        如果您使用选项卡控件,您最终会因为同时加载所有选项卡的所有控件而阻塞表单。我看到有 10 多个选项卡的项目,非常复杂的应用程序非常缓慢且难以编写代码。

        我希望你会发现这个答案很有用!

        【讨论】:

          猜你喜欢
          • 2021-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-12
          • 2020-08-31
          • 1970-01-01
          • 2012-11-13
          • 1970-01-01
          相关资源
          最近更新 更多