我正在重写一个旧的应用程序,并以此为契机尝试C#和.NET开发(我通常在C中做很多插件工作)。
该应用程序基本上是一个收集数据的计时器。 它具有一个带有按钮的开始视图以开始测量。 在测量期间,根据用户想要查看的信息,该应用程序具有五个不同的视图。
在视图之间进行切换的最佳实践是什么?
从开始到运行?
在运行视图之间?
想法:
-
使用一种形式并隐藏和显示控件
-
使用一个开始窗体,然后使用带有TabControl的窗体
-
使用六种不同的形式
创建一堆重叠的面板是设计时的噩梦。
我建议对每个"视图"使用单独的选项卡上的选项卡控件,然后在运行时选择正确的选项卡。您可以通过在表单的Load事件中添加如下内容来避免显示标签头:
1 2 3
| 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)); |
我要做的是建立一个面板,将您的不同意见放在主窗体上。
然后为您的不同视图创建用户控件。
然后,当我想在"视图"之间切换时,将其停靠在主窗体上的面板上。代码看起来像这样。
我之所以这样,是因为您可以重用视图,例如,如果您想在选项卡中打开视图,则可以将用户控件停靠在选项卡页面中。
标签页而不是用户控件,从而使事情更加通用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| 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;
}
} |
选项卡式表单通常很好...但是仅当您希望用户能够在任何时候看到任何视图时……听起来好像您可能没有。
单独的表格肯定可以工作,但是您需要确保开关看起来好像不是很……如果您确定新表格的大小和位置与旧表格相同,则更改控件的外观和效果相同。
我经常使用的方法实际上是在单个"面板"控件上预设置所有控件,然后根据需要显示和隐藏这些面板。"面板"控件基本上是一个控件容器...您可以移动面板,面板上的所有控件都可以相对移动。而且,如果显示或隐藏该面板,则其控件也将执行相同的操作。它们非常适合这种情况。
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类,每个面板都有自己的控件-这似乎很困难且容易出错。
我还将查看WPF或Smart Client Software Factory的复合应用程序指南。