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 上的呈现方式不同的主要内容,如果未能解决你的问题,请参考以下文章

WPF 会在 XP 和 Vista 上运行吗?

在 Windows XP 下通过远程桌面渲染 WPF 是不是存在问题?

在 Windows XP 上运行时 TextBox.Text 绑定错误

WPF程序在XP系统运行出错:system.windows.media.fontfamily类型初始值设定项引发异常

window 7系统和window xp系统那个比较好,相对于兼容性,扩展性,主要帮我详细介绍下window 7

window XP操作系统的各种快捷键