我正在通過70-511的書,我正在看路由事件的部分。 我注意到它提到bubbling-tunneling事件對共享相同的EventArgs實例,所以如果你處理隧道事件(例如PreviewMouseDown),它會暫停配對的冒泡事件(例如MouseDown)。我試過這個,它的工作原理......但是,如果我每次事件處理程序觸發時測試相等(爲了測試目的,我對這兩個事件使用了1個事件處理程序),看起來好像EventArgs不是同一個實例(即他們有不同的哈希值和Object.Equals返回false)... 這將大大提高我對路由事件如何工作的理解,如果我能弄清楚爲什麼這是!爲什麼我的隧道事件參數對象和冒泡事件參數對象不相等?
任何.NET大師我們在那裏關心解釋?
我已經檢查了臨的WPF書(出色的書),這也只是說明: 「爲了讓生活更有趣,如果您將隧道事件標記爲已處理,冒泡事件將不會發生。這兩個事件共享RoutedEventArgs類的同一個實例。「
如果兩個事件共享一個類的SAME INSTANCE,那麼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>