WinForms:在同一窗口中显示新表单

时间:2014-02-09 18:36:23

标签: c# winforms

我是一位经验丰富的MVC开发人员,我为我工作的公司首次尝试内部WinForms制作应用程序。

当我的应用程序首次加载时,它会加载一个LoginForm(它继承自BaseForm以设置窗口大小,NotifyIcon属性等)。成功登录后,我想保留相同的窗口,但用新屏幕替换内容。这看起来非常基本,但即使在搜索了如何做到这一点之后,它也没有像我期望的那样工作。

我尝试过这样的代码:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Window1 W1 = new Window1();
    W1.Show();
    this.Close();    
}

但是,当然,这会打开一个新窗口并关闭当前的窗口,这不是我想要的。我想保留相同的父窗口,只需替换内容。

我有两个问题(它们有点相关):

1)如何使用新窗体替换父窗口内容而不是在新窗口中打开它?现在我的表单是在单独的WinForms控件(LoginForm和ChatForm)中。我是否需要以不同的方式构建我的项目才能实现这一目标?

2)ChatForm包含一个带有按钮的SplitContainer(见下面的截图)。单击每个按钮时,右侧窗格的内容应更改。这些最好用UserControls表示(一个用于ChatQueue,一个用于ChatWindow,传入参数让它知道我们正在聊天的人)?

试图了解基本的WinForms项目架构以及不同内容屏幕之间的导航。

enter image description here

4 个答案:

答案 0 :(得分:2)

您可以使用Dock = DockStyle.Fill将第一个" Window"的控件放在面板上,而不是直接放在表单上。第二个" Window"控件在另一个类似的Dock面板上。两个小组都在表格上。然后是panel1.SendToBack();。 (或panel2.BringToFront();。)

或者你可以:

Controls.Remove(panel1);
Controls.Add(panel2);

如果你更愿意这样做。

答案 1 :(得分:1)

1)是的,您必须以不同的方式构建项目。

将表单视为一个父表单。所有其他表单(登录,聊天)需要设计为用户控件。然后你必须将所有控件放在父窗体中,并且必须以编程方式管理这些控件的顺序,即Login应该在Chat等之前。然后引入一个类似于NavigationController的类,它将负责管理控件的顺序,即隐藏登录和显示聊天等。类可以在内部维护一个堆栈来管理转换。

2)是的,你是对的。使用UserControls的相同概念适用于此处!

确实,MVC开发人员在使用WinForms时遇到了非常艰难的时期。但好消息是,您可以通过手动实现MVC的理论概念在WinForms中完成类似的设计。

答案 2 :(得分:0)

我强烈建议您创建一个登录用户控件和聊天用户控件。

要与网页进行比较,窗口就像一个页面......如果你想保持酷酷的ajax外观并且感觉你创建一个单页应用程序并在其中粘贴不同的控件,你就无法在没有刷新的情况下切换页面。

对于体系结构,不建议将所有控件放在窗口级别上或使用布局控件(面板)来创建逻辑分隔。

构建良好的用户控件租用是winforms应用程序的标准架构。

祝你好运。

答案 3 :(得分:0)

为了达到这个效果,我会使用TabControl布置右侧,只需根据点击的按钮切换标签页。

如果您愿意,还有一些方法可以隐藏标签,这可以模拟交换Panel控件,但没有丑陋的Controls.Add()调用。