Проблема с пользовательским интерфейсом - Контроль состояния и фокусировки - PullRequest
0 голосов
/ 21 декабря 2009

Я зашел в тупик при разработке приложения .NET для Windows Forms. Проблема связана с переключением фокуса между элементами управления и с тем, как он поддерживает поддержание состояний элемента управления формы.

В пользовательском интерфейсе есть три основных элемента управления - два поля со списком и кнопка.

  • Оба поля со списком начинаются с SelectedItem = null.
  • Оба поля со списком имеют явный набор допустимых опций, которые можно выбрать.
  • В обоих полях со списком используется AutoCompleteMode.SuggestAppend, для AutoCompleteSource установлено значение AutoCompleteSource.ListItems. Это означает, что пользователи могут вводить в поля со списком и предлагать всплывающие подсказки для выбора значения.
  • ComboBox # 1 всегда включен.
  • ComboBox # 2 отключен, если в ComboBox # 1 не выбрано определенное значение.
  • Кнопка активна только когда:
    • Допустимое значение было выбрано из всегда включенного поля со списком.
    • Допустимое значение было выбрано из второго поля со списком IFF определенное значение было выбрано в первом поле со списком. В противном случае его значение игнорируется.
    • Во всех остальных случаях он отключен.

Проблема заключается в навигации по клавиатуре и фокусе управления, а также в том, как они взаимодействуют с логикой, связанной с поддержанием состояний Enabled различных элементов управления.

В двух словах, при выборе значения для поля со списком нажатие клавиши TAB (чтобы сделать выбор для поля со списком) дает фокус следующему элементу управления в форме (согласно порядку TabIndex) ДО логики для включения / Запретить управление запущено.

Логика включения / выключения элементов управления происходит в событиях Validating / Validated соответствующих комбинированных полей.

Конечным результатом является то, что элемент управления можно отключить ПОСЛЕ того, как ему был дан фокус.

Например:

  1. Включен только ComboBox # 1. ComboBox # 2 и кнопка отключены. Все выбранные элементы ComboBox имеют нулевое значение.
  2. Установите фокус на ComboBox # 1.
  3. Введите первые несколько букв допустимого параметра для поля.
  4. Нажмите клавишу TAB.

Когда я нажимаю клавишу TAB, кажется, что фокус передается следующему элементу управления до изменения SelectedItem. Бизнес-логика для включения или отключения других элементов управления пользовательского интерфейса не может быть запущена, пока SelectedItem не будет изменен.

В идеале, я хочу наоборот: фокус должен быть смещен ПОСЛЕ того, как SelectedItem элемента управления UI был обновлен, поэтому была запущена логика для обновления состояний элемента управления.

У кого-нибудь есть предложения относительно того, как я могу это сделать?

1 Ответ

0 голосов
/ 21 декабря 2009

Можете ли вы явно изменить фокус в SelectedIndexChanged / SelectedValueChanged для соответствующего поля со списком? Возможно, вы захотите проверить, где в данный момент находится фокус, и смещаться, только если он находится на отключенном элементе управления.

...