【问题标题】:How can an anonymous event handler unregister itself? [duplicate]匿名事件处理程序如何注销自己? [复制]
【发布时间】:2013-03-05 14:29:12
【问题描述】:

我正在尝试为 WPF FrameworkElement 实现一个扩展方法,该方法允许用户在加载元素时只执行一次操作。

这里的想法是,如果元素稍后被卸载然后再次加载,则不会再次调用该操作。

但我找不到匿名事件处理程序在调用时注销自身的正确语法...

public static void ExecuteOnceWhenLoaded(
        this FrameworkElement element,
        Action action)
{
    if(element.IsLoaded)
    {
        action();
    }
    else
    {
        RoutedEventHandler handler;
        handler = (s, e) =>
        {
            element.Loaded -= handler; // ERROR: handler is not initialized
            action();
        }
        element.Loaded += handler;
    }
}

【问题讨论】:

  • 将处理程序的代码提取到私有方法中并进行正常订阅/取消订阅或查看此帖子:Unsubscribe anonymous method in C#
  • @sll 如果我“将处理程序的代码提取到私有方法中”,应该如何携带“action”参数?

标签: .net wpf events lambda


【解决方案1】:

也许:

RoutedEventHandler 处理程序 = null;

【讨论】:

  • 它有效。我确信handler 会在 lambda 中为空,如果我这样做的话,所以我什至没有尝试过!谢谢!
【解决方案2】:

只是做

    RoutedEventHandler handler = null; // Initialize handler with null
    handler = (s, e) =>
    {
        element.Loaded -= handler;
        action();
    }
    element.Loaded += handler;

【讨论】:

    【解决方案3】:

    这应该是编译时错误,因为您正在尝试取消订阅尚未创建的处理程序。在这种情况下,最好创建一个处理程序方法并在第一次执行该方法时取消订阅该处理程序?并且没有充分的理由说明您应该在它不是闭包的情况下执行匿名方法。

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 2010-09-22
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 2010-11-26
      • 1970-01-01
      • 2021-07-21
      相关资源
      最近更新 更多