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。 对于 Normal:Italic 已禁用。 对于 Italic 或 Oblique:Italic 已启用。 |
FontWeight | 托管控件的 System.Drawing.Font 上的 Style | WPF 属性集将转换为相应的 Font。 当其中一个属性发生更改时,将创建一个新的 Font。 对于 Black、Bold、DemiBold、ExtraBold、Heavy、Medium、SemiBold 或 UltraBold:Bold 已启用。 对于 ExtraLight、Light、Normal、Regular、Thin 或 UltraLight:Bold 已启用。 |
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 属性映射: - 如果 Foreground 为 SolidColorBrush,则将 Color 用于 ForeColor。 - 如果 Foreground 为 GradientBrush,请将具有最低偏移值的 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 = true 或 false 。 托管 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 控件映射属性。