0

こんにちは私はWPFを学んでいて、現在RoutedEventsについて読んでいます。本「ProWPFinc#」には、以下に示すコードのスニペットがあります。

<Window x:Class="RoutedEventsLearning.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" MouseUp="SomethingClicked" >
    <Grid Margin="3" MouseUp="SomethingClicked">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <Label Margin="5" Grid.Row="0" HorizontalAlignment="Left"
Background="AliceBlue" BorderBrush="Black" BorderThickness="1"
MouseUp="SomethingClicked">
            <StackPanel MouseUp="SomethingClicked">
                <TextBlock Margin="3"
MouseUp="SomethingClicked">
Image and text label</TextBlock>
                <Image  Stretch="None"
MouseUp="SomethingClicked" />
                <TextBlock Margin="3"
MouseUp="SomethingClicked">
Courtesy of the StackPanel</TextBlock>
            </StackPanel>
        </Label>
        <ListBox Grid.Row="1" Margin="5" Name="lstMessages"></ListBox>
        <CheckBox Grid.Row="2" Margin="5" Name="chkHandle">
            Handle first event</CheckBox>

    </Grid>
</Window>

重要なのは、ルーティングされたイベントの違い/利点が見当たらないということです(この例で判断してください)。通常のC#では、同じことを行います。フォームのすべての要素にハンドラーを追加します(これがここで行われたように)。

最初、ルーティングされたイベントについて読んでいたとき、それはそのように機能しているようです。フォーム/コントロール/ウィンドウのすべての視覚要素の親にイベントハンドラーを追加します。子をクリックすると、mousedownイベントが発生し、ビジュアルツリーを下に移動します。イベントがグリッドに到達すると、イベントハンドラーが呼び出されます。しかし、私は間違っていたか、間違っていました。通常のイベントとルーティングされたイベントの違いを誰かに説明してもらえますか

編集コードの挿入で何か奇妙なことが起こっています。コードスニペット全体を挿入して、タグのみを取得します

4

2 に答える 2

0

よく分からない。RoutedEvents は、RoutingStrategy に基づいてビジュアル ツリーを上下に移動できます。デフォルトでは、RoutingStrategy は Bubble (子から親への移動) に設定されています。

あなたのコードを試してみましたが、期待どおりに動作するようです。[画像とテキスト ラベル] をクリックすると、ビジュアル ツリーが上に移動します: TextBlock -> StackPanel -> Label -> Grid

于 2010-09-25T17:53:12.060 に答える
0

ポイントは、ルーティング イベントの違いや利点が見られないことです (この例から判断すると)。通常の C# でも同じことを行います。フォームのすべての要素にハンドラーを追加します (ここで行ったように)。

この例のポイントは、イベントを処理済みとしてフラグ付けすることが、ルーティングの動作にどのように影響するかを示すことです。[最初のイベントを処理する] チェックボックスをオンにして、内側のコントロールの 1 つをクリックすると、そのコントロールでのみイベントが発生します。チェックを外すと、ビジュアル ツリーのすべてのコントロールで発生します。

この例の作成者がツリー内のすべてのオブジェクトのイベントを処理する唯一の理由は、これを実証するためです。通常、これは行いません。イベントを最高の有用なレベルで処理するだけです。

于 2010-09-25T20:42:17.907 に答える