基于C# WinForms实现多窗口通信(附完整代码)

 更新时间:2026年06月11日 09:27:35   作者:ytttr873  
这篇文章主要介绍了C# WinForms如何实现多窗口通信,涵盖事件回调、静态消息中心、委托通信等6种主流方法及示例,本文详细对比各种方法的适用场景、优缺点,并提供完整实现示例,希望对大家有所帮助

基于C# WinForms实现多窗口通信,涵盖6种主流方法及示例:

一、核心通信方式对比

方法适用场景优点缺点来源
构造函数传参初始化时传递数据简单直观,类型安全仅支持单向传递
公共属性/方法动态数据交互灵活易用破坏封装性,易引发空引用
事件回调模态对话框数据回传松耦合,支持异步通知需手动管理订阅关系
委托双向数据交互高内聚低耦合需定义统一委托类型
静态消息中心跨窗口广播消息全局可达,解耦程度高内存泄漏风险
Owner属性反向调用简单反向通信无需额外代码强类型依赖,复用性差

二、完整实现示例

1. 构造函数传参(初始化传值)

// 子窗体定义
public partial class ChildForm : Form
{
    private string _initialData;
    public ChildForm(string data)
    {
        InitializeComponent();
        _initialData = data;
        txtReceived.Text = $"初始数据: {_initialData}";
    }
}

// 主窗体调用
private void OpenChildForm()
{
    var child = new ChildForm("来自主窗体的消息");
    child.Show();
}

特点:适合一次性传递配置参数,但无法回传数据

2. 事件回调(数据回传)

// 子窗体定义
public partial class ChildForm : Form
{
    public event Action<string> DataSubmitted;
    private void btnSave_Click(object sender, EventArgs e)
    {
        DataSubmitted?.Invoke(txtInput.Text);
        this.Close();
    }
}

// 主窗体调用
private void OpenChildForm()
{
    var child = new ChildForm();
    child.DataSubmitted += result => 
    {
        lblResult.Text = $"收到回传: {result}";
    };
    child.ShowDialog();
}

特点:实现模态对话框数据回传,解耦程度高

3. 静态消息中心(全局广播)

// 消息中心实现
public static class MessageCenter
{
    public static event Action<string, string> MessageReceived;
    public static void Send(string sender, string msg)
    {
        MessageReceived?.Invoke(sender, msg);
    }
}

// 子窗体订阅
public partial class ChildForm : Form
{
    public ChildForm()
    {
        InitializeComponent();
        MessageCenter.MessageReceived += OnMessageReceived;
    }

    private void OnMessageReceived(string sender, string msg)
    {
        if(sender != this.Name) 
            txtLog.AppendText($"[{sender}]: {msg}\n");
    }
}

// 主窗体发送
MessageCenter.Send("MainForm", "系统通知:配置已更新");

特点:支持多窗口订阅,但需注意内存泄漏

4. 委托通信(双向交互)

// 定义委托
public delegate void DataUpdateHandler(string newData);

// 子窗体定义
public partial class ChildForm : Form
{
    public DataUpdateHandler OnDataUpdate;
    private void UpdateData(string data)
    {
        OnDataUpdate?.Invoke(data);
    }
}

// 主窗体绑定
var child = new ChildForm();
child.OnDataUpdate += (newData) => 
{
    this.Invoke((MethodInvoker)delegate {
        lblStatus.Text = newData;
    });
};

特点:支持双向数据流,需注意线程安全

5. 接口通信(强类型约束)

// 定义接口
public interface IDataReceiver
{
    void ProcessData(string data);
}

// 主窗体实现
public partial class MainForm : Form, IDataReceiver
{
    public void ProcessData(string data)
    {
        lstData.Items.Add(data);
    }
}

// 子窗体调用
public partial class ChildForm : Form
{
    private IDataReceiver _receiver;
    public ChildForm(IDataReceiver receiver)
    {
        _receiver = receiver;
    }
    private void SendData(string data)
    {
        _receiver?.ProcessData(data);
    }
}

特点:类型安全,适合复杂业务场景

6. Owner属性反向调用

// 主窗体打开子窗体
var child = new ChildForm();
child.Owner = this;
child.Show();

// 子窗体访问主窗体
public partial class ChildForm : Form
{
    private void UpdateMainForm()
    {
        if(Owner is MainForm main)
        {
            main.txtLog.AppendText("来自子窗体的消息");
        }
    }
}

