[英]How can I raise an attached event handler?
我想创建一个可Panel.OnVisualChildrenChanged
Panel事件,该事件在Panel.OnVisualChildrenChanged
时Panel.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.