0

我正在阅读 70-511 这本书,并且正在查看有关 Routed Events 的部分。我注意到它提到冒泡隧道事件对共享相同的 EventArgs 实例,因此如果您处理隧道事件(例如 PreviewMouseDown),它会停止配对的冒泡事件(例如 MouseDown);我已经尝试过了,它可以工作......但是,如果我每次触发事件处理程序时测试是否相等(出于测试目的,我对两个事件都使用 1 个事件处理程序),似乎 EventArgs 不是同一个实例(即它们有不同的哈希值并且 Object.Equals 返回 false)...如果我能弄清楚为什么会这样,这将大大提高我对路由事件如何工作的理解!

有我们愿意解释的 .NET 专家吗?

我查看了 Pro WPF 书(优秀的书),这也只是说:“为了让生活更有趣,如果你将隧道事件标记为已处理,冒泡事件将不会发生。那是因为这两个事件共享RoutedEventArgs 类的相同实例。”

如果这两个事件共享一个类的相同实例,那么 eventargs 是否应该具有相同的哈希值并为 Object.Equals 返回“True”?

private RoutedEventArgs args;

private void MouseDownHandler(object sender, MouseButtonEventArgs e)
{
    listEvents.Items.Add(string.Format("{0} - {1} - {2} - {3}",
        sender.GetType().Name, e.RoutedEvent.ToString(), e.Source.GetType().Name,
        e.OriginalSource.GetType().Name));
    listEvents.Items.Add(e.GetHashCode().ToString());
    if (args != null) listEvents.Items.Add(e.Equals(args).ToString());
    args = e;
}

XAML:

<Window x:Class="Chapter_2___WPF_RoutedEvents.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="428" Width="658"
    PreviewMouseDown="MouseDownHandler" MouseDown="MouseDownHandler">
    <Grid Name="grid"
          MouseDown="MouseDownHandler" PreviewMouseDown="MouseDownHandler">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <ListBox Name="listEvents" Grid.Column="1"/>
        <Button Content="Click Me!" Width="150" Height="50" Margin="10" Grid.Column="0"
                MouseDown="MouseDownHandler" PreviewMouseDown="MouseDownHandler"/>
    </Grid>
</Window>
4

1 回答 1

0

当我运行您的代码并单击按钮时,它确实返回相同的哈希码和e.Equals(args). 如果我再次单击,e.Equals(args)则返回“False”,因为它是RoutedEventArgs每次单击的新实例,但下一个返回True是因为隧道事件与冒泡事件相同。

于 2012-02-17T00:12:06.493 回答