如何在WPF中改变焦点的外观?

14

wpf在Windows 7上提供的焦点可视提示是虚线,如下所示: FocusExample

那么,我该如何改变它的外观?我该如何控制它的外观?

谢谢!


继承你正在使用的控件。 当选择按钮时,重新绘制按钮的外观。 - Security Hound
1个回答

32

尝试像下面这样做

<Window x:Class="FocusVisualStyle.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <Style x:Key="MyFocusVisualStyle">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle Margin="-2" StrokeThickness="1" Stroke="Red"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<StackPanel Orientation="Horizontal" Height="24">
    <TextBox Width="96"/>
    <Button Content="Yes" Width="64" FocusVisualStyle="{DynamicResource MyFocusVisualStyle}"/>
    <Button Content="No" Width="64" FocusVisualStyle="{DynamicResource MyFocusVisualStyle}"/>
</StackPanel>

您可以自定义以适合您的喜好。这只是一个起点。

编辑:由于许多人喜欢这个解决方案,这里有另一个示例,它在xaml中使用DynamicResource(看到那个东西了吗?)来更改所有按钮和文本框的焦点可视化样式,而无需为每个控件显式设置FocusVisualStyle属性。

此外,它使用动画来更改焦点矩形的颜色。

享受 :)

<Window x:Class="FocusVisualStyle.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <Style x:Key="MyFocusVisualStyle">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate >
                    <Rectangle Margin="-2" StrokeThickness="2" RadiusX="2" RadiusY="2" >
                        <Rectangle.Stroke>
                            <SolidColorBrush Color="Red" x:Name="RectangleStroke" />
                        </Rectangle.Stroke>
                        <Rectangle.Triggers>
                            <EventTrigger RoutedEvent="Rectangle.Loaded" >
                                <BeginStoryboard>
                                    <Storyboard>
                                        <ColorAnimation From="Red"
                                                        To="Orange"
                                                        Duration="0:0:0.5" 
                                                        RepeatBehavior="Forever" 
                                                        Storyboard.TargetName="RectangleStroke"
                                                        Storyboard.TargetProperty="Color"/>
                                        <DoubleAnimation To="3" 
                                                         Duration="0:0:0.5"
                                                         RepeatBehavior="Forever"
                                                         Storyboard.TargetProperty="StrokeDashOffset" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger>
                        </Rectangle.Triggers>
                    </Rectangle>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style TargetType="{x:Type Button}">
        <Setter Property="FocusVisualStyle" Value="{StaticResource MyFocusVisualStyle}" />
    </Style>
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="FocusVisualStyle" Value="{StaticResource MyFocusVisualStyle}" />
    </Style>
</Window.Resources>
<StackPanel Orientation="Horizontal" Height="24">
    <TextBox Width="96"/>
    <Button Content="Yes" Width="64" />
    <Button Content="No" Width="64" />
</StackPanel>

在这里,您可以看到我为Button和TextBox设置了样式,以为此窗口中的所有按钮和文本框设置FocusVisualStyle属性。


你的样式只有在键盘焦点上才会触发,而不是鼠标焦点。 - WPFKK
我会去查看一下,自从我发布它以来已经有一段时间了。我会尽快回来。 - Vijay Gill
2
@user841612пјҢиҝҷжҳҜеӣ дёәFocusVisualStyleд»…еңЁйҖҡиҝҮй”®зӣҳиҺ·еҫ—з„ҰзӮ№ж—¶жүҚиў«дҪҝз”ЁпјҢиҖҢдёҚжҳҜйҖҡиҝҮзј–зЁӢжҲ–дҪҝз”Ёйј ж ҮгҖӮ - jnovo
一个自定义操作(派生自TriggerAction)是所需的,但我从未有机会在家里的计算机上工作并编写一些代码。此外,这超出了本问题的范围。 - Vijay Gill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接