首页 > 其他分享 >wpf移除事件委托

wpf移除事件委托

时间:2024-10-23 09:46:48浏览次数:1  
标签:sender 委托 object RoutedEventHandlerInfo bindingFlags BindingFlags 移除 EventHandle

 public class EventHandlerHelper
    {
        public static Delegate GetEventDelegate(RoutedEventHandlerInfo[] rehis, string method_name)
        {
            foreach (RoutedEventHandlerInfo rh in rehis)
            {
                if (rh.Handler.Method.Name == method_name)
                {
                    return rh.Handler;
                }
            }
            return null;
        }

        public static void RemoveRoutedEventHandler(object sender, RoutedEvent routedEvent, Delegate handler)
        {
            BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic |
                                        BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Static |
                                        BindingFlags.InvokeMethod |
                                        BindingFlags.GetProperty |
                                        BindingFlags.Default | BindingFlags.GetField | BindingFlags.FlattenHierarchy;

            FieldInfo fi = sender.GetType().GetField("EventHandlersStoreField", bindingFlags);
            object EventHandlersStoreField_obj = fi.GetValue(sender);
            object EventHandlersStoreObj = EventHandlersStoreField_obj.GetType().InvokeMember("GetValue", bindingFlags, null, EventHandlersStoreField_obj, new object[] { sender });

            EventHandlersStoreObj.GetType().InvokeMember("RemoveRoutedEventHandler",
            bindingFlags, null, EventHandlersStoreObj, new object[] { routedEvent, handler });
        }
        public static RoutedEventHandlerInfo[] GetRoutedEventHandlers(object sender, RoutedEvent routedEvent)
        {
            BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Static |
            BindingFlags.InvokeMethod |
            BindingFlags.GetProperty |
            BindingFlags.Default | BindingFlags.GetField | BindingFlags.FlattenHierarchy;

            FieldInfo fi = sender.GetType().GetField("EventHandlersStoreField", bindingFlags);
            object EventHandlersStoreField_obj = fi.GetValue(sender);
            object EventHandlersStoreObj = EventHandlersStoreField_obj.GetType().InvokeMember("GetValue", bindingFlags, null, EventHandlersStoreField_obj, new object[] { sender });
            RoutedEventHandlerInfo[] rhs = (RoutedEventHandlerInfo[])EventHandlersStoreObj.GetType().InvokeMember("GetRoutedEventHandlers",
                bindingFlags, null, EventHandlersStoreObj, new object[] { routedEvent });

            return rhs;
        }
    }

  

     RoutedEventHandlerInfo[] rhs = EventHandlerHelper.GetRoutedEventHandlers(sender, FrameworkElement.LoadedEvent);

            Delegate dd = EventHandlerHelper.GetEventDelegate(rhs, "MainWindow_Loaded");

            EventHandlerHelper.RemoveRoutedEventHandler(sender, FrameworkElement.LoadedEvent, dd);

  

标签:sender,委托,object,RoutedEventHandlerInfo,bindingFlags,BindingFlags,移除,EventHandle
From: https://www.cnblogs.com/coolyylu/p/18494486

相关文章

  • Yorkie 如何移除githooks 钩子
    要移除Yorkie设置的Githooks,你可以按照以下步骤进行操作:1.手动删除GitHooksYorkie将Githooks安装在项目的.git/hooks目录中。你可以手动删除这些hooks文件:打开终端,导航到你的项目目录。进入.git/hooks目录:cd.git/hooks删除相应的hook文件,例如pr......
  • C#中WPF和WinForms有什么区别?
    C#中WPF和WinForms有什么区别? WPF(WindowsPresentationFoundation)和WinForms(WindowsForms)都是微软提供的用于开发Windows桌面应用程序的框架,但它们在设计理念、功能和用户体验方面存在一些显著的差异:用户界面的构建方式:WPF 使用XAML(eXtensibleApplicationMarkupLang......
  • C#WPF基本概念
    一、什么是WPF?C#WPF,即WindowsPresentationFoundation,是一个用于构建Windows桌面应用程序的UI框架。WPF支持广泛的应用程序开发功能,包括应用模型、资源、控件、图形、布局、数据绑定、文档和安全性。它是.NETFramework的一部分,允许开发者使用C#等.NET语言来创建应用程序。W......
  • WPF - 集成HandyControl UI组件库
    WPF-集成HandyControlUI组件库 环境:net6+wpf+ HandyControl  一.创建项目   二.安装  NuGet包dotnetaddpackageHandyControl  三. 引入HandyControl资源字典 在你的WPF项目中的 App.xaml 或主题文件中1.引入HandyControl资源字典......
  • DevExpress WPF中文教程:Data Grid的视图概述及主要功能一览
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • DevExpress WPF中文教程:Data Grid的视图概述及主要功能一览
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为......
  • 27. 移除元素
    题目这道题通过是通过了,但是有很多可以改进的地方:附上本人第一次写通过的代码:/*slow的作用:作为慢指针,职责是找到val所在的位置quick的作用:作为快指针,职责是找到第一个可以和slow所指的元素互换位置的元素*/classSolution{public:intremoveElement(vector<int>......
  • 【转】[WPF] 关闭模式决定了应用程序何时关闭
    在WPF(WindowsPresentationFoundation)中,关闭模式(ShutdownMode)决定了应用程序何时关闭。可以通过以下方式设置关闭模式:XAML设置:在 App.xaml 文件中,可以通过 ShutdownMode 属性来设置关闭模式。WPF提供了三种关闭模式:OnLastWindowClose:默认值,当最后一个窗口关闭时,......
  • WPF中Grid、StackPanel、Canvas、WrapPanel常用属性
    Grid常用属性Grid控件在WPF中非常强大,它提供了多种属性来定义行和列的布局。以下是一些常用的Grid属性:RowDefinitions和ColumnDefinitions:Grid 控件使用 RowDefinitions 和 ColumnDefinitions 来定义行和列的集合。每个 RowDefinition 和 ColumnDefinition......
  • 代码随想录算法训练营第三天|203.移除链表元素,707.设计链表,206.反转链表
    1前言今日主要学习链表的基础leetcode203移除链表元素leetcode707设计链表leetcode206反转链表2链表的基础链表分为单链表和双链表,与字符串的区别就是链表是在一个里面存储了数据+下一个数据的内存地址链表中存储的内存空间是可以不连续的2.1链表的定义2.1.1......