正如标题所描述的,我想将System.Windows.Controls.Textbox转换为IWin32Window。我读过How to use a FolderBrowserDialog from a WPF application,但它只描述了如何获得winform的句柄,而不是对它的控制。
谢谢
发布于 2010-08-20 13:34:54
WPF不对像TextBox这样的单个控件使用Win32句柄,只对窗口本身使用。换句话说,从Win32的角度来看,整个WPF窗口对象是具有单个句柄的单个窗口。
正因为如此,IWin32Window返回WPF TextBox的“实际”Win32句柄是没有意义的: WPF TextBox根本没有Win32句柄。因此,您必须返回某个其他对象的Win32句柄。
如何做到这一点取决于您将使用IWin32Window做什么。有几种方法可以创建与TextBox对应的Win32窗口:
关于"extra window“解的注记(1 & 2)
要创建覆盖TextBox (透明或零大小)的Win32窗口,需要使用传统的Win32或WinForms技术。
由于TextBox可以在屏幕上移动,因此每当TextBox移动时,您都需要移动Win32窗口。这可以在OnRendering事件中使用textBox.TransformToAncestor(窗口)完成,然后使用PresentationSource.TransformToDevice转换为设备坐标。
关于ElementHost解决方案的说明(3和4)
这就像在XAML中将ElementHost包装在TextBox中一样简单,所以这是:
<Grid>
...
<TextBox ...>
</Grid>
可能会变成:
<Grid>
...
<WindowsFormsHost>
<ElementHost>
<TextBox ...>
</ElementHost>
</WindowsFormsHost>
</Grid>
这也可以在代码中完成,方法是将TextBox从其父对象中删除,将其添加到新创建的ElementHost中,然后将ElementHost添加到新创建的WindowsFormsHost中,并将WindowsFormsHost添加回父对象中。
请注意,WPF样式和属性(包括DataContext、TextElement属性等)不会通过ElementHost向下传播,即使包装在WindowsFormsHost中也是如此,因此必须手动传播所需的设置和资源。
https://stackoverflow.com/questions/3526488
复制相似问题