通过<tab>接收焦点时修改按钮样式,但单击时不修改

Rom*_*ner 3 .net c# wpf xaml controltemplate

我想做的事

在用户界面上切换时,大多数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>
Run Code Online (Sandbox Code Playgroud)

请注意,仅当您在两个按钮之间切换时才显示自定义红色焦点边框,而单击按钮时不显示。但是,自定义按钮文本在两种情况下都会被修改。

我该如何实现?

Mat*_*obi 5

好的,经过无数小时后,我终于找到了适合我的方案的解决方案。我希望它也对您有用。

算了FocusVisualStyle,那是垃圾。我正在使用与IsKeyboardFocused=True和关联的MultiTrigger IsMouseCaptured=False

这是我现在的风格:

<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>
Run Code Online (Sandbox Code Playgroud)

仅在将其切换到选项卡时,而不是通过鼠标进行聚焦时,这会使我的按钮周围出现绿色环。