Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用情节提要平滑WPF触发器中的退出_C#_Wpf_Xaml_Wpf Animation - Fatal编程技术网

C# 使用情节提要平滑WPF触发器中的退出

C# 使用情节提要平滑WPF触发器中的退出,c#,wpf,xaml,wpf-animation,C#,Wpf,Xaml,Wpf Animation,我有一个WPF应用程序,在这里我想覆盖丑陋的默认WPF样式。我已经创建了Styles.xaml字典,在这里我几乎已经完成了样式,但是在动画和不同视觉状态(触发器)之间的平滑转换方面存在一些问题 我面临的一个挑战是,我不想将任何C事件处理程序或其他C代码绑定到样式 这里我提供了一些关于触发器的代码: <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsEnabled"

我有一个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,并将情节串联板和计时放在这里,这样进入动画就很流畅,看起来也不错

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

现在我真的不知道我的想法出来了-如何使顺利退出动画?我不应该使用RemoveStoryboard吗

请提供建议。谢谢


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

添加一个新的动画对象,该对象在“输入动作”动画持续时间结束时开始。 或者使用触发器的
ExitAction
属性,添加一个
情节提要
,恢复您的
输入
。 或者您可以尝试将
Fillbehavior
属性设置为“停止…”


另一种选择是使用
EventSetter
捕捉
RoutedEvents
MouseEnter
MouseLeave

则第一种行为是不好的。我有MouseOver事件,如果我将FillBehavior设置为Stop,那么在动画之后,我的按钮变成默认样式。它必须是鼠标悬停的样式。那么为什么不在你的ExitActions中添加另一个BeginStoreBoard呢?您还可以添加另一个触发器,该触发器在IsMousOver==false时触发。也可以通过在触发器中使用简单的Setter来设置Background属性。如果触发器无效,这将自动还原设置。因为默认状态颜色不能是我从样式中设置的颜色。如果用户将其颜色笔刷从视图中移开,则另一个BeginStoryboard将覆盖该颜色并返回到我预定义的颜色…使用EventSetter(MouseEnter,MouseLeave)我认为使用静态资源笔刷(如“DefaultBackgroundBrush”)更干净。应用程序只会更改该笔刷的颜色以设置新的默认颜色。现在,在控制视觉状态的触发器中,可以显式地将其设置回“Background={StaticResource DefaultBackgroundBrush}”,或者像我之前写的那样,只使用一个公共Setter。一旦触发器无效,该值将返回到以前的状态。使用这种方法,您不需要关心实际的默认颜色。它是DefaultBackgroundBrush的当前颜色。