2016-05-09 4 views
0

Ich möchte eine Bildschaltfläche mit verschiedenen Hervorhebungs-Effekten auf IsMouseOver und auf IsPressed-Ereignissen erstellen. Der Code Ich verwende:Warum funktionieren mehrere DataTriggers auf demselben Steuerelement nicht?

<Button Style="{StaticResource AccentedSquareButtonStyle}" x:Name="button" Background="Transparent" BorderThickness="0" Foreground="Transparent" Grid.Column="1" HorizontalAlignment="Left" Margin="142,-2,0,0" VerticalAlignment="Top" Width="75"> 
      <Grid Background="Transparent"> 
       <ContentControl> 
        <ContentControl.Style> 
         <Style TargetType="{x:Type ContentControl}"> 
          <Setter Property="Content" Value="{StaticResource printIcon}"/> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=IsPressed}" Value="True" > 
            <Setter Property="Content" Value="{StaticResource printIconClicked}"/> 
           </DataTrigger> 
           <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=IsMouseOver}" Value="True" > 
            <Setter Property="Content" Value="{StaticResource printIconHighlighted}"/> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </ContentControl.Style> 
       </ContentControl> 
      </Grid> 
     </Button> 

Der Code funktioniert nur, wenn ich die DataTriggers separat verwenden, aber in dieser Form nur der Mouseover-Effekt Hervorhebung verwendet wird. Ich benutze MahApps Framework. Was mache ich falsch?

+0

ich es Versuch und Irrtum mit herausgefunden. Es funktioniert, wenn ich die Positionen der DataTriggers invertiere, aber ich habe keine Ahnung warum. –

Antwort

1

Wie Sie herausgefunden haben, hat dies mit der Reihenfolge zu tun, in der Ihre Triggers definiert wurden. Da Sie an zwei verschiedene Pfade binden (beide in Bezug auf die Maus), ist die Reihenfolge, in der sie definiert sind, wichtig, da sie bestimmt, welcher zuerst ausgelöst wird.

Wenn Sie auf eine Schaltfläche klicken, wird die Reihenfolge der Ereignisse sind:

  1. Maus schwebt über
  2. Knopf

So gedrückt wird, was mit der aktuellen Trigger passiert:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=IsPressed}" Value="True" > 
    <Setter Property="Content" Value="{StaticResource printIconClicked}"/> 
</DataTrigger> 
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=IsMouseOver}" Value="True" > 
    <Setter Property="Content" Value="{StaticResource printIconHighlighted}"/> 
</DataTrigger> 

Der Maus-Hover ist der einzige, der die Einstellung tut, weil Ihre Mous Der Zeiger ist "über" der Taste, während er gedrückt wird. Diese Implementierung sollte jedoch funktionieren, wenn Sie die Taste drücken und dann "wegziehen", während Sie weiterhin die linke Maustaste gedrückt halten. Dies ist jedoch nicht ideal.

zu beheben, tauschen nur die Reihenfolge, wenn die Daten-Trigger (da um does matter)

<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=IsMouseOver}" Value="True" > 
    <Setter Property="Content" Value="{StaticResource printIconHighlighted}"/> 
</DataTrigger> 
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=IsPressed}" Value="True" > 
    <Setter Property="Content" Value="{StaticResource printIconClicked}"/> 
</DataTrigger> 
-1

Weitere Informationen zu Multitriggern finden Sie im Wpf-Tutorialblog. Hier ist der Link: http://www.wpf-tutorial.com/styles/multi-triggers-multitrigger-multidatatrigger/

Lassen Sie mich wissen, ob dies Ihre Frage beantwortet.

+0

Danke! Es hilft mir nicht. Es wäre gut, wenn ich herausfinden würde, warum die Trigger nur funktionieren, wenn sie in der folgenden Reihenfolge geschrieben werden: IsMouseOver, dann IsPressed. –

Verwandte Themen