正如標題所述,我想將System.Windows.Controls.Textbox轉換爲IWin32Window。 我讀How to use a FolderBrowserDialog from a WPF application 但它只描述如何獲得winform的句柄,而不是控制它。將wpf文本框轉換爲iwin32window(winform)
感謝
正如標題所述,我想將System.Windows.Controls.Textbox轉換爲IWin32Window。 我讀How to use a FolderBrowserDialog from a WPF application 但它只描述如何獲得winform的句柄,而不是控制它。將wpf文本框轉換爲iwin32window(winform)
感謝
WPF不使用的Win32句柄像文本框個人控制,只爲窗口本身。換句話說,從Win32的角度來看,整個WPF窗口對象是一個帶單個句柄的窗口。因此,IWin32Window返回WPF TextBox的「實際」Win32句柄是沒有意義的:WPF TextBox根本沒有Win32句柄。因此,你將不得不返回一些其他對象的Win32句柄。
如何做到這一點取決於你將使用IWin32Window。有幾種可能創建一個Win32窗口,以符合您的文本框:
注意要創建一個Win32窗口覆蓋TextBox(透明或零大小),您可以使用傳統的Win32或WinForms技術。
由於TextBox可以在屏幕上移動,所以只要TextBox移動就需要移動Win32窗口。這可以在OnRendering事件中使用textBox.TransformToAncestor(window)完成,然後使用PresentationSource.TransformToDevice轉換爲設備座標。
注意事項ElementHost的解決方案(3 & 4)
這是因爲包裹ElementHost的圍繞在你的XAML文本框那樣簡單,所以這樣的:
<Grid>
...
<TextBox ...>
</Grid>
可能變成:
<Grid>
...
<WindowsFormsHost>
<ElementHost>
<TextBox ...>
</ElementHost>
</WindowsFormsHost>
</Grid>
這也可以通過從代碼中刪除文本框,將其添加到新創建的ElementHost,然後將ElementHost添加到新創建的WindowsFormsHost並將WindowsFormsHost添加回父級。
請注意,即使包裝在WindowsFormsHost中,WPF樣式和屬性(包括DataContext,TextElement屬性等)也不會通過ElementHost向下傳播,因此必須手動傳播所需的設置和資源。