IsDefaulted和IsKeyboardFocused按钮故事板

时间:2016-03-31 18:35:09

标签: wpf xaml

在WPF中触发自定义按钮模板上的默认/聚焦按钮发光效果的正确方法是什么?这与Windows 7的按键发光和Windows 8/10的粗略轮廓的行为类似,用于聚焦和默认按钮。

(注意:Windows 7中的vanilla WPF项目没有显示操作系统其余部分中出现的聚焦/默认按钮发光。哦,微软......)

我试过了:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsDefaulted" Value="False" />
        <Condition Property="IsKeyboardFocused" Value="False" />
    </MultiTrigger.Conditions>
    <MultiTrigger.EnterActions>
        <RemoveStoryboard BeginStoryboardName="IsDefaultedStoryboard" />
    </MultiTrigger.EnterActions>
    <MultiTrigger.ExitActions>
        <BeginStoryboard x:Name="IsDefaultedStoryboard" Storyboard="{StaticResource IsDefaultedStoryboard}" />
    </MultiTrigger.ExitActions>
</MultiTrigger>

行为似乎与预期的一样,但它产生了很多警告 - 每个按钮在屏幕上加载时会发出一个警告。

  

System.Windows.Media.Animation警告:6:无法执行操作,因为指定的Storyboard从未应用于此对象以进行交互式控制。行动=“删除”;故事板= 'System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode = '16952812'; Storyboard.Type = 'System.Windows.Media.Animation.Storyboard'; TargetElement ='System.Windows.Controls.Button:Save'; TargetElement.HashCode = '37829947'; TargetElement.Type = 'System.Windows.Controls.Button'

我稍微详细的解决方案仍然会产生警告 - 虽然只是在失去焦点时 - 并且没有按预期工作:当从默认按钮跳到另一个按钮时,默认按钮会保持发光。

<Trigger Property="IsDefaulted" Value="True">
    <Trigger.EnterActions>
        <BeginStoryboard x:Name="IsDefaultedStoryboard" Storyboard="{StaticResource IsDefaultedStoryboard}" />
    </Trigger.EnterActions>
    <Trigger.ExitActions>
        <RemoveStoryboard BeginStoryboardName="IsDefaultedStoryboard" />
    </Trigger.ExitActions>
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="True">
    <Trigger.EnterActions>
        <BeginStoryboard x:Name="IsFocusedStoryboard" Storyboard="{StaticResource IsDefaultedStoryboard}" />
    </Trigger.EnterActions>
    <Trigger.ExitActions>
        <RemoveStoryboard BeginStoryboardName="IsFocusedStoryboard" />
    </Trigger.ExitActions>
</Trigger>

使用解决方案#1可能是可以接受的,只是忽略警告,但我不愿意。有什么更好的方法呢?

故事板并不令人兴奋:

<Storyboard x:Key="IsDefaultedStoryboard" RepeatBehavior="Forever">
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="IsDefaulted" Storyboard.TargetProperty="(UIElement.Opacity)">
        <EasingDoubleKeyFrame KeyTime="0" Value="0" />
        <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0" />
        <EasingDoubleKeyFrame KeyTime="0:0:2.0" Value="1" />
        <EasingDoubleKeyFrame KeyTime="0:0:4.0" Value="0" />
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

1 个答案:

答案 0 :(得分:0)

我最终制作了一个故事板的相同副本,并通过两个独立的触发器来应用它,即

<Trigger Property="IsDefaulted" Value="True">
    <Setter TargetName="buttonStroke" Property="Opacity" Value=".5" />
    <Trigger.EnterActions>
        <BeginStoryboard x:Name="IsDefaultedStoryboard" Storyboard="{StaticResource IsDefaultedStoryboard}" />
    </Trigger.EnterActions>
    <Trigger.ExitActions>
        <RemoveStoryboard BeginStoryboardName="IsDefaultedStoryboard" />
    </Trigger.ExitActions>
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="True">
    <Setter TargetName="buttonStroke" Property="Opacity" Value=".5" />
    <Trigger.EnterActions>
        <BeginStoryboard x:Name="IsKeyboardFocusedStoryboard" Storyboard="{StaticResource IsKeyboardFocusedStoryboard}" />
    </Trigger.EnterActions>
    <Trigger.ExitActions>
        <RemoveStoryboard BeginStoryboardName="IsKeyboardFocusedStoryboard" />
    </Trigger.ExitActions>
</Trigger>

我不喜欢重复,但它不会产生任何警告并按预期工作。