在WPF中理解和创建事件时遇到问题

时间:2011-08-24 16:00:30

标签: c# .net wpf event-handling

我是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)是否有任何类型的事件或其他等效事件发生在数据的特定状态(某些变量,资源等)而不是某些输入设备事件?例如,在拖动绘制线条时,它会达到特定的长度?

谢谢!

1 个答案:

答案 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