私はWPFで比較的新しいです。MouseDownEvent と PreviewMouseDownEvent の違いを理解しようとしています。
私は WPF イベント戦略を理解し、MouseDown イベントがバブリング イベントであり、PreviewMouseDown がトンネリング イベントであることを理解しています。
この MSDN の概要http://msdn.microsoft.com/en-us/library/ms742806.aspx#routingによると、これらのイベントが発生する順序も理解しています(そこに例のある図があります)。
だから私は自分自身をコーディングしようとしました、例えばこれをチェックしてください:
<Grid x:Name="grid" Width="250">
<StackPanel Mouse.MouseDown="StackPanel_MouseDown" PreviewMouseDown="StackPanel_PreviewMouseDown">
<WPFVisualizerExample:MyButton x:Name="B1" PreviewMouseDown="B1_PreviewMouseDown" MouseDown="B1_MouseDown" Margin="5,5,5,5">
<WPFVisualizerExample:MyButton x:Name="B2" PreviewMouseDown="B2_PreviewMouseDown" MouseDown="B2_MouseDown" Margin="5,5,5,5">
<WPFVisualizerExample:MyButton x:Name="B3" PreviewMouseDown="B3_PreviewMouseDown" MouseDown="B3_MouseDown" Margin="5,5,5,5">Click Me</WPFVisualizerExample:MyButton>
</WPFVisualizerExample:MyButton>
</WPFVisualizerExample:MyButton>
</StackPanel>
</Grid>
各イベント (プレビューと非プレビュー) のイベント ハンドラーがあり、何が起こっているか、どのイベントがスローされているかを確認したかった (イベントごとにメッセージ ボックスが表示されている)。
「MyButton」ユーザー コントロールは、単純にベース ボタンを拡張し、OnMouseDown と OnPreviewMouseDown をオーバーライドして、e.Handled を false に設定します。
protected override void OnMouseDown(System.Windows.Input.MouseButtonEventArgs e)
{
base.OnMouseDown(e);
e.Handled = false;
}
protected override void OnPreviewMouseDown(System.Windows.Input.MouseButtonEventArgs e)
{
base.OnPreviewMouseDown(e);
e.Handled = false;
}
(これとこれなしで試しました)。
MSDN の概要 (上記のリンク) によると、3 つの要素がある場合、イベント ルートは次のようになります。
ルート要素の PreviewMouseDown (トンネル)。
中間要素 #1 の PreviewMouseDown (トンネル)。
ソース要素 #2 の PreviewMouseDown (トンネル)。
ソース要素 #2 の MouseDown (吹き出し)。
中間要素 #1 の MouseDown (吹き出し)。
ルート要素の MouseDown (バブル)。
したがって、上記に従ってメッセージボックスが表示されることを期待していました。なんらかの理由から-プレビューイベントのみがスローされていることを理解していません(MSDNの言うことによると Preview_B1=>Preview_B2=>Preview_B3 )。私の予想は、Preview_B1=>Preview_B2=>Preview_B3=>NonPreview_B3=>NonPreview_B2=>NonPreview_B1 でした。
ただし、プレビュー以外のイベントはまったくスローされていません。
したがって、基本的に私はイベントのルートを理解していません.MSDNの概要から、ルートはルート要素から始まり、ソース要素に下り(トンネル)、ルート要素に戻る(バブル)ことを理解しましたが、これは実際に起こっていることではありません。
このイベントがどのように機能しているかを理解することは、私にとって非常に重要です。ここで基本的なことを理解していない可能性があります。助けていただければ幸いです。
ありがとう!! -ギリ