我想确定我明白事件是如何传播的。以下是否正确?事件如何在wpf中传播?
例如,让我们来看看在按钮内点击鼠标左键时如何调用按钮的Click
事件。
按钮注册Click
事件:
public class Button : ButtonBase
{
public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("Click",
RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Button));
public event RoutedEventHandler Click
{
add { AddHandler(ClickEvent, value); }
remove { RemoveHandler(ClickEvent, value); }
}
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
...
RaiseEvent(new RoutedEventArgs(ClickEvent, this));
...
}
...
}
EventManager.RegisterRoutedEvent
创建一个名为Click
路由事件并将其添加到按钮的事件处理程序的集合称为EventHandlersStore
。我相信这个系列(我们称之为_routedEvents
)的类型与Dictionary<RoutedEvent, RoutedEventHandler>
类似。所以,RegisterRoutedEvent
确实_routedEvents.Add(ClickEvent, null)
。AddHandler
增加处理程序到ClickEvent
条目EventHandlersStore
。如果没有人订阅Click
事件,则ClickEvent
的处理程序仍为null
。
现在,当RaiseEvent
被调用,在OnMouseLeftButtonDown
,这是发生了什么,以及如何将事件根据我的理解路由:
void RaiseEvent(RoutedEventArgs e)
{
DependencyObject current = this;
do
{
// check if the element has handler for routed event
var handler = current.GetHandlerFromEventHandlersStore(e.RoutedEvent);
if (handler != null)
{
handler(e);
}
// the event was NOT handled -> route the event to the parent
// OR
// the event was handled but wasn't marked as handled -> route the event further to parent
if (e.Handled == false)
{
// assuming that RoutingStrategy is Bubble
current = VisualTreeHelper.GetParent(current);
}
// continue until either it has been handled or it reaches the root element
} while (e.Handled == false && current != null);
}
,我会很感激,如果,如果我有人可以指正米错了,也告诉我如何调用OnMouseLeftButtonDown(我无法在resharper中找到它)