XAML 如何使自定义聚焦效果仅在WPF中的键盘导航模式打开时可见?

lzfw57am  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(129)

我必须为WPF控件(RadioButton)使用自定义模板,并且该控件必须具有Focused效果的自定义实现。因此,不要使用FocusVisualStyle属性,而是在控件模板内实现效果,我想使用ControlTemplate的触发器来启用或禁用效果:

<ControlTemplate.Triggers>
    <Trigger Property="IsKeyboardFocused" Value="True">
        <Setter TargetName="FocusEffect" Property="Visibility" Value="Visible" />
    </Trigger>
</ControlTemplate.Triggers>

但问题是,默认的Windows行为是,焦点效果仅在键盘导航模式打开时可见(用户使用Tab键或按Alt键)。如果我只使用IsKeyboardFocused属性,即使用鼠标单击控件也会有效果,这不应该是这种情况。
我需要使用哪个属性作为触发器来实现默认行为?

v1l68za4

v1l68za41#

我需要使用哪个属性作为触发器来实现默认行为?
恐怕没有依赖项属性可用于确定最后一次输入是否来自键盘。
是的,FocusVisualStyle是作为一个装饰器以编程方式应用于焦点控件之上的。
因此,要解决这个问题,需要实现某种焦点检测功能,以编程方式聚焦模板中的元素。

pcrecxhr

pcrecxhr2#

实际上,你可以自由地为FocusVisualStyle设计一个Style,它只是定义了一个要覆盖的控件。
RadioButton标记周围的样式如下所示。

<Style x:Key="OptionMarkFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Rectangle Width="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"
                           HorizontalAlignment="Left"
                           Stroke="Black"
                           StrokeThickness="1"
                           StrokeDashArray="1 2"
                           SnapsToDevicePixels="True"/>               
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<StackPanel>
    <RadioButton FocusVisualStyle="{StaticResource OptionMarkFocusVisual}" Content="AAA"/>
    <RadioButton FocusVisualStyle="{StaticResource OptionMarkFocusVisual}" Content="BBB"/>
    <RadioButton FocusVisualStyle="{StaticResource OptionMarkFocusVisual}" Content="CCC"/>
</StackPanel>

您可以根据需要创建替代样式。
八角形:

<Style x:Key="OptionMarkFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Grid HorizontalAlignment="Left"
                      SnapsToDevicePixels="True">
                    <Polygon Points="1,0 3,0 4,1 4,3 3,4 1,4 0,3 0,1"
                             Stretch="Uniform"
                             Stroke="Black"
                             StrokeThickness="1"
                             StrokeDashArray="1 2"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

十字准线:

<Style x:Key="OptionMarkFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>                
                <Grid HorizontalAlignment="Left"
                      SnapsToDevicePixels="True"
                      UseLayoutRounding="True">
                    <Path Data="M 1,0 L 1,2 M 0,1 L 2,1"
                          Stretch="Uniform"
                          Stroke="Gray"
                          StrokeThickness="1"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

相关问题