当通过用户界面进行跳转时,大多数WPF控件在接收键盘焦点时会显示虚线边框。用鼠标单击它们时,它们不会显示此边框。
我有一个带有自定义控件模板的按钮,我想要与上面相同的行为,但我不想添加边框,但我想修改按钮本身的外观。
自定义FocusVisualStyle
。这并没有给我足够的灵活性,因为FocusVisualStyle
设置的模板是添加在按钮的顶部。据我所知,这不能用于以任何方式修改(样式,动画,......)按钮本身。
使用带有IsFocused
和/或IsKeyboardFocused
属性的触发器以及带有Got/LostFocus
和/或Got/LostKeyboardFocus
事件的EventTriggers为按钮设置样式。这不起作用,因为当我点击按钮时,所有这些似乎都被触发了。
<StackPanel VerticalAlignment="Center" Width="150">
<StackPanel.Resources>
<ControlTemplate x:Key="CustomButtonTemplate" TargetType="Button">
<!--A simple black border with a content presenter-->
<Border BorderBrush="Black" BorderThickness="1" CornerRadius="2">
<ContentPresenter x:Name="Presenter" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" />
</Border>
<ControlTemplate.Triggers>
<!--When receiving keyboard focus modify the button text-->
<Trigger Property="IsKeyboardFocused" Value="True">
<Setter TargetName="Presenter" Property="Content" Value="I have keyboard focus" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style x:Key="CustomFocusVisualStyle" TargetType="Control">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<!--Display a red border-->
<Border BorderThickness="1" CornerRadius="2" BorderBrush="Red" Margin="-1" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</StackPanel.Resources>
<Button Content="I am a normal button" Margin="5" />
<Button Content="I am a custom button" Margin="5"
Template="{StaticResource CustomButtonTemplate}"
FocusVisualStyle="{StaticResource CustomFocusVisualStyle}" />
</StackPanel>
请注意,只有当您在两个按钮之间切换而不是单击按钮时,才会显示自定义红色对焦边框。然而,在任何一种情况下都会修改自定义按钮文本。
我怎样才能做到这一点?
答案 0 :(得分:4)
好的,经过无数个小时,我终于找到了适用于我的方案的解决方案。我希望它也适合你的。
忘记FocusVisualStyle
,这是垃圾。我使用的是与IsKeyboardFocused=True
和IsMouseCaptured=False
绑定的MultiTrigger。
以下是我的风格现在的样子:
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsKeyboardFocused" Value="True"/>
<Condition Property="IsMouseCaptured" Value="False"/>
</MultiTrigger.Conditions>
<Setter Property="BorderBrush" Value="Green" />
<Setter Property="BorderThickness" Value="2" />
</MultiTrigger>
</Style.Triggers>
只有在选中时才会在我的按钮周围给我一个绿色环,而不是通过鼠标聚焦时。