如何在WPF中获取控件的委托列表表单事件。
我尝试了以下代码,但它会将字段信息返回为null
TextBox cont = new TextBox();
cont.TextChanged += new TextChangedEventHandler(cont_TextChanged);
FieldInfo fi = cont.GetType().GetField("TextChanged", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.Public | BindingFlags.Static);
Delegate del = (Delegate)fi.GetValue(cont);
答案 0 :(得分:7)
我不知道为什么人们说它不可能:
假设您要暂时禁用任何事件,可以创建如下方法:
static Delegate[] DisableEvents(this Control ctrl, string eventName)
{
PropertyInfo propertyInfo = ctrl.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
EventHandlerList eventHandlerList = propertyInfo.GetValue(ctrl, new object[] { }) as EventHandlerList;
FieldInfo fieldInfo = typeof(Control).GetField("Event"+eventName, BindingFlags.NonPublic | BindingFlags.Static);
object eventKey = fieldInfo.GetValue(ctrl);
var eventHandler = eventHandlerList[eventKey] as Delegate;
Delegate[] invocationList = eventHandler.GetInvocationList();
foreach (EventHandler item in invocationList)
{
ctrl.GetType().GetEvent(eventName).RemoveEventHandler(ctrl, item);
}
return invocationList;
}|
您可以这样称呼它:
var events = textbox1.DisableEvents("GotFocus")
如果您想再次添加它们,您只需要浏览事件列表。
答案 1 :(得分:0)
上一个答案中描述的方法非常有效。 但是,要使用它,您需要确保事件不是作为字段实现,而是作为属性实现。同时,对委托的引用存储在Dictionary类的内部对象中。 您可以在此处阅读更多内容:How to: Use a Dictionary to Store Event Instances (C# Programming Guide)