使用多个视图构建C#.NET Windows应用程序
我正在重写一个旧的应用程序,并以此为契机尝试Cand .NET开发(我通常在C中做很多插件工作)。
该应用程序基本上是一个收集数据的计时器。它具有一个带有按钮的开始视图以开始测量。在测量过程中,根据用户想要查看的信息,该应用程序具有五个不同的视图。
在视图之间进行切换的最佳实践是什么?
从开始到运行?
在运行视图之间?
想法:
- 使用一种形式并隐藏和显示控件
- 使用一个开始窗体,然后使用带有TabControl的窗体
- 使用六种不同的形式
解决方案
回答
选项卡式表单通常是不错的选择……但前提是我们希望用户能够在任何时候看到任何视图……听起来好像我们可能没有。
单独的表单肯定可以工作,但是我们需要确保开关看起来好像不是...如果我们确定新表单的大小和位置与旧表单相同,则更改控件后看起来就一样。
我经常使用的方法实际上是在单个"面板"控件上预先设置所有控件,然后根据需要显示和隐藏这些面板。 "面板"控件基本上是一个控件容器...我们可以移动面板,面板上的所有控件都可以相对移动。并且,如果显示或者隐藏该面板,则其上的控件也将执行相同的操作。它们非常适合这种情况。
回答
The method I often use is actually to pre-setup all my controls on individual "Panel" controls and then show and hide these panels as I need them.
可以使每个视图成为一个UserControl,而不是使每个视图成为单个表单中的面板。然后创建一个表单并编写代码以在表单中创建并显示正确的UserControl并从一个切换到下一个。这将更易于维护,因为我们将为每个视图拥有一个单独的类,而不是由具有6个面板且每个面板都有自己的控件的单个Form类组成-这似乎很容易维护,而且容易出错。
回答
创建一堆重叠的面板是设计时的噩梦。
我建议对每个"视图"使用单独的选项卡上的选项卡控件,然后在运行时选择正确的选项卡。我们可以通过在表单的Load事件中添加如下所示的内容来避免显示选项卡标题:
tabControl1.Top = tabControl1.Top - tabControl1.ItemSize.Height; tabControl1.Height = tabControl1.Height + tabControl1.ItemSize.Height; tabControl1.Region = new Region(new RectangleF(tabPage1.Left, tabPage1.Top, tabPage1.Width, tabPage1.Height + tabControl1.ItemSize.Height));
回答
我还将查看WPF或者Smart Client Software Factory的《复合应用程序指南》。
回答
我要做的是建立一个面板,将不同意见放在主窗体上。
然后为不同视图创建用户控件。
然后,当我想在"视图"之间切换时,将其停靠在主窗体上的面板上。代码看起来像这样。
我之所以这样,是因为我们可以重用视图,例如,如果我们想在选项卡中打开视图,则可以将用户控件停靠在选项卡页面中。
标签页而不是用户控件,从而使事情更加通用
public partial class MainForm : Form { public enum FormViews { A, B } private MyViewA viewA; //user control with view a on it private MyViewB viewB; //user control with view b on it private FormViews _formView; public FormViews FormView { get { return _formView; } set { _formView = value; OnFormViewChanged(_formView); } } protected virtual void OnFormViewChanged(FormViews view) { //contentPanel is just a System.Windows.Forms.Panel docked to fill the form switch (view) { case FormViews.A: if (viewA != null) viewA = new MyViewA(); //extension method, you could use a static function. this.contentPanel.DockControl(viewA); break; case FormViews.B: if (viewB != null) viewB = new MyViewB(); this.contentPanel.DockControl(viewB); break; } } public MainForm() { InitializeComponent(); FormView = FormViews.A; //simply change views like this } } public static class PanelExtensions { public static void DockControl(this Panel thisControl, Control controlToDock) { thisControl.Controls.Clear(); thisControl.Controls.Add(controlToDock); controlToDock.Dock = DockStyle.Fill; } }