在应用程序中实现多个屏幕

时间:2009-10-20 19:00:31

标签: c# .net wpf winforms xaml

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

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

似乎有两种方法:

  • 拥有多个Windows。这是通常的方法,通常允许用户同时使用多个窗口是有意义的,但这可能不是必需/期望的。使用ShowDialog()而不是Show()是制作第二个窗口模态的常用方法。
  • 只有一个窗口,但有一个TabControl。隐藏选项卡并以编程方式切换它们。这接近于“一个窗口,多个屏幕”的行为,但自然它会变得混乱,因为你在同一个Form类中拥有所有控件(虽然有人可能会认为这会强制控件的正确命名。另外,可以建议使用部分类和每个屏幕一个.cs)

我想知道是否有更好的方法?基本上是这样的东西:“看,我不关心边框样式/图标或主菜单条等东西。我想要的只是你将这个屏幕渲染到这个区域”。有点像ASP.net主页,其中实际页面只定义被渲染到占位符的内容。

是否有一些正确的机制可以做类似的事情?

或整个方法有问题吗?

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

考虑到你提到了WPF,值得一提的是Prism(来自MPP的复合UI框架)将在单个Controller(对于相同的通用聚合)或多个控制器中使用多个视图(UserControls)来实现(跨几个聚合)。

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

Prism可能还包括导航历史记录(后退/前进)跟踪,但如果确实如此,我就不会使用它。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

如果使用制表符控件,最终会使用同时加载的所有选项卡中的所有控件来阻止表单。我看到有10多个标签的项目,非常复杂的应用程序非常慢,难以编码。

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