构建具有多个视图的C#.NET Windows应用程序

时间:2008-08-24 16:31:26

标签: c# .net windows

我正在重写一个旧的应用程序并将其作为尝试C#和.NET开发的好机会(我通常在C中做很多插件)。

该应用程序基本上是一个收集数据的计时器。它有一个带有按钮的开始视图,用于开始测量。在测量过程中,应用程序有五种不同的视图,具体取决于用户想要查看的信息。

在视图之间切换的最佳做法是什么? 从开始到跑步? 在运行的视图之间?

思路:

  • 使用一个表单并隐藏和显示控件
  • 使用一个开始表单,然后使用带TabControl的表单
  • 使用六种不同的表格

5 个答案:

答案 0 :(得分:7)

创建一堆重叠的面板是设计时的噩梦。

我建议在单独的选项卡上使用每个“视图”的选项卡控件,然后在运行时选择正确的选项卡。您可以通过在表单的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));

答案 1 :(得分:7)

我所做的是设置一个面板,您的不同视图将位于主窗体上。 然后为您的不同视图创建用户控件。

然后,当我想在'view'之间切换时,你将它停靠在主窗体上的Panel ..代码看起来有点像这样。

我喜欢这个,因为您可以重复使用您的视图,就像您想在选项卡中打开视图一样,您可以将用户控件停靠在标签页中...甚至可以继承自 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;
    }
}

答案 2 :(得分:3)

选项卡式表单通常都很好...但只有当您希望用户能够随时查看任何视图时......听起来您可能没有。

单独的表单肯定有效,但你需要确保开关是无缝的...如果你确定新表单看起来与旧表单的大小和位置相同,它看起来就像是相同的改变控制。

我经常使用的方法实际上是在个别“Panel”控件上预先设置我的所有控件,然后在需要时显示和隐藏这些面板。 “面板”控件基本上是一个控件容器......您可以移动面板,其上的所有控件都相对移动。如果您显示或隐藏面板,它上面的控件也会这样做。它们非常适合这种情况。

答案 3 :(得分:1)

  

我经常使用的方法实际上是   预先设置我的所有控件   单个“面板”控件然后   根据需要显示和隐藏这些面板   它们。

您可以将每个视图设置为UserControl,而不是将每个视图设置为单个表单中的面板。然后创建一个表单并编写代码以在表单中创建和显示正确的UserControl并从一个切换到下一个。这将更容易维护,因为每个视图都有一个单独的类,而不是一个Form类,其中6个面板各有自己的控件 - 这看起来很难并且容易出错。

答案 4 :(得分:0)