WPF 和 Windows 窗体互操作性

WPF 和 Windows 窗体提供了用于创建应用程序接口的两种不同的体系结构。 命名空间 System.Windows.Forms.Integration 提供启用常见互作方案的类。 实现互作功能的两个关键类是 WindowsFormsHostElementHost。 本主题介绍支持哪些互作方案,以及不支持哪些方案。

注释

对于混合控制情景给予特别考虑。 混合控件是将一种技术的控件嵌套在另一种技术的控件中。 这也称为 嵌套互操作多级混合控件具有多个混合控件嵌套级别。 多级嵌套互作的示例是包含 WPF 控件的 Windows 窗体控件,该控件包含另一个 Windows 窗体控件。 不支持多级混合控件。

在 WPF 中托管 Windows 窗体控件

WPF 控件承载 Windows 窗体控件时支持以下互作方案:

  • WPF 控件可以使用 XAML 托管一个或多个 Windows 窗体控件。

  • 它可以使用代码托管一个或多个 Windows 窗体控件。

  • 它可以托管包含其他 Windows 窗体控件的 Windows 窗体容器控件。

  • 它可以托管具有 WPF 主控形状和 Windows 窗体详细信息的主窗体/详细信息。

  • 它可以托管一个包含 Windows Forms 主控表单和 WPF 详细信息的主细节表单。

  • 它可以托管一个或多个 ActiveX 控件。

  • 它可以承载一个或多个复合控件。

  • 它可以使用可扩展应用程序标记语言(XAML)托管混合控件。

  • 它可以使用代码托管混合控件。

布局支持

以下列表描述了在 WindowsFormsHost 元素尝试将其托管的 Windows 窗体控件集成到 WPF 布局系统时的已知限制。

  • 在某些情况下,Windows 窗体控件无法调整大小,或者只能调整到特定尺寸。 例如,Windows 窗体 ComboBox 控件仅支持单个高度,该高度由控件的字号定义。 在 WPF 动态布局中,假定元素可以垂直拉伸,托管 ComboBox 控件不会按预期拉伸。

  • 无法旋转或倾斜 Windows 窗体控件。 例如,当你将用户界面旋转 90 度时,托管的 Windows 窗体控件将保持其直立位置。

  • 在大多数情况下,Windows 窗体控件不支持比例缩放。 尽管控件的整体维度将缩放,但控件的子控件和组件元素可能无法按预期调整大小。 此限制取决于每个 Windows 窗体控件对缩放的支持程度。

  • 在 WPF 用户界面中,可以更改元素的 z 顺序来控制重叠行为。 托管的 Windows 窗体控件在单独的 HWND 中绘制,因此它始终在 WPF 元素的顶部绘制。

  • Windows 窗体控件支持基于字号的自动缩放。 在 WPF 用户界面中,更改字体大小不会调整整个布局的大小,尽管单个元素可以动态调整大小。

环境属性

WPF 控件的某些环境属性具有 Windows 窗体等效项。 这些环境属性将传播到托管的 Windows 窗体控件,并作为控件上的 WindowsFormsHost 公共属性公开。 该 WindowsFormsHost 控件将每个 WPF 环境属性转换为其等效的 Windows 窗体。

有关详细信息,请参阅 Windows 窗体和 WPF 属性映射

行为

下表介绍了互作行为。

行为 已支持 不支持
透明度 Windows 窗体控件的渲染支持透明效果。 父 WPF 控件的背景可以成为托管 Windows 窗体控件的背景。 某些 Windows 窗体控件不支持透明度。 例如,当由 WPF 托管时,TextBoxComboBox 控件将不透明。
使用Tab键 托管 Windows 窗体控件的 Tab 顺序与在基于 Windows 窗体的应用程序中托管这些控件时的顺序相同。

使用 TAB 键和 Shift+TAB 键从 WPF 控件切换到 Windows 窗体控件可以像往常一样正常工作。

当用户通过 Tab 键切换控件时,具有 TabStop 属性值的 false 控件不会获得焦点。

