天天看点

C#委托实现WPF主窗体向多个子窗体广播传递消息

窗体之间传递消息并不罕见,实现方式各有不同,今天主要记录下C#当中通过委托(Delegate)实现主窗体向多个子窗体发送消息的简单示例。

一、原理分析

C#委托实现WPF主窗体向多个子窗体广播传递消息

壹般来说,壹个应用程序是由若干个窗体构成的,通过适当的交互逻辑在不同窗体之间建立起联系。当主窗体不方便直接调用子窗体内部的方法时,可通过委托的方式来间接调用。只需要子窗体定义壹个满足主窗体声明的委托要求的方法即可。然后在主窗体实例化从窗体,并将委托变量和从窗体方法关联起来,再调用委托来完成!

二、代码实现

1、主窗体

主窗体当中放置两个按钮为计数和重置,按钮事件分别为ClickMe和ResetMe,在此只附上C#代码,XAML布局代码略。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace DelegateMainFormToSubFormMessage
{
    //声明委托
    public delegate void MessageShow(string Counter);
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        //创建委托对象
        public MessageShow messageShow;
        private int counter = 0;
        public MainWindow()
        {
            InitializeComponent();
            //显示子窗体
            SubFormA subFormA = new SubFormA();
            SubFormB subFormB = new SubFormB();
            SubFormC subFormC = new SubFormC();
            subFormA.Show();
            subFormB.Show();
            subFormC.Show();
            this.messageShow += subFormA.Receiver;
            this.messageShow += subFormB.Receiver;
            this.messageShow += subFormC.Receiver;
        }
        //计数按钮事件
        private void ClickMe(object sender, RoutedEventArgs e)
        {
            this.counter++;
            this.messageShow.Invoke(counter.ToString());
        }
        //重置按钮事件
        private void ResetMe(object sender, RoutedEventArgs e)
        {
            this.counter = 0;
            this.messageShow.Invoke("0");
        }
    }

}

           
2、从窗体

三个子窗体分别为SubFormA、SubFormB、SubFormC,对应的Label控件名称分别为SubFormALabel、SubFormBLabel、SubFormCLabel,都 拥有和委托要求相匹配的Receiver方法(无返回值,方法要求传入壹个string类型参数)如下:

//SubFormA
        public void Receiver(string Counter)
        {
            this.SubFormALabel.Content = Counter;
        }
           
//SubFormB
        public void Receiver(string Counter)
        {
            this.SubFormBLabel.Content = Counter;
        }
           
//SubFormC
        public void Receiver(string Counter)
        {
            this.SubFormCLabel.Content = Counter;
        }
           

主窗体构造函数当中实例化三个从窗体并显示,点击“计数”按钮,三个从窗体的Label控件接收从主窗体传递过来的值并同步显示;主窗体点击“重置”按钮的时候,将三个从窗体的Label控件的内容设置为字符串“0”。

三、效果预览

C#委托实现WPF主窗体向多个子窗体广播传递消息

在WPF当中,不同窗体其本质就是不同的类,只不过不像WinForm那样,WPF程序的每个窗体界面部分交由XAML标签语言来完成,后台程序逻辑还是C#语言,最终将XAML代码和C#代码以“部分类”的方式合并为壹个类。本次代码XAML部分只是简单的拖放按钮和文本控件,没有涉及复杂的布局样式,故不再展示XAML代码。C#代码同样只是简单几行,高手可以略过,只为初学C#的同行在漫长的学习过程中分享壹点知识!