天天看点

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

上篇文章我们通过C#委托实现WPF主窗体向多个子窗体广播传递消息,这次我们主要通过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());
            }
        }
    }
}
           

三、效果预览

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

简而言之,SubForm子窗体想给MainForm主窗体发送消息,消息的目的是让主窗体显示子窗体按钮点击的次数。这个情形就好比男生A喜欢女生C,但是这个男生A没有办法直接向女生C表达自己的情感,所以男生A就找了个和女生C同寝室的女生B(女生B性格比较开朗活泼,和男生、女生都玩的很好),通过女生B把自己为女生C准备礼物传递过去。

在我们的代码当中,委托就好比女生B,虽然住在女生C的寝室(声明在MainForm主窗体),但是和男生A也处的不错(在SubForm窗体内也可以定义委托变量),壹来二往之后男生A就想到找女生B给自己传情带话送礼物(按钮点击次数)。果然,没过多久,女生C就出来和男生A约会了,精致的发卡礼物让女生C看起来更漂亮(改变了MainForm主窗体中MainFormLabel的值)。

示例程序中的委托,实实在在的发挥了中间人的作用。