.Net Toolstrip/MenuStrip Focus Issues

Независимо от сценария, я могу восстановить эту неприятную проблему в 100% случаев. Создайте проект .Net, C# или VB.Net. Добавьте элемент управления ToolStrip в форму. Создайте несколько простых DropDownButton (ов), которые содержат как минимум 2 пункта меню. Добавьте любые другие элементы управления, которые вы хотите, в поле списка (заполните его, чтобы он мог правильно получать фокус) и элемент управления ComboBox. Либо назначайте сочетания клавиш или активируйте TabStop на ToolStrip, чтобы он мог получать фокус с клавиатуры.

Запустите проект (Debug/Release, который вам когда-либо понравился). Используйте клавиатуру, чтобы получить Focus ToolStrip Focus (по вкладке или клавише быстрого доступа). Стрелка вниз в подпункт. Теперь выберите escape-ключ, чтобы свернуть подменю Toolstrip. Вкладка в ListBox или ComboBox, которая содержит несколько элементов. Все отлично выглядит? Теперь используйте клавиши со стрелками для навигации по этим элементам управления ... Сюрприз! ваша спина на ToolStrip и управление, которое, как вы думали, не имеют фокуса!

Я попробовал несколько вещей, чтобы сосредоточиться на ListBox. Одним из примеров является добавление обработчика событий для OnEnter (ListBox.Enter + = ...) и добавление некоторого кода:

ListBox.Focus();
ListBox.Select(); 

Ничего не получилось ... Похоже, как только меню расширяется на панели инструментов, вы будете навсегда застряли на этом элементе управления, используя свою клавиатуру ... Это важно для меня решить из-за того, что я работаю со слепыми пользователями, которые используют только навигацию на клавиатуре ... Является ли это ошибкой? Я не могу воспроизвести это в MFC ...

Какие-либо предложения?

Update I was able to find a control that doesn't reproduce this strangeness...

System.Windows.Forms.MainMenu - единственный «объект панели инструментов», который не ведет себя как другие ...

Мне все равно хотелось бы получить некоторые отзывы об этом выше (Help for others and myself) ...

Update 2 The underlying issue is within [ToolStripObject].TabFocus property... if set to false all seems to work ok... giving focus back to the control that "looks" like it's focused. But having that capability to allow a blind user to navigate throughout all UI controls via tab is a handy thing to implement... it's too bad this property doesn't work like it should....

2
добавлено отредактировано
Просмотры: 2
nl ja de

1 ответы

Я получил его для работы, переопределив ToolStripMenuItem:

public class ToolStripMenuItemEx : ToolStripMenuItem {

  protected override bool ProcessCmdKey(ref Message m, Keys keyData) {
    if (keyData == Keys.Escape) {
      ToolStripDropDownButton tb = this.OwnerItem as ToolStripDropDownButton;
      if (tb != null) {
        tb.HideDropDown();
        return false;
      }
    }
    return base.ProcessCmdKey(ref m, keyData);
  }
}
2
добавлено
Привет Ларс, я только что реализовал свой подкласс класса ToolStripMenuItem со сценарием, который мне нужно опубликовать выше (в основном нужно TabStop), и на самом деле закончил тем, что снова оказался в ловушке на панели инструментов ... вы уверены, что ваш объект панели инструментов имеет свойство TabStop, установленное на правда?
добавлено автор devHead, источник
Закрытие пунктов меню не является частью проблемы, они сжимаются нормально, когда клавиша эвакуации нажата в обычном сценарии.
добавлено автор devHead, источник
ahhh ... вы допустили ошибку в коде, который вы опубликовали ... он возвращает true, если tb! = null ... я изменил его на false, и он работает ... мне нужно попробовать несколько вещей
добавлено автор devHead, источник
я удалил оператор return, и он оставил меня застрявшим ... я пробовал несколько вещей и работает только в том случае, если возвращает false ...
добавлено автор devHead, источник
так как это выглядит напрямую связано с ключевым процессом нажатия, я отмечаю ваш ответ как ответ, спасибо!
добавлено автор devHead, источник
@Don Да, у моего ToolStrip есть TabStop = true . Я создал форму с тем, как вы ее описали, и увидел, что клавиши со стрелками в основном действуют как клавиша Tab, когда вы пытались выйти из меню сброса ToolStrip. Опубликованный код - это единственный код в моем проекте, и он заставил его работать для меня. Закрытие меню становится проблемой (или должно), если вы вернете true для этой функции, поэтому я вручную спрячу ее.
добавлено автор LarsTech, источник
@Don Hmm, выглядит как tb.HideDropDown (); делает трюк. Я прокомментировал строку return true; и все еще работал.
добавлено автор LarsTech, источник
@Don Ну, это кажется безвредным, поэтому я сказал так, как вы это делали.
добавлено автор LarsTech, источник