、首先,我们添加一个主界面窗体,命名为MainForm,该窗体IsMdiContainer设置为True,也就是设置为多文档窗体格式。拖拉布局控件"WeifenLuo.WinFormsUI.Docking.DockPanel"到主窗体MainForm中,并

本文介绍如何使用WeifenLuo.WinFormsUI.Docking组件创建一个多文档界面(MDI)应用程序。主要内容包括设置主窗体、创建工具窗口及业务窗口,并展示了如何通过代码控制窗口的显示与关闭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

、首先,我们添加一个主界面窗体,命名为MainForm,该窗体IsMdiContainer设置为True,也就是设置为多文档窗体格式。拖拉布局控件"WeifenLuo.WinFormsUI.Docking.DockPanel"到主窗体MainForm中,并设置下面几个属性:

Dock为Fill、DocumentStyle为DockingMdi、RightToLeftLayout为True。

这几个属性的意思应该不难,Dock就是 覆盖整个MDI窗体的区域,DocumentStyle为多文档类型、RightToLeftLayout是指新打开的窗口都停靠在右边区域。

我们看看设计界面视图如下所示。

 

2、主界面其实基本上就可以了,另外我们看到“送水管理系统网络版”的界面中有一个左边的工具栏,它其实也是在一个停靠的窗体中的,我们增加一个窗体用来承载相关的工具快捷键按钮展示。命名为MainToolWindow的窗体,继承自WeifenLuo.WinFormsUI.Docking.DockContent.

其中的“HideOnClose”属性很重要,该属性一般设置为True,就是指你关闭窗口时,窗体只是隐藏而不是真的关闭。

左边的窗口MainToolWindow实现停靠的代码是在MainForm的构造函数或者Load函数中加载即可。

mainToolWin.Show(this.dockPanel, DockState.DockLeft);

 3、对于工具窗口我们已经完成了,但是主业务窗口还没有做,也就是下面的部分内容。

为了方便,我们定义一个基类窗体,命名为BaseForm,继承自DockContent,如下所示

public class BaseForm : DockContent

然后每个业务窗口继承BaseForm即可。

