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

11

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

该应用程序基本上是一个收集数据的计时器。它有一个开始视图,其中包含一个按钮来启动测量。在测量过程中,应用程序具有五个不同的视图,取决于用户希望看到的信息。

在视图之间切换的最佳实践是什么? 从开始到运行? 在运行视图之间?

想法:

  • 使用一个表单并隐藏和显示控件
  • 使用一个起始表单,然后使用TabControl表单
  • 使用六个单独的表单
5个回答

8
创建一堆重叠的面板是设计时的噩梦。
我建议使用选项卡控件,每个“视图”都在单独的选项卡上,然后在运行时选择正确的选项卡。您可以通过在窗体的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));

如果TabControl被'fill'停靠在另一个容器内,并且如果您调整该容器的大小,使用上述代码将不再使选项卡控件填充到父容器中。顺便提一下。谢谢 - SomethingBetter

7
我所做的是在主窗体上放置一个面板,用于容纳不同视图。然后为每个视图创建用户控件。
当我要在不同的视图之间切换时,将其停靠到主窗体上的面板中。代码看起来有点像这样。
我更喜欢这种方法,因为您可以重复使用您的视图,例如,如果您想在选项卡中打开视图,则可以将用户控件停靠在选项卡页内。或者甚至继承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;
    }
}

我喜欢它,只是需要更正 != 应该改为 ==,即 if (viewB != null) 应该改为 if (viewB == null)。 - Usman

3
选项卡表单通常很好用...但只有在您希望用户随时查看任何视图时才使用...而且听起来您可能不需要这样。
单独的表单绝对可行,但您需要确保切换是无缝的...如果您确保新表单的大小和位置与旧表单完全相同,则在更改控件时它将看起来相同。
我经常使用的方法实际上是预先设置所有控件的个别“面板”控件,然后根据需要显示和隐藏这些面板。 “面板”控件基本上是一个控件容器...您可以移动面板,其上的所有控件相对移动。 如果您显示或隐藏面板,则其中的控件也会这样做。 对于这种情况非常适用。

1
我经常使用的方法是预先在单独的“面板”控件上设置所有控件,然后根据需要显示和隐藏这些面板。
与将每个视图作为单个表单中的面板不同,您可以将每个视图制作为UserControl。然后创建一个单一的表单并编写代码来创建和显示正确的UserControl在表单中,并切换到下一个。这样更容易维护,因为您将为每个视图拥有一个单独的类,而不是一个带有6个面板的单个Form类,每个面板都有自己的控件--这似乎难以维护且容易出错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接