窗体之间传递消息并不罕见,实现方式各有不同,今天主要记录下C#当中通过委托(Delegate)实现主窗体向多个子窗体发送消息的简单示例。
一、原理分析
壹般来说,壹个应用程序是由若干个窗体构成的,通过适当的交互逻辑在不同窗体之间建立起联系。当主窗体不方便直接调用子窗体内部的方法时,可通过委托的方式来间接调用。只需要子窗体定义壹个满足主窗体声明的委托要求的方法即可。然后在主窗体实例化从窗体,并将委托变量和从窗体方法关联起来,再调用委托来完成!
二、代码实现
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”。
三、效果预览
在WPF当中,不同窗体其本质就是不同的类,只不过不像WinForm那样,WPF程序的每个窗体界面部分交由XAML标签语言来完成,后台程序逻辑还是C#语言,最终将XAML代码和C#代码以“部分类”的方式合并为壹个类。本次代码XAML部分只是简单的拖放按钮和文本控件,没有涉及复杂的布局样式,故不再展示XAML代码。C#代码同样只是简单几行,高手可以略过,只为初学C#的同行在漫长的学习过程中分享壹点知识!