我正在重写一个旧应用程序,并以此作为尝试 C# 和 .NET 开发的好机会(我通常在 C 中做很多插件的东西)。
该应用程序基本上是一个收集数据的计时器。它有一个带有按钮的开始视图,用于开始测量。在测量过程中,应用程序有五种不同的视图,具体取决于用户想要查看的信息。
在视图之间切换的最佳做法是什么?从开始到跑步?在运行视图之间?
想法:
- 使用一个表单并隐藏和显示控件
- 使用一个开始表单,然后使用一个带有 TabControl 的表单
- 使用六种不同的表格
创建一堆重叠的面板是设计时的噩梦。
我建议在单独的选项卡上使用带有每个“视图”的选项卡控件,然后在运行时选择正确的选项卡。您可以通过在表单的 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));
我所做的是有一个面板,您的不同观点将放在主窗体上。然后为您的不同视图创建用户控件。
然后,当我想在“视图”之间切换时,您将其停靠在主窗体上的面板上。代码看起来有点像这样。
我喜欢这个,因为您可以重用您的视图,例如,如果您想在选项卡中打开一个视图,您可以将您的用户控件停靠在选项卡页内.. 甚至从选项卡页而不是用户控件继承以使事情更通用
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 并从一个切换到下一个。这将更容易维护,因为您将为每个视图拥有一个单独的类,而不是一个具有 6 个面板的单个 Form 类,每个面板都有自己的控件——这似乎很难维护并且容易出错。