我是WPF的新手,我正在学习使用Pro WPF C#2010这本书。
现在在关于事件的章节中,本书解释了如何在WPF中创建事件和注册事件,作为一个例子,它给出了ButtonBase类中的代码,该代码派生自其他类,代码没有明确提及
现在要了解全局,我还尝试创建自己的简单类,并尝试注册一个事件,我稍后会尝试提出(仅供我自己理解)。
这是我写的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Input;
namespace WPFRoutedEvents
{
public class EventTest
{
private string variable = "Event has occured";
public static readonly RoutedEvent myTestEvent;
//Constructor
public static EventTest()
{
EventTest.myTestEvent = EventManager.RegisterRoutedEvent("TestEvent", RoutingStrategy.Bubble, typeof (RoutedEventHandler), typeof(EventTest));
}
public string getVariable()
{
return this.variable;
}
public event RoutedEventHandler myTestEvent
{
add
{
//Here is the problem
// I cannot use base.AddHandler () because it does not exist
}
remove
{
//Here is the problem
// I cannot use base.RemoveHandler() because it does not exist
}
}
}// end of class EventTest
}
既然这个类还没有派生自任何类,我就无法访问基类函数AddHandler。
我的问题如下:
1)哪个类实现了原始的AddHandler函数,我需要扩展我的类?
2)有人请简要解释从编写和事件到最终设置的流程,直到它发生时调用处理程序,即从实现事件,事件处理程序,注册事件,定义事件处理程序(编码部分)的语法,以及从事件发生到处理(事件和事件处理程序的实际执行)的管道。它会增加我对文本的理解。
3)我在书中找到的是已经在某处实现的ClickEvent,它被创建,注册并最终处理。我想知道的是程序员将如何注册一些尚未实现的新类型事件(例如可能是三次点击,仅为了示例,否则我知道它存在),然后注册该事件然后设计一个处理程序。
4)是否有任何类型的事件或其他等效事件发生在数据的特定状态(某些变量,资源等)而不是某些输入设备事件?例如,在拖动绘制线条时,它会达到特定的长度?
谢谢!
答案 0 :(得分:2)
RoutedEvent系统以UIElement
班级及其AddHandler
method为中心
您应该只在继承UIElement
的类中创建路由事件。
所有其他类应使用普通的CLR事件。
当您注册路由事件时,UIElement
将准备在您的课程实例中存储该事件的处理程序。
当您致电AddHandler
时,UIElement会将处理程序添加到类似Dictionary<RoutedEvent, Delegate>
的内容中
在XAML中添加事件处理程序时,生成的MyFile.xaml.g.cs
代码将使用CLR事件访问器添加处理程序。
当你调用RaiseEvent
时,UIElement将遍历其字典并调用每个处理程序。
有关C#中字段和自定义事件的详细信息,请参阅my blog。