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

时间:2010-08-19 21:41:49

标签: wpf winforms

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

由于

1 个答案:

答案 0 :(得分:1)

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

因此,IWin32Window返回WPF TextBox的“实际”Win32句柄是没有意义的:WPF TextBox根本没有Win32句柄。因此,您将不得不返回其他对象的Win32句柄。

如何执行此操作取决于您将使用IWin32Window的内容。创建与TextBox对应的Win32窗口有几种可能性:

  1. 您可以创建一个透明的Win32窗口,该窗口与TextBox重叠(对于命中测试或透支方案非常有用)
  2. 您可以创建一个以TextBox为中心的零大小窗口(对于对话框初始位置和所有权方案很有用)
  3. 您可以在ElementHost中而不是在WPF窗口中托管TextBox(如果您希望TextBox适合其他Win32内容,例如旧的MFC应用程序,则非常有用)
  4. 您可以在WindowsFormsHost中的ElementHost中托管TextBox(如果您需要围绕TextBox的Win32窗口但仍需要WPF布局,则非常有用
  5. 关于“额外窗口”解决方案的注释(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中,因此必须手动传播所需的设置和资源。

相关问题