当按下按钮时,状态转换如下:
Normal -> MouseOver -> Normal -> Pressed -> Normal -> MouseOver我遇到的问题是,MouseOver和Pressed状态在视觉上有很多共同之处,而在这些状态之间向正常的过渡会使动画变得混乱。作为一个更实际的例子,我有一个按钮,默认情况下它有一个黑色边框,它在MouseOver和Pressed状态中有一个绿色边框。当我按它的时候,它首先从绿色变成黑色,然后变成绿色,这是不可取的。在这种情况下,有没有办法跳过Normal状态,或者让它看起来很糟糕?

这是按钮的模板:
<Button Command="{Binding PlayScene}" Width="220">
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border"
BorderThickness="3"
Margin="2 0"
BorderBrush="{DynamicResource ButtonBorderBrush}"
RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Border.RenderTransform>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.2"/>
<VisualTransition GeneratedDuration="0:0:0.2" To="Pressed">
<VisualTransition.GeneratedEasingFunction>
<BackEase EasingMode="EaseOut"/>
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
<VisualTransition GeneratedDuration="0:0:0.1" To="MouseOver"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush)" Storyboard.TargetName="border">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource HighlightBrush}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(Brush.RelativeTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="border">
<EasingDoubleKeyFrame KeyTime="0" Value="1.1"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(Brush.RelativeTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="border">
<EasingDoubleKeyFrame KeyTime="0" Value="1.1"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="border">
<EasingDoubleKeyFrame KeyTime="0" Value="0.95"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="border">
<EasingDoubleKeyFrame KeyTime="0" Value="0.95"/>
</DoubleAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush)" Storyboard.TargetName="border">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource HighlightDarkBrush}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border.Background>
<ImageBrush ImageSource="{Binding Image}" Stretch="UniformToFill">
<ImageBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterY="0.5" CenterX="0.5"/>
<SkewTransform CenterY="0.5" CenterX="0.5"/>
<RotateTransform CenterY="0.5" CenterX="0.5"/>
<TranslateTransform/>
</TransformGroup>
</ImageBrush.RelativeTransform>
</ImageBrush>
</Border.Background>
<ContentPresenter x:Name="contentPresenter" />
</Border>
</ControlTemplate>
</Button.Template>
</Button>发布于 2015-11-17 16:16:16
视觉状态转换在进入实际状态之前运行。由于您没有在转换中设置画笔,所以它们将默认为基值(在本例中为ButtonBorderBrush)。我不完全确定您的期望结果,但我的示例假设您希望立即将颜色从HighlightBrush (处于MouseOver状态)更改为HighlightDarkBrush (处于按下状态),显然,如果希望从一种颜色淡出到另一种颜色,则可以更改故事板动画动画以实现这一点。
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.2"/>
<VisualTransition GeneratedDuration="0:0:0.2" To="Pressed">
<VisualTransition.GeneratedEasingFunction>
<BackEase EasingMode="EaseOut"/>
</VisualTransition.GeneratedEasingFunction>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush)" Storyboard.TargetName="border">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource HighlightDarkBrush}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualTransition>
<VisualTransition GeneratedDuration="0:0:0.1" To="MouseOver"/>
本质上,您需要将Storyboard添加到按下状态和to=Pressed转换。如果只将其添加到转换中,则颜色将在进入状态后恢复。
还请注意,虽然它可能看起来像是转换序列是
MouseOver -> Normal-> Pressed事实上,情况并非如此。如果您给正常状态一些值(目前它使用的是基值),您可以看到如下所示:
<VisualState x:Name="Normal">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush)" Storyboard.TargetName="border">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource TestBrush}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>如果(例如) TestBrush是红色画笔,则只有当鼠标尚未结束时,边框才会红色。在各州之间,它将是黑色的(ButtonBorderBrush)
https://stackoverflow.com/questions/33691926
复制相似问题