2016-03-31 3 views
0

Was ist der richtige Weg, um einen standardmäßigen Schaltflächeneffekt in einer benutzerdefinierten Schaltflächenvorlage in WPF auszulösen? Dieses Verhalten ähnelt dem Verhalten von Windows 7 beim Leuchten der Schaltfläche und dem dicken Umriss von Windows 8/10 für fokussierte und voreingestellte Schaltflächen.Auslöser und Eingabe-/Beendigungsaktionen für IsDefaulted und IsKeyboardFocused button storyboard

. (Anmerkung: Vanille-WPF-Projekte in Windows 7 die fokussierte/notleidenden Taste leuchten nicht zeigen kann, die im Rest des Betriebssystems vorhanden ist, Oh, Microsoft ...)

Ich habe versucht, dieses:

Das Verhalten scheint zu sein wie erwartet, aber es erzeugt eine Menge Warnungen - eine Warnung pro Knopf, wie sie auf dem Bildschirm geladen werden.

System.Windows.Media.Animation Warnung: 6: Aktion kann nicht ausgeführt werden, da das angegebene Storyboard niemals auf dieses Objekt zur interaktiven Steuerung angewendet wurde .; Aktion = 'Entfernen'; Storyboard = 'System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode = '16952812'; Storyboard.Type = 'System.Windows.Media.Animation.Storyboard'; TargetElement = 'System.Windows.Controls.Button: Speichern'; TargetElement.HashCode = '37829947'; TargetElement.Type = ‚System.Windows.Controls.Button‘

Meine etwas ausführlichere Lösung produziert noch Warnungen - wenn auch nur auf den Fokus verliert - und funktioniert nicht wie erwartet: wenn sie von der Standardschaltfläche Tabbing zu eine andere Taste, die Standardtaste leuchtet weiter.

<Trigger Property="IsDefaulted" Value="True"> 
    <Trigger.EnterActions> 
     <BeginStoryboard x:Name="IsDefaultedStoryboard" Storyboard="{StaticResource IsDefaultedStoryboard}" /> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
     <RemoveStoryboard BeginStoryboardName="IsDefaultedStoryboard" /> 
    </Trigger.ExitActions> 
</Trigger> 
<Trigger Property="IsKeyboardFocused" Value="True"> 
    <Trigger.EnterActions> 
     <BeginStoryboard x:Name="IsFocusedStoryboard" Storyboard="{StaticResource IsDefaultedStoryboard}" /> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
     <RemoveStoryboard BeginStoryboardName="IsFocusedStoryboard" /> 
    </Trigger.ExitActions> 
</Trigger> 

Vielleicht ist es akzeptabel, die Lösung # 1 zu verwenden und ignorieren Sie einfach die Warnung, aber ich würde es lieber nicht. Was ist der bessere Weg, dies zu tun?

Das Storyboard ist nichts Aufregendes:

<Storyboard x:Key="IsDefaultedStoryboard" RepeatBehavior="Forever"> 
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="IsDefaulted" Storyboard.TargetProperty="(UIElement.Opacity)"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="0" /> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0" /> 
     <EasingDoubleKeyFrame KeyTime="0:0:2.0" Value="1" /> 
     <EasingDoubleKeyFrame KeyTime="0:0:4.0" Value="0" /> 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 
+0

Im ersten Teil des Codes, warum entfernen Sie bei der Eingabe und StartStoryboard beim Beenden? –

+0

@GordonAllocman Da ich im Wesentlichen sage, wenn Sie weder fokussiert noch voreingestellt sind, sollten Sie kein Storyboard haben. Wenn Sie fokussiert oder voreingestellt sind (d. H. Der MultiTrigger erfüllt nicht mehr alle Bedingungen), sollten wir mit dem Glow-Storyboard beginnen. Ich denke, die Logik ist solide, aber es ist falsch, Storyboards zu entfernen, die noch nicht erstellt wurden. – Guttsy

+0

Der erste Fehler (Warnung 6) ist, wie Gordon anspielt; weil es versucht, ein Storyboard zu entfernen, das noch nicht einmal begonnen hat. Ich selbst habe keinen besseren Weg gefunden, die Erinnerung in Schach zu halten. – Logan

Antwort

0

ich eine identische Kopie des Storyboards machen schließlich und wandte sie durch zwei getrennte Auslöser, dh

<Trigger Property="IsDefaulted" Value="True"> 
    <Setter TargetName="buttonStroke" Property="Opacity" Value=".5" /> 
    <Trigger.EnterActions> 
     <BeginStoryboard x:Name="IsDefaultedStoryboard" Storyboard="{StaticResource IsDefaultedStoryboard}" /> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
     <RemoveStoryboard BeginStoryboardName="IsDefaultedStoryboard" /> 
    </Trigger.ExitActions> 
</Trigger> 
<Trigger Property="IsKeyboardFocused" Value="True"> 
    <Setter TargetName="buttonStroke" Property="Opacity" Value=".5" /> 
    <Trigger.EnterActions> 
     <BeginStoryboard x:Name="IsKeyboardFocusedStoryboard" Storyboard="{StaticResource IsKeyboardFocusedStoryboard}" /> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
     <RemoveStoryboard BeginStoryboardName="IsKeyboardFocusedStoryboard" /> 
    </Trigger.ExitActions> 
</Trigger> 

Ich mag nicht die Vervielfältigung , aber es erzeugt keine Warnungen und funktioniert wie erwartet.