Как сделать так, чтобы граница фокуса CheckBox появлялась при вызове CheckBox.Focus ()? - PullRequest
4 голосов
/ 23 марта 2011

Когда пользователь перемещается в CheckBox, чтобы придать ему фокус, вокруг CheckBox появляется пунктирная рамка, указывающая, что он имеет фокус.

Когда CheckBox фокусируется с помощью кода, вызывающего myCheckBox.Focus(), такой индикатор не появляется (даже если нажатие пробела переключает состояние).

Как сделать так, чтобы граница фокусировки CheckBox появлялась, когда я программно сфокусировал CheckBox?

Ответы [ 3 ]

8 голосов
/ 23 марта 2011

Граница преднамеренно отображается только при навигации с помощью клавиатуры (клавиша Tab).Страница MSDN по этой теме содержит дополнительную информацию:

Стили визуального фокуса действуют только тогда, когда клавиатура выполняет действие фокусировки.Любое действие мыши или программное изменение фокуса отключает режим для визуальных стилей фокуса.

Если вы хотите показать границу, вы можете использовать Trigger для свойства IsFocused-, чтобы сделать некоторые визуальные изменения.(хотя вы не можете установить границу с этим) или если вы на самом деле хотите границу, вам придется создать свой собственный ControlTemplate.

На SO есть также ветка по несколько связанной теме, где предлагается симуляция нажатия клавиши, но я бы посоветовал не использовать это решение для вашей проблемы.

0 голосов
/ 23 января 2019

Отредактировав файл KeyboardNavigationEx из ControlzEx Мне удалось решить проблему (полный кредит, как всегда, составляет 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;
            }
        }));
    }
}
0 голосов
/ 02 апреля 2012
'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
...