Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WinForms:在同一窗口中显示新窗体_C#_Winforms - Fatal编程技术网

C# WinForms:在同一窗口中显示新窗体

C# WinForms:在同一窗口中显示新窗体,c#,winforms,C#,Winforms,我是一名经验丰富的MVC开发人员,第一次尝试为我工作的公司开发内部WinForms生产应用程序 当我的应用程序第一次加载时,它会加载一个LoginForm(它从BaseForm继承来设置窗口大小、NotifyIcon属性等)。成功登录后,我希望保留相同的窗口,但用新屏幕替换内容。这看起来很基本,但即使在搜索了如何做到这一点之后,没有一个像我期望的那样工作 我尝试过这样的代码: private void Button_Click(object sender, RoutedEventArgs e)

我是一名经验丰富的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,左侧有按钮(参见下面的屏幕截图)。单击每个按钮时,右侧窗格的内容应发生更改。用户控件(一个用于聊天队列,一个用于聊天窗口,传递参数让它知道我们正在与哪个人聊天)最能代表这些功能吗

我只是想了解一下基本的WinForms项目架构和不同内容屏幕之间的导航

您可以将第一个“窗口”的控件放在面板上,使用
Dock=DockStyle。填充
而不是直接在表单上。第二个“窗口”的控件位于另一个类似的
Dock
ed面板上。两个面板都在表格上。然后
panel1.SendToBack()。(或
panel2.BringToFront();

或者你可以:

Controls.Remove(panel1);
Controls.Add(panel2);
如果您愿意这样做。

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

或者你可以:

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

如果您愿意的话。

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

与web相比,窗口就像一个页面。。。如果不刷新页面,就无法切换页面。因此,如果希望保持ajax的酷炫外观,可以创建一个单页面应用程序,并在其中粘贴不同的控件

至于架构,不建议将所有控件放置在窗口级别或使用布局控件(面板)创建逻辑分隔

构建良好的用户控件租用机制是winforms应用程序的标准体系结构


祝你好运。

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

与web相比,窗口就像一个页面。。。如果不刷新页面,就无法切换页面。因此,如果希望保持ajax的酷炫外观,可以创建一个单页面应用程序,并在其中粘贴不同的控件

至于架构,不建议将所有控件放置在窗口级别或使用布局控件(面板)创建逻辑分隔

构建良好的用户控件租用机制是winforms应用程序的标准体系结构

祝你好运。

1)是的,你必须以不同的方式设计项目

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

2) 是的,你说得对。使用UserControls的相同概念也适用于这里

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

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

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

2) 是的,你说得对。使用UserControls的相同概念也适用于这里


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

为了获得这种效果,我将使用
TabControl
布局右侧,并根据单击的按钮简单地切换选项卡页面


如果您愿意,也有隐藏选项卡的方法,这将模拟交换
面板
控件,但没有丑陋的
控件。Add()
调用。

为了获得这种效果,我将使用
选项卡控件
来布置右侧,并根据单击的按钮简单地切换选项卡页面


如果您愿意,也有隐藏选项卡的方法,可以模拟交换
面板
控件,但不使用丑陋的
控件。Add()
调用。

我的建议是清除所有控件(或您希望清除的控件),然后在同一表单上添加其他控件。我的建议是清除所有