Frage

Ich habe gefragt eine Frage hier aber dann habe ich erkannte mein Problem nicht der Code aber der Stil ich verwende für eine Schaltfläche war. Da das Problem zunächst gefragt, ganz anders als die, dachte ich, es wäre für andere Nutzer mehr von Vorteil sein, wenn ich nur gefragt, die „richtige“ Frage wieder. Hier gehe ich:

Ich verwende die Vorlage unten in meiner Taste. Wenn ich gesetzt button.IsEnabled = false funktioniert es in Ordnung, aber wenn ich button.IsEnabled = true gesetzt es nicht aktiviert ist erhalten. Können Sie bitte lokalisieren, was ich falsch mache? Dank

<Style x:Key="BlackButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <ControlTemplate.Resources>
                    <Storyboard x:Key="MouseOverActivating">
                        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00" Value="#FF2F2F2F"/>
                            <SplineColorKeyFrame KeyTime="00:00:00.1270000" Value="#FF2391FF"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>
                    <Storyboard x:Key="MouseOverDeactivating">
                        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="rectangle">
                            <SplineColorKeyFrame KeyTime="00:00:00" Value="#FF2391FF"/>
                            <SplineColorKeyFrame KeyTime="00:00:00.2200000" Value="#FF2F2F2F"/>

                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>
                    <Storyboard x:Key="PressActivating">
                        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00" Value="#FF2391FF"/>
                            <SplineColorKeyFrame KeyTime="00:00:00.1370000" Value="#FF48D6FF"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>
                    <Storyboard x:Key="PressedDeactivating" FillBehavior="Stop" >
                        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="rectangle">
                            <SplineColorKeyFrame KeyTime="00:00:00" Value="#FF48D6FF"/>
                            <SplineColorKeyFrame KeyTime="00:00:00.2370000" Value="#FF2391FF"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>
                    <Storyboard x:Key="DisableActivating">
                        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00" Value="#FFA7A7A7"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>
                </ControlTemplate.Resources>
                <Grid>
                    <Rectangle Stroke="Transparent" RadiusX="5" RadiusY="5" x:Name="rectangle">
                        <Rectangle.Fill>
                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                <GradientStop Color="#FF000000" Offset="0"/>
                                <GradientStop Color="#FF2F2F2F" Offset="1"/>
                            </LinearGradientBrush>
                        </Rectangle.Fill>
                    </Rectangle>
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True" OpacityMask="{x:Null}"/>
                    <Rectangle Stroke="Transparent" RadiusX="5" RadiusY="5" x:Name="WhiteGlow">
                        <Rectangle.Fill>
                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                <GradientStop Color="#5BFFFFFF" Offset="0"/>
                                <GradientStop Color="#00FFFFFF" Offset="0.5"/>
                            </LinearGradientBrush>
                        </Rectangle.Fill>
                    </Rectangle>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsCancel" Value="False"/>
                    <EventTrigger RoutedEvent="FrameworkElement.Loaded"/>
                    <Trigger Property="IsFocused" Value="True">
                        <Trigger.ExitActions>
                            <BeginStoryboard Storyboard="{StaticResource MouseOverActivating}" x:Name="MouseOverActivating_BeginStoryboard2"/>
                        </Trigger.ExitActions>
                        <Trigger.EnterActions>
                            <BeginStoryboard Storyboard="{StaticResource MouseOverActivating}" x:Name="MouseOverActivating_BeginStoryboard1"/>
                        </Trigger.EnterActions>
                    </Trigger>
                    <Trigger Property="IsDefaulted" Value="True"/>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Trigger.ExitActions>
                            <BeginStoryboard Storyboard="{StaticResource MouseOverDeactivating}" x:Name="MouseOverDeactivating_BeginStoryboard"/>
                        </Trigger.ExitActions>
                        <Trigger.EnterActions>
                            <BeginStoryboard Storyboard="{StaticResource MouseOverActivating}" x:Name="MouseOverActivating_BeginStoryboard"/>
                        </Trigger.EnterActions>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True">
                        <Trigger.EnterActions>
                            <BeginStoryboard x:Name="PressActivating_BeginStoryboard" Storyboard="{StaticResource PressActivating}"/>
                        </Trigger.EnterActions>
                        <Trigger.ExitActions>
                            <BeginStoryboard x:Name="PressedDeactivating_BeginStoryboard" Storyboard="{StaticResource PressedDeactivating}"/>
                        </Trigger.ExitActions>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Trigger.EnterActions>
                            <BeginStoryboard Storyboard="{StaticResource DisableActivating}" x:Name="DisableActivating_BeginStoryboard"/>
                        </Trigger.EnterActions>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
