WPF 和 Windows 窗体提供了用于创建应用程序接口的两种不同的体系结构。 命名空间 System.Windows.Forms.Integration 提供启用常见互作方案的类。 实现互作功能的两个关键类是 WindowsFormsHost 和 ElementHost。 本主题介绍支持哪些互作方案,以及不支持哪些方案。
注释
对于混合控制情景给予特别考虑。 混合控件是将一种技术的控件嵌套在另一种技术的控件中。 这也称为 嵌套互操作。 多级混合控件具有多个混合控件嵌套级别。 多级嵌套互作的示例是包含 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 托管时,TextBox 和 ComboBox 控件将不透明。 |
使用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 控件之间的操作。 | 不適用。 |