首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将wpf文本框转换为iwin32window (winform)

将wpf文本框转换为iwin32window (winform)
EN

Stack Overflow用户
提问于 2010-08-20 05:41:49
回答 1查看 704关注 0票数 0

正如标题所描述的,我想将System.Windows.Controls.Textbox转换为IWin32Window。我读过How to use a FolderBrowserDialog from a WPF application,但它只描述了如何获得winform的句柄,而不是对它的控制。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-20 13:34:54

WPF不对像TextBox这样的单个控件使用Win32句柄,只对窗口本身使用。换句话说,从Win32的角度来看,整个WPF窗口对象是具有单个句柄的单个窗口。

正因为如此,IWin32Window返回WPF TextBox的“实际”Win32句柄是没有意义的: WPF TextBox根本没有Win32句柄。因此,您必须返回某个其他对象的Win32句柄。

如何做到这一点取决于您将使用IWin32Window做什么。有几种方法可以创建与TextBox对应的Win32窗口:

  1. 您可以创建一个与TextBox重叠的透明Win32窗口(对于命中测试或透支场景很有用)
  2. 您可以创建一个以TextBox为中心的零大小窗口(对于对话框的初始位置和所有权场景很有用)
  3. 您可以将TextBox托管在ElementHost而不是WPF窗口中(如果您希望TextBox适合其他Win32内容,例如旧的MFC application)
  4. You可以在WindowsFormsHost内的Win32中托管TextBox )(如果您需要WindowsFormsHost周围的Win32窗口,但仍然需要Win32布局,则此功能非常有用

关于"extra window“解的注记(1 & 2)

要创建覆盖TextBox (透明或零大小)的Win32窗口,需要使用传统的Win32或WinForms技术。

由于TextBox可以在屏幕上移动,因此每当TextBox移动时,您都需要移动Win32窗口。这可以在OnRendering事件中使用textBox.TransformToAncestor(窗口)完成,然后使用PresentationSource.TransformToDevice转换为设备坐标。

关于ElementHost解决方案的说明(3和4)

这就像在XAML中将ElementHost包装在TextBox中一样简单,所以这是:

代码语言:javascript
运行
复制
<Grid>
  ...
  <TextBox ...>
</Grid>

可能会变成:

代码语言:javascript
运行
复制
<Grid>
  ...
  <WindowsFormsHost>
    <ElementHost>
      <TextBox ...>
    </ElementHost>
  </WindowsFormsHost>
</Grid>

这也可以在代码中完成,方法是将TextBox从其父对象中删除,将其添加到新创建的ElementHost中,然后将ElementHost添加到新创建的WindowsFormsHost中,并将WindowsFormsHost添加回父对象中。

请注意,WPF样式和属性(包括DataContext、TextElement属性等)不会通过ElementHost向下传播,即使包装在WindowsFormsHost中也是如此,因此必须手动传播所需的设置和资源。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3526488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档