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

时间:2014-12-12 14:25:45

标签: c# .net 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>

请注意,只有当您在两个按钮之间切换而不是单击按钮时,才会显示自定义红色对焦边框。然而,在任何一种情况下都会修改自定义按钮文本。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:4)

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

忘记FocusVisualStyle,这是垃圾。我使用的是与IsKeyboardFocused=TrueIsMouseCaptured=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>

只有在选中时才会在我的按钮周围给我一个绿色环,而不是通过鼠标聚焦时。