- 每个 WindowsFormsHost 控件都有一个 TabIndex 值,该值确定该 WindowsFormsHost 控件何时接收焦点。
- 包含在 WindowsFormsHost 容器中的 Windows 窗体控件遵循 TabIndex 属性指定的顺序。 最后一个选项卡索引中的制表符将焦点放在下一个 WPF 控件上(如果存在)。 如果不存在其他可聚焦的 WPF 控件,按 Tab 键将返回到切换顺序中的第一个 Windows 窗体控件。
- TabIndex 控件内部的 WindowsFormsHost 值是相对于 WindowsFormsHost 控件中包含的同级 Windows 窗体控件的。
- Tabbing 遵循特定于控件的行为。 例如,在控件中 TextBox 按 TAB 键,该控件的 AcceptsTab 属性值 true 为在文本框中输入选项卡,而不是移动焦点。
不適用。
使用箭头键导航 - 控件中 WindowsFormsHost 带有箭头键的导航与普通 Windows 窗体容器控件中的导航相同:向上键和向左键选择上一个控件,向下键和向右键选择下一个控件。
- 第一个在WindowsFormsHost控件内的控件中的向上箭头键和左箭头键执行与Shift+TAB键盘快捷方式相同的操作。 如果存在可聚焦的 WPF 控件,焦点将移出 WindowsFormsHost 控件。 此行为不同于标准 ContainerControl 行为,因为不会换行至最后一个控件。 如果不存在其他可聚焦 WPF 控件,焦点将返回到 Tab 键顺序中的最后一个 Windows 窗体控件。
- WindowsFormsHost 控件中包含的最后一个控件的向下键和向右键执行与 Tab 键相同的动作。 如果存在可聚焦 WPF 控件,焦点将移出 WindowsFormsHost 控件。 此行为不同于标准 ContainerControl 行为,因为不会回绕至第一个控件。 如果不存在其他可聚焦 WPF 控件,焦点将返回到 Tab 键顺序中的第一个 Windows 窗体控件。
不適用。
加速器 加速器按往常工作,但“不支持”列中的说明除外。 跨技术的重复加速器不能像普通重复加速器一样工作。 当跨技术复制加速器时,在 Windows 窗体控件上至少有一个,而 WPF 控件上至少有一个,则 Windows 窗体控件始终接收加速器。 按下重复加速器时,焦点不会在控件之间切换。
快捷键 快捷键像往常一样工作,但“不支持”列中指出的情况除外。 - 在预处理阶段处理的 Windows 窗体快捷键始终优先于 WPF 快捷键。 例如,如果您有一个具有 CTRL+S 快捷键的 ToolStrip 控件,并且存在绑定到 CTRL+S 的 WPF 命令,则无论焦点如何,始终会先调用 ToolStrip 控件的处理程序。
- 在 WPF 中,KeyDown 事件处理的 Windows Forms 快捷键是最后被处理的。 可以通过重写 Windows 窗体控件的 IsInputKey 方法或处理 PreviewKeyDown 事件来阻止此行为。 在IsInputKey方法中,返回true,或在PreviewKeyDown事件处理程序中,将PreviewKeyDownEventArgs.IsInputKey属性的值设置为true
AcceptsReturn、AcceptsTab 和其他特定于控件的行为 假设 Windows 窗体控件重写了 IsInputKey 方法以返回 true,那么更改默认键盘行为的属性将如常运作。 在 WPF 主控件中,通过处理 KeyDown 事件来更改默认键盘行为的 Windows 窗体控件是最后被处理的。 因为这些控件是最后处理的,它们可能导致意外的行为。
进入和离开事件 当焦点没有转到包含ElementHost控件时,当焦点在单个WindowsFormsHost控件内发生变化时,Enter 和 Leave 事件会像往常一样被触发。 当发生以下焦点更改时,系统不会引发 Enter 和 Leave 事件:

- 从内部到控件外部 WindowsFormsHost
- 从外部到WindowsFormsHost控件内部。
- 控件 WindowsFormsHost 外部。
- 从托管在WindowsFormsHost控件中的Windows窗体控件,到托管在同一WindowsFormsHost控件中ElementHost内的控件。
多线程处理 支持所有多线程处理品种。 Windows 窗体和 WPF 技术都采用单线程并发模型。 在调试期间,从其他线程调用框架对象将引发异常,以强制实施此要求。
安全 所有互作方案都需要完全信任。 部分信任中不允许存在互操作方案。
可及性 支持所有无障碍访问方案。 辅助技术产品在用于包含 Windows 窗体和 WPF 控件的混合应用程序时能够正常运行。 不適用。
剪贴板 所有剪贴板操作都照常工作。 这包括在 Windows 窗体和 WPF 控件之间剪切和粘贴。 不適用。
拖放功能 所有拖放操作像往常一样正常工作。 这包括 Windows 窗体和 WPF 控件之间的操作。 不適用。

在 Windows 窗体中托管 WPF 控件

当 Windows 窗体控件承载 WPF 控件时,支持以下互操作方案:

  • 使用代码托管一个或多个 WPF 控件。

  • 将属性表与一个或多个托管的 WPF 控件相关联。

  • 在窗体中托管一个或多个 WPF 页面。

  • 启动 WPF 窗口。

  • 使用 Windows 窗体母版和 WPF 详细信息托管主窗体/详细信息。

  • 使用 WPF 主表单和 Windows Forms 详细信息托管主/详细表单系统。

  • 托管自定义 WPF 控件。

  • 托管混合控件。

环境属性

Windows 窗体控件的某些环境属性具有 WPF 等效项。 这些环境属性将传播到托管的 WPF 控件,并作为控件上的 ElementHost 公共属性公开。 该 ElementHost 控件将每个 Windows 窗体环境属性转换为其 WPF 等效属性。

有关详细信息,请参阅 Windows 窗体和 WPF 属性映射

行为

下表介绍了互作行为。

行为 已支持 不支持
透明度 WPF 控件渲染支持透明度。 父级Windows窗体控件的背景可以成为承载WPF控件的背景。 不適用。
多线程处理 支持所有多线程处理品种。 Windows 窗体和 WPF 技术都采用单线程并发模型。 在调试期间,从其他线程调用框架对象将引发异常,以强制实施此要求。
安全 所有互作方案都需要完全信任。 在部分信任环境中,不允许互操作方案。
可及性 支持所有辅助功能场景。 辅助技术产品在用于包含 Windows 窗体和 WPF 控件的混合应用程序时能够正常运行。 不適用。
剪贴板 所有剪贴板操作都正常运作。 这包括在 Windows 窗体和 WPF 控件之间剪切和粘贴。 不適用。
拖放功能 所有拖放操作都像往常一样正常运行。 这包括 Windows 窗体和 WPF 控件之间的操作。 不適用。

另请参阅