RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 875973
Accepted
Arasfon
Arasfon
Asked:2020-09-01 01:42:26 +0000 UTC2020-09-01 01:42:26 +0000 UTC 2020-09-01 01:42:26 +0000 UTC

将 IsEnabled 设置为 false 后阻止 MouseLeave 按钮上的动画

  • 772

我有一个我自己风格的按钮:

<ControlTemplate x:Key="Button_Standard" TargetType="{x:Type Button}">
    <ControlTemplate.Resources>

        <Storyboard x:Key="Mouse_Enter">
            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="border">
                <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FF2CA58D"/>
            </ColorAnimationUsingKeyFrames>
            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="border">
                <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FF397C6E"/>
            </ColorAnimationUsingKeyFrames>
        </Storyboard>
        <Storyboard x:Key="Mouse_Leave">
            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="border">
                <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FF2CA58D"/>
            </ColorAnimationUsingKeyFrames>
            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(TextElement.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="textBlock">
                <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FFFBF5F3"/>
            </ColorAnimationUsingKeyFrames>
        </Storyboard>

        <Storyboard x:Key="Mouse_LeftButton_Down">
            <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" Storyboard.TargetName="border">
                <EasingThicknessKeyFrame KeyTime="0:0:0.03" Value="2"/>
            </ThicknessAnimationUsingKeyFrames>
            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="border">
                <EasingColorKeyFrame KeyTime="0:0:0.03" Value="#FF1C473F"/>
            </ColorAnimationUsingKeyFrames>
        </Storyboard>
        <Storyboard x:Key="Mouse_LeftButton_Up">
            <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" Storyboard.TargetName="border">
                <EasingThicknessKeyFrame KeyTime="0:0:0.05" Value="0"/>
            </ThicknessAnimationUsingKeyFrames>
            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="border">
                <EasingColorKeyFrame KeyTime="0:0:0.05" Value="#FF1C473F"/>
            </ColorAnimationUsingKeyFrames>
        </Storyboard>

    </ControlTemplate.Resources>

    <Border x:Name="border" CornerRadius="7.5" BorderBrush="Black">
        <Border.Background>
            <RadialGradientBrush>
                <GradientStop Color="#FF2CA58D" Offset="0"/>
                <GradientStop Color="#FF2CA58D" Offset="1"/>
            </RadialGradientBrush>
        </Border.Background>

        <Border.Effect>
            <DropShadowEffect/>
        </Border.Effect>

        <TextBlock x:Name="textBlock" TextWrapping="Wrap" Text="{TemplateBinding Content}" TextAlignment="Center" VerticalAlignment="Center" Foreground="White"/>
    </Border>

    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Background" TargetName="border">
                <Setter.Value>
                    <RadialGradientBrush>
                        <GradientStop Color="#FF474747" Offset="0"/>
                        <GradientStop Color="#FF474747" Offset="1"/>
                    </RadialGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="Foreground" TargetName="textBlock" Value="#FF959595"/>
        </Trigger>
        <EventTrigger RoutedEvent="UIElement.PreviewMouseLeftButtonUp">
            <BeginStoryboard x:Name="Mouse_LeftButton_Up_BeginStoryboard" Storyboard="{StaticResource Mouse_LeftButton_Up}"/>
        </EventTrigger>
        <EventTrigger RoutedEvent="UIElement.MouseEnter">
            <BeginStoryboard x:Name="Mouse_Enter_BeginStoryboard" Storyboard="{StaticResource Mouse_Enter}"/>
        </EventTrigger>
        <EventTrigger RoutedEvent="UIElement.MouseLeave">
            <BeginStoryboard x:Name="Mouse_Leave_BeginStoryboard" Storyboard="{StaticResource Mouse_Leave}"/>
        </EventTrigger>
        <EventTrigger RoutedEvent="UIElement.PreviewMouseLeftButtonDown">
            <BeginStoryboard x:Name="Mouse_LeftButton_Down_BeginStoryboard" Storyboard="{StaticResource Mouse_LeftButton_Down}"/>
        </EventTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

当我将它设置为 IsEnabled = false 并且光标在按钮上时,而不是仅仅将颜色更改为:

正常禁用按钮的图片

另外,触发了 MouseLeave 触发器上的动画,得到如下的乱码:

按钮异常禁用图片

普通按钮:

普通非禁用按钮

现在我需要以某种方式阻止动画,因为在动画后等待 300 毫秒不是很好,因为按钮的 IsEnabled 取决于 TextBox 中文本的存在,并且也与手鼓一起跳舞。

将 IsEnabled 分配给按钮:

btn_next.IsEnabled = tb.Text != "";
c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    VladD
    2020-09-03T06:56:40Z2020-09-03T06:56:40Z

    用 VisualStateManager 试试,用起来容易多了。同时,不需要反向动画。

    我得到它是这样的:

    <ControlTemplate x:Key="Button_Standard" TargetType="{x:Type Button}">
        <ControlTemplate.Resources>
            <Storyboard x:Key="Mouse_Enter">
                <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="border">
                    <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FF2CA58D"/>
                </ColorAnimationUsingKeyFrames>
                <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="border">
                    <EasingColorKeyFrame KeyTime="0:0:0.2" Value="#FF397C6E"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
    
            <Storyboard x:Key="Mouse_LeftButton_Down">
                <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" Storyboard.TargetName="border">
                    <EasingThicknessKeyFrame KeyTime="0:0:0.03" Value="2"/>
                </ThicknessAnimationUsingKeyFrames>
                <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="border">
                    <EasingColorKeyFrame KeyTime="0:0:0.03" Value="#FF1C473F"/>
                </ColorAnimationUsingKeyFrames>
                <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="border">
                    <EasingColorKeyFrame KeyTime="0:0:0.5" Value="#FF2CA58D"/>
                </ColorAnimationUsingKeyFrames>
                <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="border">
                    <EasingColorKeyFrame KeyTime="0:0:0.5" Value="#FF397C6E"/>
                </ColorAnimationUsingKeyFrames>
    
            </Storyboard>
    
            <Storyboard x:Key="DisabledStoryboard">
                <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="border">
                    <EasingColorKeyFrame KeyTime="0:0:0.0" Value="#FF474747"/>
                </ColorAnimationUsingKeyFrames>
                <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="border">
                    <EasingColorKeyFrame KeyTime="0:0:0.0" Value="#FF474747"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
        </ControlTemplate.Resources>
    
        <Border x:Name="border" CornerRadius="7.5" BorderBrush="Black">
            <Border.Background>
                <RadialGradientBrush>
                    <GradientStop Color="#FF2CA58D" Offset="0"/>
                    <GradientStop Color="#FF2CA58D" Offset="1"/>
                </RadialGradientBrush>
            </Border.Background>
    
            <Border.Effect>
                <DropShadowEffect/>
            </Border.Effect>
    
            <TextBlock x:Name="textBlock" TextWrapping="Wrap" Text="{TemplateBinding Content}" TextAlignment="Center" VerticalAlignment="Center" Foreground="White"/>
    
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="CommonStates">
                    <VisualStateGroup.Transitions>
                        <VisualTransition GeneratedDuration="0:0:0.5" />
                        <VisualTransition GeneratedDuration="0" To="Pressed" />
                    </VisualStateGroup.Transitions>
                    <VisualState x:Name="Normal" />
                    <VisualState x:Name="MouseOver" Storyboard="{StaticResource Mouse_Enter}"/>
                    <VisualState x:Name="Pressed" Storyboard="{StaticResource Mouse_LeftButton_Down}"/>
                    <VisualState x:Name="Disabled" Storyboard="{StaticResource DisabledStoryboard}"/>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
        </Border>
    
        <ControlTemplate.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Foreground" TargetName="textBlock" Value="#FF959595"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    

    结果:

    名为 Natasha 的简单动画


    没有关键帧似乎更容易:

    <ControlTemplate x:Key="Button_Standard" TargetType="{x:Type Button}">
        <ControlTemplate.Resources>
            <Storyboard x:Key="Mouse_Enter">
                <ColorAnimation
                    Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)"
                    Storyboard.TargetName="border" Duration="0:0:0.5" To="#FF2CA58D"/>
                <ColorAnimation
                    Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)"
                    Storyboard.TargetName="border" Duration="0:0:0.5" To="#FF397C6E"/>
            </Storyboard>
            <Storyboard x:Key="Mouse_LeftButton_Down">
                <ThicknessAnimation
                    Storyboard.TargetProperty="(Border.BorderThickness)"
                    Storyboard.TargetName="border" Duration="0:0:0.0" To="2"/>
                <ColorAnimation
                    Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"
                    Storyboard.TargetName="border" Duration="0:0:0.0" To="#FF1C473F"/>
                <ColorAnimation
                    Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)"
                    Storyboard.TargetName="border" Duration="0:0:0.0" To="#FF2CA58D"/>
                <ColorAnimation
                    Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)"
                    Storyboard.TargetName="border" Duration="0:0:0.0" To="#FF397C6E"/>
            </Storyboard>
            <Storyboard x:Key="DisabledStoryboard">
                <ColorAnimation
                    Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)"
                    Storyboard.TargetName="border" Duration="0:0:0.0" To="#FF474747"/>
                <ColorAnimation
                    Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)"
                    Storyboard.TargetName="border" Duration="0:0:0.0" To="#FF474747"/>
            </Storyboard>
        </ControlTemplate.Resources>
    
        <Border x:Name="border" CornerRadius="7.5" BorderBrush="Black">
            <Border.Background>
                <RadialGradientBrush>
                    <GradientStop Color="#FF2CA58D" Offset="0"/>
                    <GradientStop Color="#FF2CA58D" Offset="1"/>
                </RadialGradientBrush>
            </Border.Background>
    
            <Border.Effect>
                <DropShadowEffect/>
            </Border.Effect>
    
            <TextBlock x:Name="textBlock" TextWrapping="Wrap" Text="{TemplateBinding Content}" TextAlignment="Center" VerticalAlignment="Center" Foreground="White"/>
    
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="CommonStates">
                    <VisualStateGroup.Transitions>
                        <VisualTransition GeneratedDuration="0:0:0.5" />
                        <VisualTransition GeneratedDuration="0:0:0.0" To="Pressed" />
                    </VisualStateGroup.Transitions>
                    <VisualState x:Name="Normal" />
                    <VisualState x:Name="MouseOver" Storyboard="{StaticResource Mouse_Enter}"/>
                    <VisualState x:Name="Pressed" Storyboard="{StaticResource Mouse_LeftButton_Down}"/>
                    <VisualState x:Name="Disabled" Storyboard="{StaticResource DisabledStoryboard}"/>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
        </Border>
    
        <ControlTemplate.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Foreground" TargetName="textBlock" Value="#FF959595"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    
    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5