上篇文章我们通过C#委托实现WPF主窗体向多个子窗体广播传递消息,这次我们主要通过C#委托实现WPF子窗体向主窗体传递消息。
一、原理分析
二、代码实现
1、主窗体
主窗体当中只有壹个名为MainFormLabel的Label控件,在主窗体中我们声明了委托、根据委托创建与之匹配的方法,并将子窗体创建的委托变量与方法建议关联。
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 DelegateSubFormToMainFormMessage
{
//声明委托
public delegate void ShowCounter(string Counter);
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
SubForm subForm = new SubForm();
//委托变量关联方法
subForm.messageSender = this.Receiver;
subForm.Show();
}
//根据委托创建方法
public void Receiver(string Counter)
{
this.MainFormLabel.Content = Counter;
}
}
}
2、子窗体
在子窗体里面我们创建了委托变量,因为该委托变量是public的,且是子窗体SubForm类的成员变量,因此在主窗体的构造函数当中实例化子窗体后,是可以访问到该委托变量的,而且在主窗体当中还将该委托变量与Receiver方法进行了关系,所以在SubForm子窗体当中调用委托变量的时候是可以间接调用到MainForm主窗体当中与委托变量相关联的Receiver方法(附带参数)的。Receiver方法通过委托传递过来的参数进而改变所在窗体中的MainFormLabel控件的值。
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.Shapes;
namespace DelegateSubFormToMainFormMessage
{
/// <summary>
/// Interaction logic for SubForm.xaml
/// </summary>
public partial class SubForm : Window
{
public SubForm()
{
InitializeComponent();
}
//创建委托变量
public ShowCounter messageSender;
//计数
public int counter = 0;
private void ClickMe(object sender, RoutedEventArgs e)
{
counter++;
//调用委托变量 传递消息参数
if (messageSender!=null)
{
messageSender(counter.ToString());
}
}
}
}
三、效果预览
简而言之,SubForm子窗体想给MainForm主窗体发送消息,消息的目的是让主窗体显示子窗体按钮点击的次数。这个情形就好比男生A喜欢女生C,但是这个男生A没有办法直接向女生C表达自己的情感,所以男生A就找了个和女生C同寝室的女生B(女生B性格比较开朗活泼,和男生、女生都玩的很好),通过女生B把自己为女生C准备礼物传递过去。
在我们的代码当中,委托就好比女生B,虽然住在女生C的寝室(声明在MainForm主窗体),但是和男生A也处的不错(在SubForm窗体内也可以定义委托变量),壹来二往之后男生A就想到找女生B给自己传情带话送礼物(按钮点击次数)。果然,没过多久,女生C就出来和男生A约会了,精致的发卡礼物让女生C看起来更漂亮(改变了MainForm主窗体中MainFormLabel的值)。
示例程序中的委托,实实在在的发挥了中间人的作用。