Настройка TabIndex в среде CF .net - PullRequest
1 голос
/ 27 января 2009

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

Прежде всего, я заметил, что в объекте Panel нет свойства TabIndex, и, самое главное, я не хочу следовать вложенному алгоритму навигации, я просто хочу установить свою собственную последовательность.

Из того, что я читал в Интернете до сих пор, это невозможно с панелями. Моя единственная альтернатива - поместить все элементы управления в форму на одной панели.

Есть мысли? Мне не хочется переупорядочивать приложение, начинать прятаться и показывать отдельные элементы управления.

Ответы [ 3 ]

4 голосов
/ 27 января 2009

Нажатие клавиши TAB переместит фокус на следующий элемент управления в ControlCollection. Поскольку фокус всегда находится в элементе управления внутри панели, а не в самой панели, как можно ожидать, что панель поддерживает индекс табуляции?

Я предлагаю вам еще раз подумать, что вы пытаетесь сделать. Когда конкретная панель видна, TAB должен перемещаться по элементам управления в ней. Для TAB нет смысла переносить вас на следующую панель. Обычно это делается с помощью кнопки или другого элемента управления. Пользователи ожидают, что TAB перемещает фокус и не выполняет действия. Более того, если вы хотите использовать TAB для перемещения по панелям, вам нужно установить для свойства Tab Stop всех элементов управления значение false.

2 голосов
/ 01 февраля 2010

У меня была такая же проблема. Мое решение состояло в том, чтобы поместить все элементы управления в подпанели формы. Вкладка алгоритма .net заключается во вкладке внутри «текущего» контейнера с помощью TabIndex. Если какой-либо из TabIndexes в контейнере одинаков, первый в z-порядке будет первым и т. Д.

Оказавшись в контейнере (форма является контейнером), все элементы управления, кроме контейнеров (панелей), вкладываются в первую очередь. При выходе из последнего неконтейнерного контроля панели возвращаются в.

Таким образом, если все элементы управления размещены в контейнерах / панелях на одном уровне, вкладка будет выполнена, как вы ожидаете.

Пример задачи:

Form

  control1  Tabindex=1

  panel1

    control2 Tabindex=2

    control3 Tabindex=2

  panel2

    control4 Tabindex=4

    control5 Tabindex=5

  control6 Tabindex=6

Вкладка будет в следующем порядке (не то, что вы ожидали):

  Control1

  Control6  <-- not what you wanted/expected

  Control2

  Control3

  Control4

  Control5

Чтобы правильно перейти на вкладку, расположите по следующему шаблону:

Form

  panel0

    control1  Tabindex=1

  panel1

    control2 Tabindex=2

    control3 Tabindex=2

  panel2

    control4 Tabindex=4

    control5 Tabindex=5

  panel3

    control6 Tabindex=6
0 голосов
/ 27 января 2009

Я думаю, что вы в значительной степени застряли там - я не знаю прямого способа избежать этой вложенной навигации.

Однако я бы сказал, что на самом деле не , что имеет большое значение, чтобы показать / скрыть группы элементов управления:

private void SetPrimaryControlVisibility(bool visible)
{
  ctrlA.Visible = visible;
  ctrlB.Visible = visible;
  ctrlF.Visible = visible;
}

private void SetSecondaryControlVisibility(bool visible)
{
  ctrlC.Visible = visible;
  ctrlE.Visible = visible;
  ctrlG.Visible = visible;
}

Это немного больше написания кода - но это заняло у меня 20 секунд. И если они все находятся на поверхности формы, вы можете использовать индекс табуляции.

Хотя теперь, когда я об этом думаю, что за проблема с ними на их собственной панели? Если вы используете панели для отображения / скрытия, то вы все равно не вкладываете другие панели.

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

...