当用户使用 Tab 键进入 CheckBox 以使其获得焦点时,CheckBox 周围会出现一个虚线边框以指示它具有焦点。
当 CheckBox 通过代码调用获得焦点时myCheckBox.Focus()
,不会出现这样的指示符(即使按下空格键会切换状态)。
当我以编程方式聚焦 CheckBox 时,如何使 CheckBox 焦点边框出现?
仅当您通过键盘(Tab 键)导航时,才会有意显示边框。有关此主题的MSDN 页面有更多详细信息:
焦点视觉样式仅在键盘启动焦点操作时起作用。任何鼠标操作或程序化焦点更改都会禁用焦点视觉样式的模式。
如果你想显示一个边框,你可以使用 IsFocused- 属性上的触发器来做一些视觉上的改变(虽然你不能用这个设置边框),或者如果你真的想要一个边框,你必须创建自己的控制模板。
在 SO上还有一个关于某个相关主题的线程,其中建议模拟按键,但我建议不要将此解决方案用于您的问题。
'initially set chkCheckBox.Appearance = 1
'on Got Focus set appearance = 0 - Flat
Private Sub chkCheckBox_GotFocus()
chkCheckBox.Appearance = 0
End Sub
'on Lost Focus set appearance = 1 - 3D
Private Sub chkCheckBox_LostFocus()
chkCheckBox.Appearance = 1
End Sub
通过从ControlzEx编辑KeyboardNavigationEx
文件,我设法解决了这个问题(与往常一样,全部功劳归于 punker76)。
只需调用KeyboardHelper.Focus
传递UIElement
应该关注的方法(例如KeyboardHelper.Focus(myCheckBox)
)
这是KeyboardHelper
课程:
public sealed class KeyboardHelper
{
private static KeyboardHelper _Instance;
private readonly PropertyInfo _AlwaysShowFocusVisual;
private readonly MethodInfo _ShowFocusVisual;
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static KeyboardHelper()
{
}
private KeyboardHelper()
{
var type = typeof(KeyboardNavigation);
_AlwaysShowFocusVisual = type.GetProperty("AlwaysShowFocusVisual", BindingFlags.NonPublic | BindingFlags.Static);
_ShowFocusVisual = type.GetMethod("ShowFocusVisual", BindingFlags.NonPublic | BindingFlags.Static);
}
internal static KeyboardHelper Instance => _Instance ?? (_Instance = new KeyboardHelper());
internal void ShowFocusVisualInternal()
{
_ShowFocusVisual.Invoke(null, null);
}
internal bool AlwaysShowFocusVisualInternal
{
get { return (bool)_AlwaysShowFocusVisual.GetValue(null, null); }
set { _AlwaysShowFocusVisual.SetValue(null, value, null); }
}
public static void Focus(UIElement element)
{
element?.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{
var keybHack = KeyboardHelper.Instance;
var oldValue = keybHack.AlwaysShowFocusVisualInternal;
keybHack.AlwaysShowFocusVisualInternal = true;
try
{
Keyboard.Focus(element);
keybHack.ShowFocusVisualInternal();
}
finally
{
keybHack.AlwaysShowFocusVisualInternal = oldValue;
}
}));
}
}