WPF 在 Windows XP 和 Windows 7 上的呈现方式不同
Posted
技术标签:
【中文标题】WPF 在 Windows XP 和 Windows 7 上的呈现方式不同【英文标题】:WPF renders differently on Windows XP vs Windows 7 【发布时间】:2010-12-09 00:22:41 【问题描述】:为什么 ?
我在两台计算机上都使用 .NET SP1..
我的布局就像这个没有工具栏的窗口,并且设置为最大化以适应整个屏幕。
在此之下,我有一个 Viewbox 设置为使用 Stretch: Uniform,在此之下我有我的 LayoutRoot。
我希望通过这种方式在所有计算机上获得相同的布局,但它在 Windows XP 上的渲染似乎并不完全相同。有些项目有点小,布局看起来不太好。
我已尝试将我在 Windows 7 计算机上的分辨率更改为与 Windows XP 计算机相同,并且它保持应有的布局。
两台电脑都使用 96 DPI。
Windows XP
Windows 7
【问题讨论】:
【参考方案1】:我花了大约三个小时终于弄明白了——经过大量的侦探工作,但现在它是像素完美的!
看来,Windows XP 上的 WPF 和 Windows 7 上的 WPF 不仅具有不同的默认字体 faces 以及默认字体 sizes。
我遇到了一个问题,即字体在 Windows XP 上的渲染与在 Windows 7 上的渲染方式不同。这是非常关键的,因为最终输出到打印机,并且它们需要相同。最初看起来问题出在行距上。 是的 - 我在 Windows XP 上安装的字体与在 Windows 7 上使用的字体完全相同 是的 - 我尝试了一种非常通用的字体(Arial),但仍然遇到同样的问题。 是 - 两台机器上的 DPI 相同。 是 - 无论是在 VM(Windows XP 模式)还是在真正的 Windows XP 机器上,结果都相同。最终我发现我指定显式大小的字体在 Windows XP 上看起来相同,只有我没有指定显式大小的字体不同。
这就是我在MainWindow.xaml
中修复它的方法 - 使用ContentControl
设置默认大小:
<Grid x:Name="LayoutRoot" Background="#FFDEDEDE" UseLayoutRounding="True">
<ContentControl FontFamily="Segoe UI" FontSize="12">
... window contents ...
</ContentControl>
</Grid>
注意:如果您使用的是Blend,您可能需要手动输入FontSize="12"
。如果你从属性设计器中选择它,它会删除它,因为它认为 12 已经是默认值了!
就像我说我的目的地是打印机 - 所以我必须为正在打印的控件做同样的事情。
我还能在哪里设置此默认字体大小?无论如何,我现在在 Windows XP 和 Windows 7 上都有像素完美渲染,它们的区别仅在于 cleartype 抗锯齿差异。
注意:UseLayoutRounding
不是我的解决方案的一部分 - 但我也总是在我的根控件上使用它。
【讨论】:
在我的例子中,WPF 设计器在“属性”窗格 (VS2013) 的“文本”部分中将“Segoe UI”列为字体系列,但这并没有在 XAML 中明确设置。这在我的应用程序中呈现为类似于 Arial 的东西,这很奇怪,因为我使用的是 Windows 7,而且我知道该操作系统的默认设置是 Segoe UI。无论如何,明确设置字体系列(如上面的字体大小提示所示)修复它。 许多“默认”值在 XP 上看起来完全不同。例如,按钮上的渐变背景在 Win7 上看起来不错,但在 XP 上却平淡无味。解决方案是稍微调整默认值。对“默认”的任何更改都有效。【参考方案2】:默认字体不同
制作一个WPF按钮
<Button x:Name="button" Width="100" Height="25" Content="Button" Click="Button_Click"/>
和后面的代码:
private void Button_Click(object sender, RoutedEventArgs e)
string msg = string.Format("Number of fonts: 10Font Family: 20Font Size: 3",
Environment.NewLine,
button.FontFamily.FamilyNames.Values.Count.ToString(),
button.FontFamily.FamilyNames.Values.First().ToString(),
button.FontSize.ToString());
MessageBox.Show(msg);
在每个操作系统上运行这个,你会发现 XP 和 Windows7 的默认字体是不同的。
XP 的默认字体是“Tahoma” 11 号
Windows 7 的默认字体是“Segoe UI”大小 12
【讨论】:
【参考方案3】:我的经验:
我不确定是否是问题所在,我注意到 Windows 7 使用硬件加速来绘制 WPF 应用程序。 Windows XP 没有。
您可以通过以下方式检查是否是这种情况:
public partial class App
public static int Tier get return RenderCapability.Tier >> 16;
static App()
Console.Out.WriteLine("Render Tier: 0", Tier);
如果使用全硬件加速绘图,您的渲染层应返回 2。 0 = 软件,1 = 如果猜测,则在中间
【讨论】:
WPF 在所有受支持的操作系统上使用硬件加速。 XP 更容易出现视频撕裂,这是 DWM(Vista,7)帮助解决的问题。【参考方案4】:不同版本的 Windows 有不同的默认字体(同样的字体也有不同的版本)和不同的字体渲染引擎 - 因此系统之间的文本大小不同。
您可以尝试将字体设置为相同的字体,看看它是如何工作的,也许尝试几种字体来检查差异最小的地方。
【讨论】:
您还可以将字体包含到您的应用程序中。 Expression Blend 为此创建了 Fonts 文件夹(通过工具 > 字体管理器...)以上是关于WPF 在 Windows XP 和 Windows 7 上的呈现方式不同的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows XP 下通过远程桌面渲染 WPF 是不是存在问题?
在 Windows XP 上运行时 TextBox.Text 绑定错误
WPF程序在XP系统运行出错:system.windows.media.fontfamily类型初始值设定项引发异常