Клавиша Tab не работает в добавленном элементе управления Windows (расширение.Net) в окнах saleslogix
Я добавил.Net форму окна внутри saleslogix
Плагин Windows, все работает нормально, но при нажатии клавиши "Tab" внутри этого элемента управления, вместо перехода к следующему текстовому полю, элемент управления переходит к следующему плагину.
Я много искал и не могу обойти это, когда я добавил элемент управления браузера в другой saleslogix
Плагин Windows, страница внутри этого текстового поля имеет несколько текстовых полей. К моему удивлению при нажатии клавиши табуляции это работало отлично, и управление переходит к следующему текстовому полю.
Буду признателен за любую оказанную помощь.
1 ответ
Это совершенно нормальная ошибка, когда вы используете Winforms (и многие другие библиотеки классов пользовательского интерфейса) в хост-приложении. Клавиши навигации, такие как Tab и клавиши курсора, а также клавиши быстрого доступа, должны распознаваться независимо от того, какой элемент управления находится в фокусе. Один из способов сделать это - реализовать обработчик событий KeyDown на каждом элементе управления. Это чрезмерно больно, конечно.
Таким образом, это не работает таким образом, нажатие клавиши распознается, когда оно получено циклом сообщений, прежде чем оно отправляется в элемент управления с фокусом. Переопределение метода ProcessCmdKey() является основным способом сделать это. Базовый метод заботится о навигации и распознавании меню и мнемоники кнопок.
Проблема в том, что это не цикл сообщений.NET, который получает и отправляет сообщения. Это главное приложение, которое имеет цикл. И он не знает бинов о ProcessCmdKey(). Так что это не вызывается, и навигация не работает.
Он имеет тенденцию работать в WebBrowser, потому что это элемент управления ActiveX. Который предназначен для взаимодействия с его хозяином. В частности, он ведет переговоры, чтобы решить, какой из них получит обработку ключа. Для этого используется метод IOleInPlaceActiveObject::TranslateAccelerator(). Не тот вид сантехники, доступный в.NET, и хост-приложения редко пишутся, чтобы предоставить альтернативу.
Вы могли бы рассмотреть "чрезмерно болезненное" решение, но вряд ли вам понравится его звучание. Есть только один приличный способ исправить это, вы должны позвонить ShowDialog()
для отображения вашей формы. Теперь отправляется цикл.NET, и клавиши Tab и курсора работают нормально. Это, как правило, нежелательный совет, диалоги могут быть довольно неловкими. Если вам повезло, и вы знаете, что делаете, и хост может с этим справиться (обычно нет), то использование потока может вывести из строя модальность. Было бы разумно обратиться к поставщику за советом, особенно в отношении многопоточности.