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

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

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

思路:

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

===============>>#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 票数: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));

===============>>#3 票数:3

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

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

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

===============>>#4 票数:1

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

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

===============>>#5 票数:0

我还会查看WPF智能客户端软件工厂的 复合应用指南

  ask by Peter Olsson translate from so

未解决问题?本站智能推荐:

4回复

如何检查C#.net Windows应用程序中是否选择了gridview的行

我想知道如何检查gridview的行是否被选中。 我正在Windows应用程序上工作。 我想放置一个if条件,即如果选择了特定的行,则用相应的单元格值填充文本框。 我只是没有办法在if子句中给出条件。
4回复

如何强制C#.net应用程序在Windows中只运行一个实例? [重复]

可能重复: 创建单个实例应用程序的正确方法是什么? 如何强制C#.net应用程序在Windows中只运行一个实例?
1回复

如何使用Windows Service C#.net在文件中列出所有打开的应用程序?

我发现了一段用控制台应用程序编写并且可以正常工作的代码。 这是代码。 我已经修改了这样的代码... 但它在Windows服务中不起作用。 我做错了吗? 我是Windows服务的新手。 有没有人可以帮助我? 我该怎么办?
4回复

如何在Windows上使用.Net构建iphone应用程序?

是否有任何工具(模拟器,IDE)可以帮助您在Windows上使用.Net开发iphone应用程序,然后发布到iTunes?
1回复

C#Windows应用程序构建未运行

当我发布Windows窗体应用程序时,它在我开发的计算机上运行得很好。.但是当我将其放在另一台笔记本电脑上时,它不起作用。 双击.exe文件不会出现错误,并且没有任何反应。我的应用程序中有一个本地数据库。 连接字符串为“数据源=(LocalDB)\\ MSSQLLocalDB; Attach
4回复

在C#.Net的WinForms应用程序中启用对注册表的访问

默认情况下:注册表已被禁用因此我得到“您的管理员已禁用注册表编辑”在我的应用程序中,我想让用户在应用程序运行时访问注册表,并在应用程序停止时拒绝访问。 期待您的建议。
1回复

将C#.Net Framework控制台应用程序中的值输入到控制台命令中

我想使用额外的参数/ d将从.net框架控制台应用程序获得的值输入到change目录命令中。 我不知道如何实现这一目标,尤其是我不知道如何使控制台应用程序返回可在命令行界面中使用的值。 我要在cmd.exe中执行以下操作: 但是我该怎么办呢? 我的应用程序将使用argument
2回复

使用C#使.net Windows应用程序中的文本框接受其他语言

我已经开始用泰米尔语和英语开发双语Windows应用程序。 问题是我想在文本框中输入泰米尔语,我什至将文本框的字体更改为泰米尔语,但只显示空框。 我只想知道使文本框接受Tamil字体的方法。 .net Windows应用程序如何做。
1回复

使用C#.NET构建API

我们已经部署了VSTO Outlook加载项以捕获即将来临的邮件中的信息,并且我们还在同一加载项中管理扩展的电子邮件发送功能。 我们还在远程VM上部署了SQL Server数据库,并通过VPN连接到该数据库。 我们目前正在管理有关检查连接状态,连接和查询数据库,发送邮件,响应新邮件事
2回复

用于Windows开发的C ++ QT与C#.NET [关闭]

我目前正在进行一些分析瘫痪,决定哪个更适合我使用Qt框架的C ++,或者使用.NET框架来开发我目前正在设计的中小型项目的C#。 我在两种语言方面都有一点经验,在C ++中稍微多一些,但可能仍然被认为是新手。 我读过的所有信息都已经过时了(至少有几年之久)了,并且想知道是否有任何更新