我正在尝试重新定义用户控件的 FocusVisualStyle
(以使其在 webexe 中更加明显),但它不起作用。我就不能打一下吗
<Style x:Key="{x:Static SystemParameters.FocusVisualStyleKey}"
TargetType="Control">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="-3"
StrokeThickness="2"
Stroke="Red"
SnapsToDevicePixels="true" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="Control">
<Setter Property="FocusVisualStyle"
Value="{DynamicResource {x:Static SystemParameters.FocusVisualStyleKey}}"/>
</Style>
进入我的代码(在UserControl.Resources
中)?但这是行不通的。
当我在特定控件上显式设置焦点视觉样式时,它会起作用:
<RadioButton GroupName="rbGroup" TabIndex="30"
FocusVisualStyle="{StaticResource {x:Static SystemParameters.FocusVisualStyleKey}}">
Choice A
</RadioButton>
我错过了什么?
最佳答案
首先,要自动选择样式,TargetType
应与您打算应用该样式的实际控件类型相同。因此,将 Style 的 TargetType 从 Control 更改为 RadioButton。
第二,根据Dependency Property Value Precedence order ,与模板触发器中设置的属性相比,样式 setter 中设置的属性的优先顺序较低。
在RadioButton的默认模板中,FocusVisualStyle是在ControlTemplate触发器中设置的。因此,您在样式 setter 中设置的任何值都将被 ControlTemplate 触发器覆盖。由于与 controlTemplate 触发器相比,本地值具有更高的优先级,这就是在本地设置它的原因。
有两种可能的解决方案 -
首先 - 覆盖 RadioButton 的完整 ControlTemplate 并将 FocusVisualStyle 放在那里。
第二 - 样式触发器比控件模板触发器具有更高的优先级,在样式触发器中设置 focusVisualStyle 并且它将被覆盖。像这样的事情:
<Style x:Key="{x:Static SystemParameters.FocusVisualStyleKey}">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="-3"
StrokeThickness="2"
Stroke="Red"
SnapsToDevicePixels="true"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="RadioButton"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Style.Triggers>
<DataTrigger Binding="{Binding Source={x:Static sys:Boolean.TrueString}}"
Value="True">
<Setter Property="FocusVisualStyle"
Value="{StaticResource {x:Static SystemParameters.FocusVisualStyleKey}}"/>
</DataTrigger>
</Style.Triggers>
</Style>
关于wpf - 如何为 WPF 用户控件重新定义 FocusVisualStyle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29101942/