2009-06-28 11 views
0

WPF初心者はここで簡単な質問を許します。どのように、そのUserControlの外のコントロールからUserControlでトリガを起動させるのですか?ここに私がしたいことがあります...外部コントロールからトリガーを有効にする

私はIsMouseOverがTrueであるときに背景色の変更を表示するように設定されたトリガを持つUserControlを持っています。私がUserControlの上にマウスを置くと、トリガーは私の予想どおりに起動します。私がしたいのは、UserControlとボタンを含むウィンドウを作成し、ユーザーがボタンの上にマウスを置くと、UserControlのトリガーを起動することです。ような何か:

<Window x:Class="WpfApplication1.SimpleUCTry1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1.SimpleUCTry1" 
Title="Window1" Height="300" Width="300"> 
<StackPanel> 
    <local:Simple /> 
    <Button Content="Foo" /> 
</StackPanel> 

「フー」ボタンの上にマウスを置いたユーザのであれば、「シンプル」UserControlのトリガーが起動します。

これは可能ですか?

は、あなたのコントロールがボタンに「外部」であるので、あなたは、プロパティトリガやデータを使用することはできません、 アンディ

答えて

2

ありがとう背景を反転するトリガー。必要なのはウィンドウレベルのEventTriggerです。

は、MouseEnterイベントに0期間を持つキーフレームまたは個別の色のアニメーションを開始し、MouseLeaveに言及した絵コンテ削除

:できないことは何かを必要とする場合には、

<Window.Triggers> 
    <EventTrigger RoutedEvent="Mouse.MouseEnter" SourceName="button"> 
     <BeginStoryboard x:Name="Change_Control_Background_Start" 
      Storyboard="{StaticResource Change_Control_Background}"/> 
    </EventTrigger> 
    <EventTrigger RoutedEvent="Mouse.MouseLeave" SourceName="button"> 
     <RemoveStoryboard 
      BeginStoryboardName="Change_Control_Background_Start"/> 
    </EventTrigger> 
</Window.Triggers> 
+0

ありがとうございました! EventSetterやRoutedUICommandでこれを実現することも可能でしょうか? –

+0

EventSetterで行うことは可能ですが、コードビハインドハンドラが必要になります(この場合、ボタンによって直接マウスイベントを処理することさえできます)。 RoutedUICommandに関しては、それは良い一致ではありません。コマンドはユーザーが意図的に行うものであり、ホバリングはこのカテゴリに該当しません。 –

1

セルゲイの答えは、それを行う方法があるがあなたはいつものDataTemplateであなたのコントロールをラップし、それを表示するためのContentPresenterを使用することができますEventTriggerで行わ:

<Window x:Class="WpfApplication1.SimpleUCTry1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1.SimpleUCTry1" 
    Title="Window1" Height="300" Width="300"> 
    <ContentPresenter Content="{Binding}"> 
     <ContentPresenter.ContentTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <local:Simple Name="Ctrl1" /> 
        <Button Name="Ctrl2" Content="Foo" /> 
       </StackPanel> 
       <DataTemplate.Triggers> 
        <Trigger SourceName="Ctrl2" Property="IsMouseOver" Value="True"> 
         <Setter TargetName="Ctrl1" Property="Background" Value="Blue"/> 
        </Trigger> 
       </DataTemplate.Triggers> 
      </DataTemplate> 
     </ContentPresenter.ContentTemplate> 
    </ContentPresenter> 
</Window> 
+0

これは素晴らしい方法です - AndyにはすでにUserControlがあるので。言及されたボタンを追加するだけで(既に定義されているように)、既に述べたContentPresenterのトリックを使用してください。 –

1

しかし、それを行うためのもう一つの方法は、(背後にあるいくつかのコードが必要ですが、おそらく最もクリーン}

です
<StackPanel> 
    <local:Simple Background="{Binding ElementName=bnFoo, 
        Path=IsMouseOver, 
        Converter={StaticResource boolToBackgroundConv}}"/> 
    <Button Name="bnFoo" Content="Foo" /> 
</StackPanel> 
関連する問題