我是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)是否有任何类型的事件,或一些其他等效的,发生在数据的特定状态(一些变量,资源等),而不是一些输入设备事件?例如,当拖动画一条线时,它会达到特定的长度?
谢谢!
RoutedEvent系统以UIElement
类及其AddHandler
方法为中心。
您应该只在继承UIElement
的类中创建路由事件。
所有其他类都应该使用普通的CLR事件。
当您注册一个路由事件时,UIElement
将准备在您的类实例中存储该事件的处理程序。
当您调用AddHandler
时,UIElement会将处理程序添加到类似Dictionary<RoutedEvent, Delegate>
的东西中。
在XAML中添加事件处理程序时,生成的MyFile.xaml.g.cs
代码将使用CLR事件访问器添加处理程序。当您调用RaiseEvent
时,UIElement将遍历其字典并调用每个处理程序。
有关c#中类似字段和自定义事件的更多信息,请参阅我的博客