2012-02-10 8 views
2

で多くのWPF要素でWindowsのするRoutedEventの取り扱い:は、私は、次のルーティングイベントを持っているスタイル

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を起動します。ただし、(ボタンをクリックして)ルーティングされたイベントを発生させると何も起こりません(エラーなし、何もありません)。何が間違っているのか分かりません。

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

答えて

1

tunneling作品どのようにあなたが誤解しているかもしれません:

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

イベントはルート、ウィンドウ、ソース、ウィンドウに移動しますが、TextBlocksには決して行きません。すべてのイベントを上げるか、ウィンドウでイベントを聞く必要がありますが、残念ながらEventTrigger.SourceNameはスタイルで使用できません。悲しいことに私は(あなたがそれをローカルにし、ウィンドウ上のイベントに耳を傾けるTextBlocksLoadedイベントを処理し、再調達するEventSetterを使用することができます(

...これに何か良い解決策をあなたに知りませんルーティング戦略を変更したい場合や、イベントの発生場所を確認しない場合はスタックオーバーフローの例外が発生します)、それが良いアイディアかどうか疑問になる可能性があります)

関連する問題