奇怪的问题,但是让我感到困惑的一个问题。在我们有终端和DOS的过去,应用程序通常只有一个“窗口”,这是一个全屏幕。当人们切换功能时,没有打开新窗口的概念,而是覆盖了主窗口的内容。所以只有一个主窗口,但是在其中呈现了多个屏幕。
如何在现代应用程序中创建类似的东西,WinForms或WPF?
似乎有两种方法:
我想知道是否有更好的方法?基本上是这样的东西:“看,我不关心边框样式/图标或主菜单条等东西。我想要的只是你将这个屏幕渲染到这个区域”。有点像ASP.net主页,其中实际页面只定义被渲染到占位符的内容。
是否有一些正确的机制可以做类似的事情?
或整个方法有问题吗?
答案 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多个标签的项目,非常复杂的应用程序非常慢,难以编码。
我希望你会发现这个答案很有用!