繁体   English   中英

如何引发附加的事件处理程序?

[英]How can I raise an attached event handler?

我想创建一个可Panel.OnVisualChildrenChanged Panel事件,该事件在Panel.OnVisualChildrenChangedPanel.OnVisualChildrenChanged

public class PanelObserver {
    public static readonly RoutedEvent VisualChildrenChangedEvent;

    static PanelObserver( ) {
        VisualChildrenChangedEvent = EventManager.RegisterRoutedEvent(
            "VisualChildrenChanged",
            RoutingStrategy.Bubble,
            typeof( RoutedEventHandler ),
            typeof( Panel ) );
    }

    public static void AddVisualChildrenChangedHandler(
        DependencyObject d, RoutedEventHandler handler ) {
        //Something needs to be done to d so that when OnVisualChildrenChanged is called,
        //it will fire handler.
        ( d as Panel )?.AddHandler( VisualChildrenChangedEvent, handler );
    }

    public static void RemoveVisualChildrenChangedHandler(
        DependencyObject d, RoutedEventHandler handler ) {
        //Something will likely need to be done to d here as well...
        ( d as Panel )?.RemoveHandler( VisualChildrenChangedEvent, handler );
    }
}

用例将非常简单

<Grid myns:PanelObserver.VisualChildrenChanged = "SomeEventHandler" />

理想情况下,每次调用Panel.OnVisualChildrenChanged时都会引发该事件。 如果可能的话,我需要添加什么到AddVisualChildrenChanged方法(及其AddVisualChildrenChanged )上? 如果那不是完成任务的方法,那么正确的方法是什么?

我想不出一种通过可Panel.OnVisualChildrenChanged的Panel事件触发Panel.OnVisualChildrenChanged的方法。 相反,您可以从任何Panel类派生并重写OnVisualChildrenChanged ,然后声明另一个事件。

例如:

public class ObservablePanel : Panel
{
    protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
    {
        base.OnVisualChildrenChanged(visualAdded, visualRemoved);
        VisualChildrenChanged?.Invoke(this, EventArgs.Empty);
    }
    public event EventHandler VisualChildrenChanged;
}

您无法通过附加的Panel事件执行此操作的原因:
1. Panel.Children属性是UIElementCollection ,如果“更改”,则不会公开任何要捕获的事件。
2. Panel.Children属性是只读的,因此您不能将其设置为UIElementCollection的自定义派生实现,它将暴露“已更改”事件。
3. Panel.OnVisualChildrenChanged protected因此您只能在Panel派生类上对其进行访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM