我在saleslogix
windows 插件中添加了一个 .Net windows 窗体,一切正常,但是在按此控件内的“Tab”键时,控件不会转到下一个文本框,而是转到下一个插件。
我已经搜索了很多,但找不到解决方法,当我在另一个saleslogix
Windows 插件中添加浏览器控件时,此文本框内的页面中有多个文本框。令我惊讶的是,按 Tab 键它工作得很好,控制转到下一个文本框。
任何帮助深表感谢。
我在saleslogix
windows 插件中添加了一个 .Net windows 窗体,一切正常,但是在按此控件内的“Tab”键时,控件不会转到下一个文本框,而是转到下一个插件。
我已经搜索了很多,但找不到解决方法,当我在另一个saleslogix
Windows 插件中添加浏览器控件时,此文本框内的页面中有多个文本框。令我惊讶的是,按 Tab 键它工作得很好,控制转到下一个文本框。
任何帮助深表感谢。
当您在主机应用程序中使用 Winforms(和许多其他 UI 类库)时,这是完全正常的事故。无论哪个控件具有焦点,都需要识别导航键,例如 Tab 键和光标键以及快捷键。一种方法是在每个控件上实现 KeyDown 事件处理程序。这当然是太痛苦了。
所以它不是那样工作的,当消息循环接收到击键时,它就会被识别,然后再将其分派到具有焦点的控件。覆盖 ProcessCmdKey() 方法是执行此操作的一般方法。基本方法负责导航和识别菜单和按钮助记符。
问题是,接收和发送消息的不是 .NET 消息循环。它是具有循环的主机应用程序。而且它不知道有关 ProcessCmdKey() 的 bean。所以它不会被调用并且导航不起作用。
它倾向于在 WebBrowser 中工作,因为它是一个 ActiveX 控件。它旨在与其主机交互。特别是它协商决定由哪一个来处理密钥。IOleInPlaceActiveObject::TranslateAccelerator() 方法执行此操作。不是 .NET 中可用的那种管道,并且很少编写主机应用程序来提供替代方案。
您可以考虑“过度痛苦”的解决方案,但您不太可能喜欢它的声音。只有另一种体面的方法可以解决此问题,您必须调用ShowDialog()
以显示您的表单。现在它是调度的 .NET 循环,并且 Tab 和光标键工作正常。这往往是不受欢迎的建议,对话可能会很尴尬。如果你很幸运并且知道你在做什么并且主机可以处理它(通常不是),那么使用线程可以消除模态的刺痛。向供应商寻求建议,尤其是线程方面,将是明智的。