私は 70-511 の本を読んでいて、ルーティング イベントのセクションを見ています。バブリングとトンネリングのイベントのペアが同じ EventArgs インスタンスを共有していることに気付いたので、トンネリング イベント (PreviewMouseDown など) を処理すると、ペアのバブリング イベント (MouseDown など) が停止します。私はこれを試してみましたが、動作します...しかし、イベントハンドラーが起動するたびに等しいかどうかをテストすると(テスト目的で、両方のイベントに1つのイベントハンドラーを使用しています)、EventArgsが同じインスタンスではないように見えます(つまり、それらは異なるハッシュ値を持ち、Object.Equals は false を返します)... これがなぜなのかを理解できれば、ルーティング イベントがどのように機能するかについての理解が大幅に向上します。
説明したい .NET 専門家はいますか?
私は Pro WPF の本 (優れた本) をチェックしましたが、これも次のように述べています。 RoutedEventArgs クラスの同じインスタンスです。」
2 つのイベントがクラスの同じインスタンスを共有している場合、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>