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

时间:2020-03-05 18:42:36  来源:igfitidea点击:

我正在重写一个旧的应用程序,并以此为契机尝试Cand .NET开发(我通常在C中做很多插件工作)。

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

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

想法:

  • 使用一种形式并隐藏和显示控件
  • 使用一个开始窗体,然后使用带有TabControl的窗体
  • 使用六种不同的形式

解决方案

回答

选项卡式表单通常是不错的选择……但前提是我们希望用户能够在任何时候看到任何视图……听起来好像我们可能没有。

单独的表单肯定可以工作,但是我们需要确保开关看起来好像不是...如果我们确定新表单的大小和位置与旧表单相同,则更改控件后看起来就一样。

我经常使用的方法实际上是在单个"面板"控件上预先设置所有控件,然后根据需要显示和隐藏这些面板。 "面板"控件基本上是一个控件容器...我们可以移动面板,面板上的所有控件都可以相对移动。并且,如果显示或者隐藏该面板,则其上的控件也将执行相同的操作。它们非常适合这种情况。

回答

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类组成-这似乎很容易维护,而且容易出错。

回答

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

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

回答

我还将查看WPF或者Smart Client Software Factory的《复合应用程序指南》。

回答

我要做的是建立一个面板,将不同意见放在主窗体上。
然后为不同视图创建用户控件。

然后,当我想在"视图"之间切换时,将其停靠在主窗体上的面板上。代码看起来像这样。

我之所以这样,是因为我们可以重用视图,例如,如果我们想在选项卡中打开视图,则可以将用户控件停靠在选项卡页面中。
标签页而不是用户控件,从而使事情更加通用

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;
    }
}