深入理解WPF附加事件

22 篇文章 2 订阅

        通过前一篇 《深入理解WPF路由事件》,了解路由事件的声明、定义、注册/注销,以及触发机制; 其中事件的注册/注册,以及触发方法都是定义在UIElement中的;所以路由事件的宿主一般是可视化的UI控件。 如果是非UIElement派生类,如果要实现路由事件,则需要像附加属性一样,通过附加的方式实现,附加上路由事件 (Attached Event);

        附加属性是某对象在特定环境中才具备的属性,所以附加属性是定义在环境中的。 而附加事件,是非UIElement想具备事件路由功能,所以是定义在非UIElemnt中,通过借用附加的UIElement的方法,实现路由事件的注册/注销,触发;

(附加)路由事件定义:

 public class User
    {
        /// <summary>
        /// 1)声明和定义路由事件 
        /// </summary>
        public static readonly RoutedEvent NameChangedEvent = EventManager.RegisterRoutedEvent("NameChanged", RoutingStrategy.Bubble,typeof(RoutedEventHandler), typeof(User));
        /// <summary>
        /// 2)绑定路由事件
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="handler"></param>
        public void AddNameChangedEvent(UIElement obj, RoutedEventHandler handler)
        {
            obj.AddHandler(NameChangedEvent, handler);

        }
        /// <summary>
        /// 解绑路由事件
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="handler"></param>
        public void RemoveNameChangedEvent(UIElement obj, RoutedEventHandler handler)
        {
            obj.RemoveHandler(NameChangedEvent, handler);

        }
        /// <summary>
        /// 3)触发路由事件
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="name"></param>
        public void RaiseNameChangedEvent(UIElement obj,String name)
        {
            RoutedEventArgs args = new RoutedEventArgs(NameChangedEvent, this);
            obj.RaiseEvent(args);
        }
    }

绑定事件处理及触发

    public partial class MenuTest2 : Window
    {
        public MenuTest2()
        {
            InitializeComponent();
        }
       

        private void QuestionTempTool_Loaded(object sender, RoutedEventArgs e)
        {
            //1)定义对象
            User user = new User();
            //2)添加事件处理
            user.AddNameChangedEvent(this, PrintName);
            //3)触发事件
            user.RaiseNameChangedEvent(this, "Wjj");
        }
        private void PrintName(object sender, RoutedEventArgs e)
        {

            Console.WriteLine("附加事件已触发,在这里处理");
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoBPage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值