0

ちなみに、非常にクールなコンセプトであるルーテッドイベントについて読んでいます。子要素からルート要素に向かってイベントバブリングがどのように機能するかは理解していますが、イベントトンネリングがどのように機能するかはわかりません。1つのボタンをグリッドに配置し、previewKeyupイベントをすべてにアタッチする小さな例を作成しましたが、キーイベントを押した後、ルートレベルで処理され、子にトンネリングされません。

<Window x:Class="ExplorerContentControl.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Content Control" Height="400" Width="400" FontFamily="Calibri" FontSize="13" FontWeight="Bold" Button.Click ="Window_Click" PreviewKeyUp="Window_PreviewKeyUp" >
    <Grid Button.Click ="Grid_Click" PreviewKeyUp="Grid_PreviewKeyUp">
        <Button Name="btnClickedMe" Click="btnClickedMe_Click" Margin="3" HorizontalAlignment="Left" Height="25" Width="80" Content="Click Me" PreviewKeyUp="btnClickedMe_PreviewKeyUp" />
    </Grid>
</Window>

コードビハインドにいる間

private void btnClickedMe_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("From Btn Clicked");
}

private void Grid_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("at Grid Location...");
}

private void Window_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("at Windows Location ...");
}

private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
{
    MessageBox.Show("PreviewKeyUp From Windows...");
}

private void Grid_PreviewKeyUp(object sender, KeyEventArgs e)
{
    MessageBox.Show("PreviewKeyUp From Grid...");
}

private void btnClickedMe_PreviewKeyUp(object sender, KeyEventArgs e)
{
    MessageBox.Show("PreviewKeyUp From Button...");
}

イベントバブリング中、適切なメッセージボックスがからbuttonClickに表示されますWindowClickが、同じシナリオでは表示されませんPreviewKeyup。私の例でイベントトンネリングがどのように機能するかを誰かに説明してもらえますか?

4

1 に答える 1

1

トンネリングを試してみたいトリッキーな方法です。あなたが窓の中にいて、窓からだけメッセージを受け取るよりも、上ボタンを押すと思います。これは、ウィンドウの上ボタンを押したため(ウィンドウはアクティブコントロール)、イベントはウィンドウのルートから発生し、イベントをトリガーしたのはリーフ要素であるため、ウィンドウで停止します。最初に[クリックしてください]ボタンをクリックしてみてください。ボタンにフォーカスが合ってから、上キーを押してください。ウィンドウからグリッドを経由してボタンにトンネリングし、必要なすべてのメッセージを取得します。

于 2013-02-05T09:02:36.747 に答える