Windows 窗体和 WPF 属性映射

Windows 窗体和 WPF 技术具有两种相似但不同的属性模型。 属性映射支持两种体系结构之间的互操作,并提供以下功能

  • 可以轻松地将主机环境中的相关属性更改映射到托管控件或元素。

  • 提供映射最常用属性的默认处理。

  • 允许轻松删除、替代或扩展默认属性。

  • 确保自动检测主机上的属性值更改并将其转换为托管控件或元素。

注意

属性更改事件不会传播到主机控件或元素层次结构中。 如果属性的本地值因直接设置、样式、继承、数据绑定或其他更改属性值的机制而没有更改,则不会执行属性转换。

使用 WindowsFormsHost 元素上的 PropertyMap 属性和 ElementHost 控件上的 PropertyMap 属性来访问属性映射。

使用 WindowsFormsHost 元素进行属性映射

WindowsFormsHost 元素使用以下转换表将默认 WPF 属性转换为 Windows 窗体等效项。

Windows Presentation Foundation 托管 Windows 窗体 互操作行为
Background

(System.Windows.Media.Brush)
BackColor

System.Drawing.Color
WindowsFormsHost 元素设置托管控件的 BackColor 属性和 BackgroundImage 属性。 使用以下规则执行映射:

- 如果 Background 为纯色,则将被转换并用于设置托管控件的 BackColor 属性。 BackColor 属性未在托管控件上设置,因为托管控件可以继承 BackColor 属性的值。 注意:托管控件不支持透明度。 分配给 BackColor 的任何颜色都必须完全不透明,Alpha 值为 0xFF。

- 如果 Background 不是纯色,WindowsFormsHost 控件会从 Background 属性创建位图。 WindowsFormsHost 控件将此位图分配给托管控件的 BackgroundImage 属性。 这提供了类似于透明度的效果。 注意:可以替代此行为,也可以删除 Background 属性映射
Cursor Cursor 如果尚未重新分配默认映射,则 WindowsFormsHost 控件会遍历其上级层次结构,直到找到设置了 Cursor 属性的上级。 此值将转换为最接近的对应 Windows 窗体游标。

如果 ForceCursor 属性的默认映射尚未重新分配,则遍历将在 ForceCursor 设置为 true 的第一个上级处停止。
FlowDirection

System.Windows.FlowDirection
RightToLeft

System.Windows.Forms.RightToLeft
LeftToRight 映射到 No

RightToLeft 映射到 Yes

Inherit 未映射。

FlowDirection.RightToLeft 映射到 RightToLeft.Yes
FontStyle 托管控件的 System.Drawing.Font 上的 Style WPF 属性集将转换为相应的 Font。 当其中一个属性发生更改时,将创建一个新的 Font。 对于 NormalItalic 已禁用。 对于 ItalicObliqueItalic 已启用。
FontWeight 托管控件的 System.Drawing.Font 上的 Style WPF 属性集将转换为相应的 Font。 当其中一个属性发生更改时,将创建一个新的 Font。 对于 BlackBoldDemiBoldExtraBoldHeavyMediumSemiBoldUltraBoldBold 已启用。 对于 ExtraLightLightNormalRegularThinUltraLightBold 已启用。
FontFamily

FontSize

FontStretch

FontStyle

FontWeight
Font

System.Drawing.Font
WPF 属性集将转换为相应的 Font。 当其中一个属性发生更改时,将创建一个新的 Font。 托管的 Windows 窗体控件根据字号调整大小。

WPF 中的字号表示为 1/96 英寸,Windows 窗体中的字号表示为 1/72 英寸。 相应的转换如下:

Windows Forms 窗体字号 = WPF 字号 * 72.0 / 96.0。
Foreground

System.Windows.Media.Brush
ForeColor

System.Drawing.Color
使用以下规则执行 Foreground 属性映射:

- 如果 ForegroundSolidColorBrush,则将 Color 用于 ForeColor
- 如果 ForegroundGradientBrush,请将具有最低偏移值的 GradientStop 的颜色用于 ForeColor
- 对于任何其他 Brush 类型,保留 ForeColor 不变。 这意味着使用默认值。
IsEnabled Enabled 设置 IsEnabled 时,WindowsFormsHost 元素设置托管控件的 Enabled 属性。
Padding Padding 将托管 Windows 窗体控件的 Padding 属性的所有四个值都设置为相同的 Thickness 值。

