4

当用户使用 Tab 键进入 CheckBox 以使其获得焦点时,CheckBox 周围会出现一个虚线边框以指示它具有焦点。

当 CheckBox 通过代码调用获得焦点时myCheckBox.Focus(),不会出现这样的指示符(即使按下空格键会切换状态)。

当我以编程方式聚焦 CheckBox 时,如何使 CheckBox 焦点边框出现?

4

3 回答 3

9

仅当您通过键盘(Tab 键)导航时,才会有意显示边框。有关此主题的MSDN 页面有更多详细信息:

焦点视觉样式仅在键盘启动焦点操作时起作用。任何鼠标操作或程序化焦点更改都会禁用焦点视觉样式的模式。

如果你想显示一个边框,你可以使用 IsFocused- 属性上的触发器来做一些视觉上的改变(虽然你不能用这个设置边框),或者如果你真的想要一个边框,你必须创建自己的控制模板。

在 SO上还有一个关于某个相关主题的线程,其中建议模拟按键,但我建议不要将此解决方案用于您的问题。

于 2011-03-23T06:43:27.420 回答
0
'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
于 2012-04-02T15:43:24.857 回答
0

通过从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;
            }
        }));
    }
}
于 2019-01-23T17:45:58.190 回答