wpf - 如何为 WPF 用户控件重新定义 FocusVisualStyle

标签 wpf xaml

我正在尝试重新定义用户控件的 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/

相关文章:

wpf - WPF ListView /数据网格内的按钮

c# - 停止旋转时如何检测图像的位置?

c# - 如何使 GlyphTypeface FontUri 通用

asp.net - MVP MVC 和 MVVM 的区别

c# - 如何选择照片选择器?

c# - 使用 Zxing 库解码条码适用于 1 台平板电脑,但不适用于另一台平板电脑

wpf - 如何在WPF选项卡控件中创建梯形选项卡

c# - 当 WPF DataGrid 为空时显示 “No record found” 消息

wpf - 动画 WPF 中状态之间的边距值

wpf - 当鼠标经过 ContextMenu 或验证错误时,IsMouseOver 返回 False?