War es hilfreich?

Lösung

Ich vermute, dass das Verhalten, das Sie sehen, sind ein Ergebnis der Animation ist, dass Sie verwenden, wenn IsEnabled falsch wird. DependencyProperties hat tatsächlich einen Vortritt sie verbunden ist, in den Animationen sind auf der Liste nach oben; dass Hierarchie, von MSDN , ist:

  
      
  • Property System Zwang
  •   
  • Aktive Animationen oder Animationen mit einem Hold-Verhalten.
  •   
  • Lokale Wert
  •   
  • TemplatedParent Vorlageneigenschaften
  •   
  • Implizite Stil
  •   
  • Style Trigger
  •   
  • Template Auslöser
  •   
  • Style Setter
  •   
  • Standard (Thema) Stil
  •   
  • geerbt von Eltern
  •   
  • Standardwert von Abhängigkeitseigenschaft Metadaten
  •   

Standardmäßig Animationen haben eine FillBehavior von HoldEnd, was bedeutet, dass sie auf dem Wert bleiben, die die Animation zu Ende. Wenn IsEnabled Wahr wird durch Ihre Bindung tritt das Update auf der ‚Local Wert‘ Ebene in dem Vorrang, und da die DisableActivating Storyboard auf einer höheren Ebene des Vorrangs das Aussehen hält ( ‚Animationen mit einem Hold-Verhalten‘), die Sie nie sehen die Taste ändern, sobald es das erste Mal geändert.

Es gibt drei Lösungen für diese:

  1. Aktualisieren Sie Ihre Animation eine FillBehavior Stop zu haben, was bedeutet, dass die Animation nicht behaupten, wird die ‚IsEnabled = False‘ visuelle, sobald die Animation stoppt. Sie erhalten eine Standard, nicht-animierte Trigger mit dem gleichen Zustand wie das Ende der Animation müssen weiterhin diese geltend zu machen, sobald die Animation abgeschlossen ist, da sonst werden Sie sehen, es nur auf den Zustand wieder zurück war es, wenn die Animation begann . Da es nur ein Trigger-Set, wenn der lokale Wert aktualisiert wird, werden Sie es auf den ursprünglichen Wert zurückkehren sehen, wie Sie es erwarten. Da auch die Animation von höherer Priorität ist, können Sie den Stil festgelegt und die Animation starten gleichzeitig und nur „sehen“ die Auswirkungen des Stils, sobald die Animation abgeschlossen ist (so Ihre verblassen wird wie erwartet).
  2. Statt die FillBehavior ändern, können Sie einen neuen Trigger erstellen können, die gilt, wenn IsEnabled Wahr ist, dass belebt (vielleicht augenblicklich) zurück in den ursprünglichen Zustand zurück. Dies kann auch durch Anlegen einer Animation in der Triggers ExitAction erfolgen. Da es auch eine Animation ist aber später angewendet wird, wird es den HoldEnd Zustand der anderen Animation außer Kraft setzen. In gewissem Sinne ist dies einfacher, dass die Option 1, aber es kann ein Streit zu einem Vorwärts- und Rückwärts-Animation zu halten, besonders wenn man die umgekehrte Animation für einen bestimmten visuellen Effekt nicht brauchen; Sie mögen es halten verblasst in und aus dem deaktivierten Zustand jedoch.
  3. Geben Sie eine ExitAction auf Ihre IsEnabled Trigger Fügen Sie das Storyboard zu stoppen, verhindern, dass die Animation von der Fortsetzung der Wert, den es hatte am Ende der Animation zu behaupten, so dass der lokale Wert Stil angewendet werden kann. Diese Option hat die Vorteile des nicht den Stil wiederholen zu müssen (wie in # 1), während auch die Animation nicht umkehren, die (wie in # 2).

Von den drei Lösungen, ist die letzte wahrscheinlich das sauberste architektonisch (es sei denn, Sie haben einen bestimmten Grund, wie brauchen beide in und aus zu verblassen, eine der anderen Optionen zu bevorzugen - oder eine Kombination der Optionen oben).

Andere Tipps

Die einfachste Möglichkeit ist, eine Animation, die die IsEnabled Trigger ExitAction hinzuzufügen, die die Animation im EnterAction

zufällt
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top