在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>
答案 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>
我不喜欢重复,但它不会产生任何警告并按预期工作。