【问题标题】:How to make CheckBox focus border appear when calling CheckBox.Focus()?调用 CheckBox.Focus() 时如何使 CheckBox 焦点边框出现?
【发布时间】:2011-07-21 00:15:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: wpf checkbox focus border indicator


    【解决方案1】:

    仅当您使用键盘(Tab 键)导航时才会有意显示边框。该主题的MSDN page 有更多详细信息:

    焦点视觉样式仅在 焦点行动是由 键盘。任何鼠标操作或 程序化焦点更改禁用 焦点视觉样式的模式。

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

    还有一个 thread here on SO 与一个有点相关的主题有关,建议模拟按键,但我建议不要使用此解决方案来解决您的问题。

    【讨论】:

      【解决方案2】:
      '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
      

      【讨论】:

      • WPF 中的CheckBox 没有Appearance 属性。这是 WinForms 的答案吗?
      【解决方案3】:

      通过编辑来自ControlzExKeyboardNavigationEx 文件,我设法解决了这个问题(一如既往,全部归功于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;
                  }
              }));
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2015-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多