- 大于 MaxValue 的值设置为 MaxValue
- 小于 MinValue 的值设置为 MinValue
Visibility Visible - Visible 映射到 Visible = true。 托管 Windows 窗体控件可见。 建议不要将托管控件的 Visible 属性显式设置为 false
- Collapsed 映射到 Visible = truefalse。 托管 Windows 窗体控件不会绘制,并且其区域会折叠。
- Hidden:托管 Windows 窗体控件占用布局中的空间,但不可见。 在本例中,Visible 属性设置为 true。 建议不要将托管控件的 Visible 属性显式设置为 false

WindowsFormsHost 元素完全支持容器元素上的附加属性。

有关详细信息,请参阅演练:使用 WindowsFormsHost 元素映射属性

对父属性的更新

对大多数父属性的更改会导致向托管子控件发出通知。 以下列表描述了在属性值发生更改时不会发出通知的属性。

例如,如果更改 WindowsFormsHost 元素的 Background 属性的值,则托管控件的 BackColor 属性不会更改。

使用 ElementHost 控件进行属性映射

以下属性提供内置的更改通知。 映射这些属性时,请勿调用 OnPropertyChanged 方法:

  • AutoSize

  • BackColor

  • BackgroundImage

  • BackgroundImageLayout

  • BindingContext

  • CausesValidation

  • ContextMenu

  • ContextMenuStrip

  • 游标

  • 靠接

  • Enabled

  • 字体

  • ForeColor

  • 位置

  • Margin

  • 填充

  • 父级

  • 区域

  • RightToLeft

  • 大小

  • TabIndex

  • TabStop

  • 文本

  • Visible

ElementHost 控件使用以下转换表将默认 Windows 窗体属性转换为 WPF 等效项。

有关详细信息,请参阅演练:使用 ElementHost 控件映射属性

Windows 窗体托管 Windows Presentation Foundation 互操作行为
BackColor

System.Drawing.Color
Background

(System.Windows.Media.Brush) 托管元素上
设置此属性将强制使用 ImageBrush 重画。 如果 BackColorTransparent 属性设置为 false(默认值),则此 ImageBrush 基于 ElementHost 控件的外观,包括其 BackColorBackgroundImageBackgroundImageLayout 属性以及任何附加的画图处理程序。

如果 BackColorTransparent 属性设置为 true,则 ImageBrush 基于 ElementHost 控件的父控件的外观,包括父控件的 BackColorBackgroundImageBackgroundImageLayout 属性以及任何附加的画图处理程序。
BackgroundImage

System.Drawing.Image
Background

(System.Windows.Media.Brush) 托管元素上
设置此属性会导致 BackColor 映射所述的相同行为。
BackgroundImageLayout Background

(System.Windows.Media.Brush) 托管元素上
设置此属性会导致 BackColor 映射所述的相同行为。
Cursor

System.Windows.Forms.Cursor
Cursor

System.Windows.Input.Cursor
Windows 窗体标准游标将转换为相应的 WPF 标准游标。 如果 Windows 窗体不是标准游标,则会分配默认值。
Enabled IsEnabled 设置 Enabled 时,ElementHost 控件设置托管元素的 IsEnabled 属性。
Font

System.Drawing.Font
FontFamily

FontSize

FontStretch

FontStyle

FontWeight
Font 值将转换为相应的 WPF 字体属性集。
Bold 托管元素的 FontWeight 如果 Boldtrue,则 FontWeight 设置为 Bold

如果 Boldfalse,则 FontWeight 设置为 Normal
Italic 托管元素的 FontStyle 如果 Italictrue,则 FontStyle 设置为 Italic

如果 Italicfalse,则 FontStyle 设置为 Normal
Strikeout 托管元素的 TextDecorations 仅在托管 TextBlock 控件时适用。
Underline 托管元素的 TextDecorations 仅在托管 TextBlock 控件时适用。
RightToLeft

System.Windows.Forms.RightToLeft
FlowDirection

(FlowDirection)
No 映射到 LeftToRight

Yes 映射到 RightToLeft
Visible Visibility ElementHost 控件使用以下规则设置托管元素的 Visibility 属性:

- Visible = true 映射到 Visible
- Visible = false 映射到 Hidden

另请参阅