3

次のルーティングされたイベントがあります。

public static readonly RoutedEvent FakeEvent = EventManager.RegisterRoutedEvent(
    "Fake", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(MainWindow));
public event RoutedEventHandler Fake
{
    add { AddHandler(FakeEvent, value); }
    remove { RemoveHandler(FakeEvent, value); }
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    RoutedEventArgs newEventArgs = new RoutedEventArgs(MainWindow.FakeEvent);
    RaiseEvent(newEventArgs);
}

私は次のXAMLを持っています:

<Window.Resources>

    <Style TargetType="{x:Type TextBlock}"
       xmlns:local="clr-namespace:WpfApplication1">
        <Setter Property="Margin" Value="10" />
        <Setter Property="Background" Value="Red" />
        <Style.Triggers>
            <EventTrigger RoutedEvent="local:MainWindow.Fake">
                <BeginStoryboard>
                    <Storyboard>
                        <ColorAnimation To="Blue" Duration="0:0:1"
                            Storyboard.TargetProperty="Background.Color" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>

</Window.Resources>

<StackPanel>
    <Button Click="Button_Click">Raise Event</Button>
    <TextBlock>Hello World</TextBlock>
    <TextBlock>Hello World</TextBlock>
    <TextBlock>Hello World</TextBlock>
    <TextBlock>Hello World</TextBlock>
    <TextBlock>Hello World</TextBlock>
    <TextBlock>Hello World</TextBlock>
</StackPanel>

私の目標は、ウィンドウのルーティングされたイベントによって、再利用可能な汎用スタイルを使用して、すべてのTextBlockに対してストーリーボードが起動するようにすることです。ただし、(ボタンをクリックして)ルーティングされたイベントを発生させると、何も発生しません(エラーは発生せず、何も発生しません)。何が悪いのかわからない。

これに対する正しいアプローチは何ですか?

4

1 に答える 1

2

トンネリングのしくみを誤解している可能性があります。

トンネリング:最初に、要素ツリーのルートにあるイベント ハンドラーが呼び出されます。次に、ルーティング イベントは、ルーティング イベント ソース (ルーティング イベントを発生させた要素) であるノード要素に向かって、ルートに沿って連続する子要素を経由してルートをたどります。

ここで、イベントはルート (ウィンドウ) からソース (同じくウィンドウ) に移動し、TextBlocks. EventTrigger.SourceNameそれらすべてでイベントを発生させるか、ウィンドウでイベントをリッスンする必要がありますが、残念ながらスタイルでは使用できません。悲しいことに、私はこれに対する良い解決策を知りません...

( を使用して のイベントEventSetterを処理し、ウィンドウでイベントをリッスンしてローカルで再発生させることができます (ルーティング戦略を変更するか、イベントの由来)、それが良い考えかどうかは疑問かもしれません)LoadedTextBlocks

于 2012-02-11T00:27:44.263 に答える