Почему мой объект аргументов туннельного события и объект аргументов пузырькового события не совпадают?
Я работаю над книгой 70-511 и смотрю на раздел о маршрутизируемых событиях. Я заметил, что в нем упоминается, что пары событий bubbling-tunneling совместно используют один и тот же экземпляр EventArgs, поэтому, если вы обрабатываете событие туннелирования (например, PreviewMouseDown), оно останавливает парное событие пузырьковости (например, MouseDown); Я пробовал это, и это работает... Но, если я проверяю на равенство каждый раз, когда запускается обработчик событий (для целей тестирования я использую 1 обработчик событий для обоих событий), создается впечатление, что EventArgs - это не один и тот же экземпляр (т.е. они имеют разные хеш-значения и Object.Equals возвращает false)... Это значительно улучшило бы мое понимание того, как работают перенаправленные события, если бы я мог понять, почему это так!
Любой.NET гуру наш там хочет объяснить?
Я проверил книгу Pro WPF (отличная книга), и в ней также говорится: "Чтобы сделать жизнь более интересной, если вы пометите событие туннелирования как обработанное, событие пузыря не произойдет. Это потому, что два события совместно используют тот же экземпляр класса RoutedEventArgs. "
Если два события совместно используют ОДИН ЖЕ МОМЕНТ класса, не должны ли столбцы событий иметь одинаковые хэш-значения и возвращать "True" для Object.Equals???
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>
1 ответ
Когда я запускаю ваш код и нажимаю кнопку, он возвращает тот же хэш-код и "True" для e.Equals(args)
, Если я нажму снова, e.Equals(args)
возвращает "Ложь", потому что это новый экземпляр RoutedEventArgs
за каждый клик, но следующий возвращает True
потому что событие туннелирования совпадает с событием пузыря.