Dot-Net
WPF 託管 WinForm,選項卡導航問題
WindowsFormsHost在 a和選項卡導航中託管 WinForms 表單時遇到問題。為了解決我做了這個簡單的例子:
- 創建 WPF
Window(應用程序的起點)Form創建了帶有兩個TextBox的WinForms- WPF 視窗:添加
WindowsFormsHost到其中- WPF 視窗:添加了
OnLoaded處理程序- WPF 視窗:添加
Textbox位於WindowsFormsHost在
OnLoaded我得到的處理程序中:System.Windows.Forms.Form f = new WinFormsForm(); f.TopLevel = false; f.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.windowsFormsHost1.Child = f;當我現在執行應用程序時:
- 沒有重點(好的)
- 我點擊第一個
TextBox,WindowsFormsHost它得到焦點(好的)- 我按 Tab,焦點轉到(確定)
TextBox中的第二個WindowsFormsHost- 我再次按 Tab,焦點回到第
TextBox一個WindowsFormsHost(不好;應該離開WindowsFormsHost並將焦點放在 WPF 視窗底部的文本框)- 我點擊 wpf 中的文本框(位於 之後和之下
WindowsFormsHost),它獲得焦點(好的)- 我按下製表符,焦點轉到第一個文本框
WindowsFormsHost- 因為它應該在結束後開始。所以這也可以- 我再次點擊 wpf 文本框並按 shift+tab,焦點轉到
WindowsFormsHost(確定)中的第二個文本框- 我按 Tab,焦點轉到第一個文本框
WindowsFormsHost(轉到 WFH 開頭)(不好)如果我只有一種類型的控制項,如何使焦點表現得像?在這種情況下,表示 WFH-1st-Textbox、WFH-2nd-Textbox、WPF-Textbox 的 Tab 鍵順序。
根據我發現的文章,這似乎不可能完成。根據MSDN 部落格條目(Hwnds 部分),Windows 窗體控制項始終位於層次結構中的 WPF 控制項之上。MSDN 文章(從WPF 消息循環獲取消息部分)指出,發生在 WindowsFormsHost 元素中的事件將在 WPF 甚至意識到它們之前進行處理。
所以我假設按下 TAB 鍵觸發的事件由 WindowsFormsHost 元素處理(導致另一個文本框的焦點)。在封閉的 WPF 視窗中,永遠不會遇到該事件,因為“它已被處理”。另一方面,當您在 WPF 文本框中按 TAB 鍵時,WPF 正在處理事件本身,並且控制鏈正常處理。這樣,焦點將到達 WindowsFormsHost 元素中的文本框,從那裡您不能使用鍵盤離開它。
我知道這對您目前的問題沒有幫助,但我希望它能解釋一些事情。
附錄 如果您不依賴於使用表單控制項,則可以將其更改為 WinForms 使用者控制項,其中包含相同的控制項元素。之後,您可以通過以下方式更改 WindowsFormsHost 元素的初始化:
System.Windows.Forms.UserControl control = new WinFormUC(); windowsFormsHost1.Child = control;WinFormUC 類是我的 WinForms 使用者控制項,包含上述文本框。在我的測試中,無論是 Winforms 還是 WPF 文本框,按 TAB 鍵一個接一個地聚焦文本框。