我正在重写一个旧的应用程序,并将其作为尝试C#和.NET开发的好机会(我通常在C中做了很多插件)。
应用程序基本上是一个收集数据的计时器 它有一个开始视图和一个button来开始测量。 在测量过程中,根据用户想要查看的信息,该应用程序有五个不同的视图。
切换视图的最佳做法是什么? 从开始运行? 在运行视图之间?
思路:
创建一堆覆盖面板是一个设计时间的噩梦。
我建议使用一个选项卡控件与每个“视图”在一个单独的选项卡上,然后在运行时选择正确的选项卡。 您可以通过在表单的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));
我所做的是有一个小组,你的不同意见将在主表格上。 然后为您的不同视图创建用户控件。
然后,当我想在“视图”之间切换时,将其停靠在主窗体上的Panel上。代码看起来有点像这样。
我preffer这是因为你可以重用你的意见,就像如果你想打开一个标签中的视图,你可以停靠在标签页内的用户控制…甚至继承tabpage而不是usercontrol使一些更通用
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; } }
选项卡表单通常是很好的…但是只有当你想让用户能够随时看到任何视图时……听起来你可能不会。
单独的形式绝对有效,但是您需要确保交换机看起来不错…如果您确定新表单看起来与旧表单的大小和位置完全相同,那么对于不断变化的控件来说,它看起来就像是一样的。
我经常使用的方法实际上是预先设置个人“面板”控件上的所有控件,然后根据需要显示和隐藏这些面板。 “面板”控制基本上是一个控制容器…你可以移动面板和它的所有控制相对移动。 如果您显示或隐藏面板,其上的控件也一样。 他们对这样的情况很好。
我经常使用的方法实际上是预先设置个人“面板”控件上的所有控件,然后根据需要显示和隐藏这些面板。
而不是使每个视图在一个单一的形式内的面板,你可以使每个视图UserControl。 然后创建一个窗体并编写代码来创建并在窗体中显示正确的UserControl并从一个切换到另一个。 这将更容易维护,因为你将有一个单独的类为每个视图,而不是一个单独的Form类与6个面板,每个都有自己的控制 – 这似乎很难和错误倾向于维护。
我也将检查WPF或智能客户端软件工厂的 复合应用指南