我是一位经验丰富的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项目架构以及不同内容屏幕之间的导航。
答案 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()
调用。