正如标题所描述的,我想将System.Windows.Controls.Textbox转换为IWin32Window。 我看过How to use a FolderBrowserDialog from a WPF application 但它只描述了如何处理winform,而不是控制它。
由于
答案 0 :(得分:1)
WPF不为像TextBox这样的单个控件使用Win32句柄,仅用于Window本身。换句话说,从Win32的角度来看,整个WPF Window对象是一个单句柄窗口。
因此,IWin32Window返回WPF TextBox的“实际”Win32句柄是没有意义的:WPF TextBox根本没有Win32句柄。因此,您将不得不返回其他对象的Win32句柄。
如何执行此操作取决于您将使用IWin32Window的内容。创建与TextBox对应的Win32窗口有几种可能性:
关于“额外窗口”解决方案的注释(1& 2)
要创建覆盖TextBox(透明或零大小)的Win32窗口,您将使用传统的Win32或WinForms技术。
由于TextBox可以在屏幕上移动,因此只要TextBox移动,您就需要移动Win32窗口。这可以使用textBox.TransformToAncestor(窗口)在OnRendering事件中完成,然后使用PresentationSource.TransformToDevice转换为设备坐标。
关于ElementHost解决方案的注释(3& 4)
这就像在XAML中围绕TextBox包装ElementHost一样简单,所以:
<Grid>
...
<TextBox ...>
</Grid>
可能会成为:
<Grid>
...
<WindowsFormsHost>
<ElementHost>
<TextBox ...>
</ElementHost>
</WindowsFormsHost>
</Grid>
这也可以在代码中完成,方法是从其父级中删除TextBox,将其添加到新创建的ElementHost中,然后将ElementHost添加到新创建的WindowsFormsHost中,并将WindowsFormsHost添加回父级。
请注意,WPF样式和属性(包括DataContext,TextElement属性等)不会传播到ElementHost,即使包装在WindowsFormsHost中,因此必须手动传播所需的设置和资源。