0

我正在尝试对 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;
    }
}
4

3 回答 3

4

也许:

RoutedEventHandler 处理程序 = null;

于 2013-03-05T14:39:22.563 回答
3

做就是了

    RoutedEventHandler handler = null; // Initialize handler with null
    handler = (s, e) =>
    {
        element.Loaded -= handler;
        action();
    }
    element.Loaded += handler;
于 2013-03-05T14:45:33.490 回答
0

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

于 2013-03-05T15:24:19.727 回答