2009-06-28 6 views
0

débutant WPF ici si excuse la question simple. Comment puis-je déclencher un déclencheur sur un UserControl à partir d'un contrôle en dehors de ce UserControl? Voici ce que je veux faire ...Activer déclenchement du contrôle étranger

J'ai un UserControl avec un déclencheur configuré pour afficher un changement de couleur de fond sur lui-même quand IsMouseOver est vrai. Si je souris sur UserControl, le déclencheur se déclenche comme prévu. Ce que je voudrais faire est de créer une fenêtre qui contient le UserControl et un bouton, et lorsque les utilisateurs mouses sur le bouton, le feu de déclenchement du UserControl. Quelque chose comme:

<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> 

Donc, si l'utilisateur sur le bouton mouses "Foo", le "simple" déclencheur de UserControl tireraient.

Est-ce possible?

Merci, Andy

Répondre

2

Étant donné que votre commande est « externe » au bouton, vous ne pouvez pas utiliser les déclencheurs de propriété ou les données déclencheurs pour retourner l'arrière-plan. Ce dont vous avez besoin est un EventTrigger au niveau de la fenêtre.

Démarrer une image clé ou une animation de couleur discrète avec 0 durée sur MouseEnter et retirer le story-board mentionné sur 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

Merci pour votre réponse! Serait-il également possible d'accomplir ceci avec un EventSetter ou un RoutedUICommand peut-être? –

+0

Il est possible de faire avec EventSetter, mais aurait besoin d'un code-behind gestionnaire (dans ce cas, vous pouvez même gérer les événements de la souris directement sur le bouton). Comme pour RoutedUICommand, ce n'est pas une bonne correspondance. La commande est quelque chose que l'utilisateur fait délibérément, et le vol stationnaire ne tombe pas dans cette catégorie. Ce –

1

La réponse de Sergey est la façon de le faire, dans le cas où vous avez besoin quelque chose qui ne peut pas être fait avec EventTrigger vous pouvez toujours envelopper vos commandes dans un DataTemplate et utiliser ContentPresenter pour le montrer:

<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

est une belle façon de le faire - car Andy a déjà le UserControl. Il suffit d'ajouter le bouton mentionné (par définition, il est déjà lié visuellement) et d'utiliser l'astuce ContentPresenter mentionnée. –

1

Encore un moyen de le faire (nécessite un code derrière mais est probablement le plus propre}

<StackPanel> 
    <local:Simple Background="{Binding ElementName=bnFoo, 
        Path=IsMouseOver, 
        Converter={StaticResource boolToBackgroundConv}}"/> 
    <Button Name="bnFoo" Content="Foo" /> 
</StackPanel> 
Questions connexes