2010-08-19 60 views

回答

1

WPF不使用的Win32句柄像文本框個人控制,只爲窗口本身。換句話說,從Win32的角度來看,整個WPF窗口對象是一個帶單個句柄的窗口。因此,IWin32Window返回WPF TextBox的「實際」Win32句柄是沒有意義的:WPF TextBox根本沒有Win32句柄。因此,你將不得不返回一些其他對象的Win32句柄。

如何做到這一點取決於你將使用IWin32Window。有幾種可能創建一個Win32窗口,以符合您的文本框:

  1. 您可以創建一個重疊的文本框
  2. 您可以創建一個零(用於命中測試或透支情況下非常有用)透明的Win32窗口 - 以TextBox爲中心的大小窗口(對話框初始位置和所有權場景很有用)
  3. 您可以將TextBox託管在ElementHost而不是WPF窗口中(如果希望TextBox適合其他Win32東西,如舊的MFC應用程序)
  4. 您可以將文本框託管在ElementHost中一個WindowsFormsHost(有用的,如果你需要周圍的文本框一個Win32窗口,但仍需要WPF佈局上的「額外窗口」的解決方案(1 & 2)

注意要創建一個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向下傳播,因此必須手動傳播所需的設置和資源。