Почему прямоугольник фокусировки не отображается до тех пор, пока не будет нажата клавиша Tab?

У меня странная проблема (вероятно, только для того, чтобы понять), почему в тестовом приложении прямоугольник фокуса не отображается, пока я не нажму клавишу табуляции.

Я хочу показать диалог с двумя переключателями и двумя кнопками. Когда я показываю диалоговое окно, я хотел бы видеть прямоугольник вокруг моего первого переключателя. (Чтобы пользователь мог видеть, где находится фокус.) Я заказал элементы управления и установил свойство tabindex от 0 до 4, чтобы они были в правильном порядке. (радиобокс 1 имеет tabindex 0, ...)

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

Я создал совершенно пустой проект winforms (Visual Studio 2010), добавил элементы управления и запустил его. Так что вообще ничего особенного.

Может ли кто-нибудь дать мне подсказку, что я делаю неправильно?

Извините, вот код моего примера:

Public Class Form1

Private Sub Button1_Click(sender As System.Object, _
  e As System.EventArgs) _
    Handles Button1.Click

    Me.Close()
End Sub

Private Sub Button2_Click(sender As System.Object, _
  e As System.EventArgs) _
    Handles Button2.Click

    Me.Close()
End Sub

Private Sub Form1_Shown(sender As Object, _
   e As System.EventArgs) _
  Handles Me.Shown

    RadioButton1.Focus()
    RadioButton1.Select()
    SendKeys.SendWait("{TAB}")
    SendKeys.SendWait("+{TAB}")

End Sub

End Class

person AlexS    schedule 10.02.2012    source источник
comment
Кхм... забыл сказать, что у меня Windows 7 (64-битная версия)   -  person AlexS    schedule 10.02.2012
comment
Сложная ошибка для исправления, ничего из того, что я пробовал, не помогло.   -  person Hans Passant    schedule 10.02.2012
comment
Я провел немного (намного) больше исследований и выяснил, что отправка клавиши Tab в форму вызывает событие Control.ChangeUICues, в котором для флага UICuesEventArgs.ShowFocus установлено значение true. (msdn.microsoft.com/en-us /library/) После обработки этого события прямоугольник фокуса становится видимым. Кто-нибудь знает, как я могу вызвать/вызвать это событие напрямую? Я не нашел никакого свойства, которое я мог бы установить для этого в true...   -  person AlexS    schedule 10.02.2012
comment
Вы не можете / не должны этого делать, так как это системная настройка. В старой XP перейдите в Панель управления — Дисплей — Внешний вид — Эффекты, есть опция Скрыть подчеркнутые буквы для навигации с клавиатуры, пока я не нажму клавишу Alt. Когда флажок не установлен, переключатель в диалоговом окне отображается так, как вы хотите. Я не знаю, где этот параметр находится в Win 7. Но в основном это предпочтение пользователя.   -  person LarsTech    schedule 10.02.2012
comment
Полезно знать, что это пользовательские настройки. Спасибо, что сказали это.   -  person AlexS    schedule 13.02.2012
comment
Интересно, что он связан с этой настройкой, потому что текст настройки не закрывает прямоугольник фокуса.   -  person Martin Brown    schedule 07.03.2013


Ответы (4)


Как я уже говорил, это действительно настройка предпочтений пользователя.

Но чтобы отобразить прямоугольник, попробуйте унаследовать свой собственный RadioButton и переопределить функцию ShowFocusCues:

Public Class RadioWithFocus
  Inherits RadioButton

  Protected Overrides ReadOnly Property ShowFocusCues() As Boolean
    Get
      Return True
    End Get
  End Property

End Class
person LarsTech    schedule 10.02.2012

Используйте унаследованный Control.Focus() в методе инициализации вашей формы или там, где это применимо. Что-то типа:

public Form1 () {
    //Other stuff here
    radiobox1.Focus();// If this is the name of your control
}

Другой метод, на который следует обратить внимание, — Form.Activate. . Это, вероятно, лучше использовать в этом контексте

Кроме того, может оказаться полезным ActiveControl.

person annonymously    schedule 10.02.2012
comment
Я знал метод .Focus и попробовал его первым. Ваш метод .Activate был хорошей идеей, но ни один из них не помог. :-/ - person AlexS; 10.02.2012

Как сказал LarsTech, это пользовательские настройки. Для Windows 7 этот параметр можно найти здесь: Открыть панель управления / Центр специальных возможностей / Упростить использование клавиатуры.

Найдите флажок с текстом «Подчеркивать сочетания клавиш и клавиши доступа» и установите его.

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

Наслаждаться

person Jim Kennedy    schedule 24.07.2013

Для Win32/C++ отправьте сообщение WM_CHANGEUISTATE в родительское окно:

    // Enable focus rect and accelerator underline in all controls.
    ::SendMessage(WM_CHANGEUISTATE, MAKELONG(UIS_CLEAR, UISF_HIDEACCEL | UISF_HIDEFOCUS), 0);
person Martin Connell    schedule 12.12.2016