【问题标题】:How do i attach property to a custom event?如何将属性附加到自定义事件?
【发布时间】:2025-12-24 08:25:15
【问题描述】:

我有一个自定义事件,并想为其附加一个属性(一个字符串就可以了)。 我需要在我的代码中更改什么:

    public static readonly RoutedEvent ModelClickEvent = EventManager.RegisterRoutedEvent(
        "ModelClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(InfoBox));

    // Provide CLR accessors for the event
    public event RoutedEventHandler FadeIn
    {
        add { AddHandler(ModelClickEvent, value); }
        remove { RemoveHandler(ModelClickEvent, value); }
    }

    // This method raises the Tap event
    void RaiseTapEvent()
    {
        RoutedEventArgs newEventArgs = new RoutedEventArgs(InfoBox.FadeInEvent); 
        RaiseEvent(newEventArgs);
    }

【问题讨论】:

    标签: c# .net wpf visual-studio


    【解决方案1】:

    首先,您需要创建一个新的 RoutedEventArgs 派生类,其中包含您的新属性。比如:

    public class ModelClickEventArgs : RoutedEventArgs
    {
        public string MyString { get; set; }
        public ModelClickEventArgs() : base() { }
        public ModelClickEventArgs(RoutedEvent routedEvent) : base(routedEvent) { }
        public ModelClickEventArgs(RoutedEvent routedEvent, object source) : base(routedEvent, source) { }
    }
    

    然后,您必须创建一个使用新事件参数的委托:

    public delegate void ModelClickEventHandler(object sender, ModelClickEventArgs e);
    

    之后,您必须对上面的代码进行更改,以便它使用这些新对象:

    public static readonly RoutedEvent ModelClickEvent = EventManager.RegisterRoutedEvent(
            "ModelClick", RoutingStrategy.Bubble, typeof(ModelClickEventHandler), typeof(Window));
    
    // Provide CLR accessors for the event
    public event ModelClickEventHandler FadeIn
    {
        add { AddHandler(ModelClickEvent, value); }
        remove { RemoveHandler(ModelClickEvent, value); }
    }
    
    // This method raises the Tap event
    void RaiseTapEvent()
    {
        ModelClickEventArgs newEventArgs = new ModelClickEventArgs();
        newEventArgs.MyString = "some string";
        RaiseEvent(newEventArgs);
    }
    

    【讨论】:

      【解决方案2】:

      如果您的意思是要向处理程序接收的 RoutedEventArgs 对象添加一个属性,那么您所要做的就是声明一个继承自 RoutedEventArgs 并具有属性(-y/-ies ) 你想添加。

      它看起来像下面这样:

      public class ModelRoutedEventArgs : RoutedEventArgs
      {
        public string ExtraMessage { get; set; }
        public ModelRoutedEventArgs(RoutedEvent routedEvent, string message) : base(routedEvent)
        {
          ExtraMessage = message;
        }
        // anything else you'd like to add can go here
      }
      

      或者,您可以实例化您的自定义 RoutedEventArgs 类并在将其传递给 RaiseEvent() 调用之前设置属性,而不是添加构造函数重载。

      【讨论】:

      • 看来你不能这样的构造函数:base(RoutedEvent);它一直说“在这种情况下无法使用基本命令。
      • 好的。我会编辑我的答案。看起来你可以链接构造函数调用。