特点:简单快捷,但破坏封装性

三、架构选型指南

场景推荐方案理由
简单配置传递构造函数传参实现简单,无副作用
模态对话框数据回传事件回调天然支持对话框生命周期
跨模块消息广播静态消息中心解耦程度高,扩展性强
复杂业务交互接口+委托组合类型安全,可维护性高
快速原型开发Owner属性反向调用开发成本低,适合临时需求

参考代码 C#实现的多窗口互相通信 www.youwenfan.com/contentcsp/122448.html

四、调试技巧

消息追踪

// 在消息中心添加日志
public static void Send(string sender, string msg)
{
    Debug.WriteLine($"[{DateTime.Now:HH:mm:ss}] {sender}: {msg}");
    MessageReceived?.Invoke(sender, msg);
}

内存泄漏检测

// 使用WeakEventManager避免内存泄漏
WeakEventManager messageManager = new WeakEventManager();
messageManager.AddHandler(this, nameof(MessageReceived), OnMessageReceived);

线程安全验证

// 使用Invoke确保UI线程安全
MessageCenter.MessageReceived += (_, msg) => 
{
    this.Invoke((MethodInvoker)delegate {
        txtLog.AppendText(msg);
    });
};

到此这篇关于基于C# WinForms实现多窗口通信(附完整代码)的文章就介绍到这了,更多相关C# WinForms多窗口通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#编程实现带有Aero效果的窗体示例

    C#编程实现带有Aero效果的窗体示例

    这篇文章主要介绍了C#编程实现带有Aero效果的窗体,涉及C#调用动态链接库针对窗体属性的相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • C#使用CallContext缓存线程数据

    C#使用CallContext缓存线程数据

    这篇文章介绍了C#使用CallContext缓存线程数据的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 浅解关于C#多线程的介绍

    浅解关于C#多线程的介绍

    本篇文章小编将为大家介绍,浅解关于C#的多线程,有需要的朋友可以参考一下
    2013-04-04
  • 在c#中把字符串转为变量名并获取变量值的小例子

    在c#中把字符串转为变量名并获取变量值的小例子

    这篇文章介绍了在c#中把字符串转为变量名并获取变量值的小例子,有需要的朋友可以参考一下
    2013-09-09
  • C#实现访问远程硬盘的图文教程

    C#实现访问远程硬盘的图文教程

    在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件,这次我们将给出一个完整的Demo来演示远程硬盘要怎么实现,需要的朋友可以参考下
    2025-05-05
  • C#使用Spire.Doc for .NET轻松给Word文档添加页码

    C#使用Spire.Doc for .NET轻松给Word文档添加页码

    在C#项目中,自动为 Word 文档添加页码是常见需求,尤其在生成报告、合同或技术文档时,手动编辑既耗时又容易出错,本文聚焦 C# Word 文档页码添加的实现方案,推荐使用 Spire.Doc for .NET,需要的朋友可以参考下
    2026-03-03
  • NGUI实现滑动翻页效果实例代码

    NGUI实现滑动翻页效果实例代码

    本文通过一段实例代码给大家介绍NGUI实现滑动翻页效果,代码简单易懂,对ngui 滑动翻页相关知识感兴趣的朋友一起学习吧
    2016-04-04
  • C#实现Word与TXT文本格式互转的操作代码

    C#实现Word与TXT文本格式互转的操作代码

    在现代办公自动化和数据处理流程中,经常需要在不同的文档格式之间进行转换,将Word文档(.doc, .docx)转换为纯文本(.txt)可以方便地提取文字内容用于数据分析、内容索引或简化分享,本文将分享如何使用Spire.Doc for .NET实现TXT文本文件与Word文档之间的双向转换
    2025-09-09
  • winform实现拖动文件到窗体上的方法

    winform实现拖动文件到窗体上的方法

    这篇文章主要介绍了winform实现拖动文件到窗体上的方法,以实例分析了C#中WinForm操作窗体及文件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • C#实现WebAPI接口安全加密的具体方案

    C#实现WebAPI接口安全加密的具体方案

    在项目开发过程中,接口的安全性往往是一个容易被忽视但极其关键的环节,本文介绍了一套实际项目中已落地的 Web API 安全加密方案,涵盖了 SHA256 加签、RSA 非对称加密、AES 对称加密 以及相关数据格式转换等内容,需要的朋友可以参考下
    2025-06-06

最新评论