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

Posted

技术标签:

【中文标题】构建具有多个视图的 C# .NET windows 应用程序【英文标题】:Building C# .NET windows application with multiple views 【发布时间】:2010-09-06 17:05:14 【问题描述】:

我正在重写一个旧应用程序,并借此机会尝试 C# 和 .NET 开发(我通常用 C 语言做很多插件)。

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

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

想法:

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

【问题讨论】:

【参考方案1】:

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

我建议在单独的选项卡上使用每个“视图”的选项卡控件,然后在运行时选择正确的选项卡。您可以通过在表单的 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' 停靠在另一个容器中,并且如果您调整该容器的大小,如果您使用上述代码,则选项卡控件不再填充停靠到父容器。仅供参考。谢谢【参考方案2】:

我所做的是有一个面板,您的不同观点将放在主窗体上。 然后为您的不同视图创建用户控件。

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

我喜欢这个,因为您可以重复使用您的视图,例如,如果您想在选项卡中打开一个视图,您可以将您的用户控件停靠在选项卡页面中......甚至从 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) 应该是 viewB== null。【参考方案3】:

标签式表单通常很好...但前提是您希望用户能够随时看到任何视图...听起来您可能不会。

单独的表单确实有效,但是您需要确保开关是无缝的...如果您确保新表单的大小和位置与旧表单完全相同,那么它看起来与更改控件。

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

我也会查看Composite Application Guidance for WPF 或Smart Client Software Factory

【讨论】:

以上是关于构建具有多个视图的 C# .NET windows 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何构建具有多个视图的复杂 Web UI 应用程序?

高效地构建具有多个视图的大型 React.js 应用程序

在 C# 中创建具有多个屏幕的 Windows Mobile 应用程序的最佳方法是啥

C# .net windows服务启动多个服务 ServiceBase

创建一个应用程序,对同一个 Web 应用程序具有多个视图,但使用不同的凭据?

在 Windows 10 上具有多个虚拟桌面的 C# UI 自动化 API