我使用WPF互操作性来在WinForms表单中托管WPF用户控件.一切正常,除了丑陋的文字渲染:
<Label Content="Normal text" Name="labelNormal"/>
<Label Content="Bold text" Name="labelBold" FontWeight="Bold" />
Run Code Online (Sandbox Code Playgroud)
- 这是WPF窗口上的简单标签:
WPF窗口http://img525.imageshack.us/img525/7049/wpfwindow.png
- 以及在WinForms中托管WPF用户控件时显示的相同标签:
WPF Interop http://i51.tinypic.com/14j4xnc.jpg
Interop变体是完全不同的:intercharacter间隔为零,文本看起来更纯粹的WPF变体.当普通文本可以接受时,粗体文本很难看.
有什么想法如何修复它?
先感谢您!
Ian*_*ths 20
(1月18日编辑,补充说它不仅仅是字体渲染模式,还有字体本身.)
这里有两个相关因素:字体和字体格式化模式.
您的Windows窗体主机应用程序强制使用字体大小为8.25pt的默认字体系列"Microsoft Sans Serif",在WPF的测量单位中FontSize为11.但WPF通常使用不同的字体 - 我正在运行Windows 7使用默认的Aero主题,WPF默认使用FontSize12的Segoe UI .
所以你在这里看到不同结果的最大原因是那些是两种不同的字体.添加FontFamily="Segoe UI" FontSize="12"到UserControl根元素使得两个WPF示例看起来更加一致.(但这当然会使您的WPF文本看起来与包含Windows窗体应用程序中的文本不一致.这就是ElementHost将Windows窗体字体选择传播到WPF内容的全部原因.)
在我编辑之前,我曾认为它可能取决于WPF文本呈现的Ideal和Display模式之间的区别.已经意识到它主要是关于字体,我不再认为是这种情况,但我将在这里留下对这个问题的讨论,因为它对于任何试图让他们的WPF文本看起来与他们的Windows一致的人仍然有用表格文字.WPF的默认设置是Ideal,但如果您在Windows窗体应用程序中运行,可以说Display是更好,因为这会使它看起来与Windows窗体通常呈现的方式一致.
您可以通过添加以下内容在每个元素的基础上在WPF中控制此:
TextOptions.TextFormattingMode="Display"
Run Code Online (Sandbox Code Playgroud)
(或"Display"取决于您想要的模式).WPF v4中添加了这个可附加属性,让您可以选择WPF自首次发布以来的可缩放但略微模糊的文本渲染,以及Win32和GDI +的扭曲但非常清晰的网格拟合渲染(以及Windows表格)使用.这将影响您应用它的元素,以及任何后代.(例如,如果你在StackPanel它上面设置它应该应用于该面板中的所有元素,除非你在子节点上本地将它设置为不同的值.)
默认情况下,WPF尝试保持比Win32或GDI +更好的原始字体设计保真度.并且它还以一种方式呈现文本,这意味着它可以一致地扩展 - 增加字体大小,比如12%将使文本的宽度在屏幕上增大12%.在Win32或GDI +中并非如此,在这种情况下,您会得到相当复杂的非线性变化.
但是很多人抱怨为了获得更好的保真度而增加的模糊度.所以这就是WPF 4引入新属性的原因.将其设置Display为获得较低保真度但更清晰的旧样式渲染.
由于您可以根据每个元素进行选择,因此您可以选择独立的大小和普通文本.
| 归档时间: |
|
| 查看次数: |
4955 次 |
| 最近记录: |