在 WPF 中加载的控件上显示焦点元素

Posted

技术标签:

【中文标题】在 WPF 中加载的控件上显示焦点元素【英文标题】:Show focused element on loaded control in WPF 【发布时间】:2019-07-29 04:47:25 【问题描述】:

加载后如何在视图中突出显示焦点元素?我知道它是集中的,因为如果我按 Enter 或使用键盘导航,它会按预期运行,如果我导航回第一个元素,它会正确突出显示。我只想让用户清楚地知道在加载视图后选择了哪个元素。这发生在按钮或复选框上。

【问题讨论】:

您可以使用样式来设置模板并在其中使用触发器来更改背景。 ***.com/questions/20949742/… <Setter Property="FocusVisualStyle" Value="StaticResource FocusVisualStyleBtn" />有什么不同吗?它在浏览元素时工作正常,但在加载后不适用于焦点元素。 【参考方案1】:

如果控件是焦点元素,则将应用焦点样式。聚焦元素与默认元素不同,默认元素可以在按下回车时允许执行操作。

设置焦点需要明确地完成,在示例中它是通过以下行完成的

FocusManager.FocusedElement="Binding ElementName=Button"

这会将焦点设置在按钮上,运行它您应该会看到按钮被突出显示。删除上面的行,按钮将不会突出显示。

<Window x:Class="WpfApp4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        FocusManager.FocusedElement="Binding ElementName=Button"
        mc:Ignorable="d"        
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <Button IsDefault="False"
                Width="150"
                Height="30"
                Name="Button"
                Content="Button"/>
    </StackPanel>
</Window>

【讨论】:

上面的代码并没有解决我的问题,尽管我能够更清楚地了解这个问题。显然,如果我使用键盘与 UI 交互,就会触发想要的行为。示例:我按下按钮上的 Enter 键,然后打开一个新窗口。所述窗口有一个复选框列表,第一个复选框明显突出显示。如果我用 MouseLeft 按相同的按钮,将打开相同的窗口,但复选框上看不到突出显示。我认为 KeyBoardFocus 事件有一些隐藏的行为,有没有办法强制它? 我检查并在按钮上设置了逻辑和键盘焦点,但行为始终不同,具体取决于我如何触发 UserControl 的外观 如果您仍在为此苦苦挣扎,请在问题中添加一个简单示例来说明您正在尝试解决的问题,这将有助于确定问题所在。【参考方案2】:

哇,我完全忘了问这个问题。最后,我不得不删除在我的样式上设置的 FocusVisualStyle 属性,并在 IsFocused 事件上编写一个简单的触发器。这解决了我的问题。

【讨论】:

以上是关于在 WPF 中加载的控件上显示焦点元素的主要内容,如果未能解决你的问题,请参考以下文章

WPF 复合控件焦点设置

WPF学习第十九章 控件类

WPF 打开新窗口 如何设置 焦点还在原来的窗口 谢谢

WPF:无法设置焦点

从视图模型中将焦点设置在 WPF 中的 TextBox 上

WPF虚拟键盘如何不获得当前焦点