4、剩下的内容就是如何在主窗体MainForm中展示相关的业务窗口了,展示的代码如下所示

     public   partial   class  MainForm : Form
    {
        
#region  属性字段

         
private  MainToolWindow mainToolWin  =   new  MainToolWindow();
        
private  FrmProduct frmProduct  =   new  FrmProduct();
        
private  FrmCustomer frmCustomer  =   new  FrmCustomer();
        
private  FrmOrder frmOrder  =   new  FrmOrder();
        
private  FrmStock frmStock  =   new  FrmStock();
        
private  FrmComingCall frmComingCall  =   new  FrmComingCall();
        
private  FrmDeliving frmDeliving  =   new  FrmDeliving();
        
private  FrmTicketHistory frmHistory  =   new  FrmTicketHistory(); 

        
#endregion

        
public  MainForm()
        {
            InitializeComponent();

            SplashScreen.Splasher.Status 
=   " 正在展示相关的内容 " ;
            System.Threading.Thread.Sleep(
100 );

            mainToolWin.Show(
this .dockPanel, DockState.DockLeft);
            frmComingCall.Show(
this .dockPanel);
            frmDeliving.Show(
this .dockPanel);
            frmHistory.Show(
this .dockPanel);
            frmStock.Show(
this .dockPanel);
            frmProduct.Show(
this .dockPanel);
            frmCustomer.Show(
this .dockPanel);
            frmOrder.Show(
this .dockPanel);

            SplashScreen.Splasher.Status 
=   " 初始化完毕 " ;
            System.Threading.Thread.Sleep(
50 );

            SplashScreen.Splasher.Close();
        }

 

5.下面贴出基本窗口的基本操作事件函数

         private   void  menu_Window_CloseAll_Click( object  sender, EventArgs e)
        {
            CloseAllDocuments();
        }

        
private   void  menu_Window_CloseOther_Click( object  sender, EventArgs e)
        {
            
if  (dockPanel.DocumentStyle  ==  DocumentStyle.SystemMdi)
            {
                Form activeMdi 
=  ActiveMdiChild;
                
foreach  (Form form  in  MdiChildren)
                {
                    
if  (form  !=  activeMdi)
                    {
                        form.Close();
                    }
                }
            }
            
else
            {
                
foreach  (IDockContent document  in  dockPanel.DocumentsToArray())
                {
                    
if  ( ! document.DockHandler.IsActivated)
                    {
                        document.DockHandler.Close();
                    }
                }
            }
        }

        
private  DockContent FindDocument( string  text)
        {
            
if  (dockPanel.DocumentStyle  ==  DocumentStyle.SystemMdi)
            {
                
foreach  (Form form  in  MdiChildren)
                {
                    
if  (form.Text  ==  text)
                    {
                        
return  form  as  DockContent;
                    }
                }

                
return   null ;
            }
            
else
            {
                
foreach  (DockContent content  in  dockPanel.Documents)
                {
                    
if  (content.DockHandler.TabText  ==  text)
                    {
                        
return  content;
                    }
                }

                
return   null ;
            }
        }

        
public  DockContent ShowContent( string  caption, Type formType)
        {
            DockContent frm 
=  FindDocument(caption);
            
if  (frm  ==   null )
            {
                frm 
=  ChildWinManagement.LoadMdiForm(Portal.gc.MainDialog, formType)  as  DockContent;
            }

            frm.Show(
this .dockPanel);
            frm.BringToFront();
            
return  frm;
        }

        
public   void  CloseAllDocuments()
        {
            
if  (dockPanel.DocumentStyle  ==  DocumentStyle.SystemMdi)
            {
                
foreach  (Form form  in  MdiChildren)
                {
                    form.Close();
                }
            }
            
else
            {
                IDockContent[] documents 
=  dockPanel.DocumentsToArray();
                
foreach  (IDockContent content  in  documents)
                {
                    content.DockHandler.Close();
                }
            }
        } 

 

最后呈上该控件文件,大家可以下来玩玩。

<think>好的,用户现在的问题是:如何在WinForms中点击一个按钮,打开另一个窗体关闭当前窗体。之前已经给出过登录口的实现步骤,其中第三步的验证逻辑里确实有相关的代码示例。现在用户可能遇到了具体的问题,或者需要更详细的解释。 首先,我需要确认用户是否已经按照之前的指南操作过,可能遇到了问题,或者需要更详细的步骤。比如,用户可能在点击按钮后,新窗体没有正确显示,或者当前窗体没有关闭,或者程序退出了。这些常见的问题需要被预见到。 接下来,我需要回顾之前的代码示例,确保给出的解决方案是正确的。在之前的回答中,当验证通过时,使用Hide()方法隐藏当前窗体显示主窗体。但用户现在提到的是关闭当前窗体,而不仅仅是隐藏。所以原来的代码可能存在问题,因为如果关闭登录窗体,而主窗体是主线程的启动窗体,那么应用程序可能会退出。因此需要调整代码,确保主窗体成为新的主口。 可能用户没有正确设置主窗体,导致关闭登录窗体后程序结束。因此,需要指导用户如何在Program.cs中修改启动窗体,确保登录窗体先启动,然后切换到主窗体后关闭登录窗体,而应用程序继续运行。 另外,用户可能对事件处理流程不太清楚,比如按钮点击事件的处理方法是否正确绑定,是否在窗体关闭时释放资源等。需要详细说明每个步骤,避免遗漏关键点。 还需要考虑可能的异常情况,比如如何在关闭当前窗体时确保资源释放,或者是否需要使用Application.Run()来启动新窗体。不过,在WinForms中,通常主窗体关闭会导致应用结束,所以必须正确设置主窗体。 总结来说,用户的真实需求是如何正确地在点击按钮后切换窗体,同时关闭当前窗体而不终止应用程序。这需要调整启动逻辑,确保主窗体在登录成功后作为主线程的新入口点运行。</think>以下是在WinForms中实现窗体切换的标准方法及详细说明: 📌 核心代码实现(分三步): 1️⃣ 创建新窗体实例 ```csharp // 创建新窗体实例 MainForm mainForm = new MainForm(); // 显示新窗体 mainForm.Show(); ``` 2️⃣ 关闭当前窗体 ```csharp // 关闭当前窗体(方法1) this.Close(); // 或完全释放资源(方法2) this.Dispose(); ``` 3️⃣ 完整按钮事件处理 ```csharp private void btnOpenForm_Click(object sender, EventArgs e) { // 创建新窗体实例 Form2 newForm = new Form2(); // 显示新窗体 newForm.Show(); // 关闭当前窗体 this.Close(); } ``` ⚠️ 常见问题解决方案: 1️⃣ 程序意外退出问题: ```csharp // 修改Program.cs启动方 static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // 先显示登录窗体 using (var loginForm = new LoginForm()) { if (loginForm.ShowDialog() == DialogResult.OK) { // 登录成功后启动主窗体 Application.Run(new MainForm()); } } } } ``` 2️⃣ 窗体关闭顺序优化: ```csharp // 使用事件订阅确保窗体关闭顺序 private void btnSwitch_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.FormClosed += (s, args) => this.Close(); this.Hide(); form2.Show(); } ``` 3️⃣ 模态对话框实现方: ```csharp // 使用ShowDialog方法 private void btnModal_Click(object sender, EventArgs e) { using (Form2 modalForm = new Form2()) { if (modalForm.ShowDialog() == DialogResult.OK) { // 处理返回结果 } } this.Close(); } ``` 🔧 进阶技巧: 1. 窗体传参方法: ```csharp Form2 form2 = new Form2(userName); form2.Show(); this.Close(); ``` 2.窗体通信: ```csharp // 在主窗体定义公共属性 public partial class MainForm : Form { public string ReceivedData { get; set; } } ``` 3. 关闭前确认: ```csharp protected override void OnFormClosing(FormClosingEventArgs e) { if (MessageBox.Show("确认关闭?", "提示", MessageBoxButtons.YesNo) == DialogResult.No) { e.Cancel = true; } } ``` 📝 最佳实践建议: 1. 使用`using`语句确保资源释放 2. 重要操作前添加确认对话框 3. 窗体切换时考虑数据持久化 4. 使用`Hide()`代替`Close()`实现窗体复用 5. 多文档界面(MDI)使用`IsMdiContainer`属性 💡 工作流程示意图: 当前窗体 → 按钮点击事件 → 创建新窗体实例 → 显示新窗体 → 关闭/隐藏当前窗体 → 应用程序消息循环继续运行 通过以上实现方,可以确保窗体切换时应用程序保持运行,同时遵守Windows窗体应用程序的生命周期管理规范。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值