gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:33:01 25 4
gpt4 key购买 nike

我是 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 method .
您应该只在继承 UIElement 的类中创建路由事件.

所有其他类都应该使用普通的 CLR 事件。


注册路由事件时,UIElement将准备在您的类的实例中存储事件的处理程序。
当您调用 AddHandler , UIElement 会将处理程序添加到类似 Dictionary<RoutedEvent, Delegate> 的对象中.
当您在 XAML 中添加事件处理程序时,生成的 MyFile.xaml.g.cs代码将使用 CLR 事件访问器添加处理程序。当您调用 RaiseEvent , UIElement 将遍历其字典并调用每个处理程序。

有关 C# 中类似字段和自定义事件的更多信息,请参阅 my blog .

关于c# - 在 WPF 中理解和创建事件时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7178604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com