【问题标题】:Smooth ExitAction in WPF Trigger using Storyboard使用情节提要的 WPF 触发器中的平滑 ExitAction
【发布时间】:2015-09-02 14:38:34
【问题描述】:

我有一个 WPF 应用程序,在这里我想覆盖丑陋的默认 WPF 样式。我已经创建了 Styles.xaml 字典,在这里我几乎完成了样式,但是在动画和不同视觉状态(触发器)之间的平滑过渡方面存在一些问题。

我的一个挑战是我不想让任何 C# 事件处理程序或其他 C# 代码绑定到样式。

这里我提供了一些关于我的触发器的代码:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsEnabled" Value="True" />
        <Condition Property="IsMouseOver" Value="True" />
        <Condition Property="IsPressed" Value="False" />
    </MultiTrigger.Conditions>
    <MultiTrigger.EnterActions>
        <BeginStoryboard Name="MouseOverStoryboard">
            <Storyboard Duration="0:0:0.25" SlipBehavior="Grow">
                <ColorAnimation Storyboard.TargetName="InnerBorder" 
                                Storyboard.TargetProperty="Background.(SolidColorBrush.Color)" 
                                To="{StaticResource White}" 
                                BeginTime="0:0:0" Duration="0:0:0.25" />
                <DoubleAnimation Storyboard.TargetName="InnerBorder" 
                                 Storyboard.TargetProperty="Opacity" 
                                 To="0.3" 
                                 BeginTime="0:0:0" Duration="0:0:0.25" />
            </Storyboard>
        </BeginStoryboard>
    </MultiTrigger.EnterActions>
    <MultiTrigger.ExitActions>
        <RemoveStoryboard BeginStoryboardName="MouseOverStoryboard" />
    </MultiTrigger.ExitActions>
</MultiTrigger>

为了使动画流畅,我添加了 EnterAction 并将 Storyboard 放在这里,因此输入动画很流畅,看起来很好。

我的第一个问题是关于如何在执行 BeginStoryboard 时恢复默认颜色,但后来我意识到我可以使用 RemoveStoryboard。

现在我真的不知道我的想法已经出来了 - 如何制作流畅的退出动画?我不应该使用 RemoveStoryboard 吗?

请提供建议。谢谢。

P。 S. 我没有使用 VisualStateManager,因为缺少状态,我不想为此实现自己的控件。

【问题讨论】:

    标签: c# wpf xaml wpf-animation


    【解决方案1】:

    如何添加一个新的动画对象,该对象在输入动作动画持续时间过去时开始。 或者如何使用触发器的ExitAction 属性,通过添加一个Storyboard 来恢复您的EnterAction。 或者您可以尝试将Fillbehavior 属性设置为'停止...

    另一种选择是使用EventSetter 来捕获RoutedEvents,例如MouseEnterMouseLeave

    【讨论】:

    • 那么第一个行为是不好的。我有 MouseOver 事件,如果我将 FillBehavior 设置为 Stop,那么在动画之后我的按钮就会变成默认样式。它必须是 MouseOver 样式。
    • 那么为什么不向您的 ExitActions 添加另一个 BeginStoryboard 呢?您还可以添加另一个在 IsMousOver == false 时触发的触发器。或者,也可以通过在 Trigger 中使用简单的 Setter 来设置 Background 属性。如果触发器无效,这将自动恢复设置。
    • 因为默认状态颜色不能是我从样式中设置的颜色。如果用户从他的视图中放置他的颜色画笔,那么另一个 BeginStoryboard 将覆盖该颜色并返回到我预定义的颜色...
    • 使用 EventSetter (MouseEnter, MouseLeave)
    • 我认为使用像“DefaultBackgroundBrush”这样的静态资源画笔更干净。您的应用程序只会更改该画笔的颜色以设置新的默认颜色。现在,在控制视觉状态的触发器中,您可以将其显式设置回“Background={StaticResource DefaultBackgroundBrush}”,或者正如我之前所写的,只需使用一个通用的 Setter。一旦触发器无效,该值将立即返回到以前的状态。使用这种方法,您不需要关心实际的默认颜色。它是 DefaultBackgroundBrush 的当前颜色是什么样的。
    猜你喜欢
    • 2012-04-27
    • 2012-07-08
    • 2020-01-01
    • 2011-07-11
    • 2017-10-28
    • 2015-02-14
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多