WPF在Windows XP和Windows 7上的呈现方式不同

时间:2009-10-22 08:43:31

标签: wpf windows-7 windows-xp rendering

为什么WPF在Windows XP和Windows 7上的渲染方式不同?

我在两台计算机上都使用.NET SP1。

我的布局就像这个没有工具栏的窗口,并且设置为最大化,因此它适合整个屏幕。

在此之下,我有一个Viewbox设置为使用Stretch:Uniform,在我之下我有我的LayoutRoot。

这样我希望在所有计算机上获得相同的布局,但似乎它在Windows XP上的渲染效果并不完全相同。有些项目有点小,布局看起来不那么好。

我试图将我的Windows 7计算机上的重新设置更改为与Windows XP计算机相同的设置,并保持其应有的布局。

两台计算机都使用96 DPI。

Windows XP

Windows 7

4 个答案:

答案 0 :(得分:10)

花了我大约三个小时的时间才最终搞清楚这一点 - 经过大量的侦探工作,但现在它的像素完美!

Windows XP上的WPF和Windows 7上的WPF似乎不仅具有不同的默认字体以及默认字体尺寸

  • 我遇到的问题是,在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上都有像素完美渲染,它们的区别只在于明确的反锯齿差异。

注意:UseLayoutRounding不是我的解决方案的一部分 - 但我也总是在我的根控件上使用它。

答案 1 :(得分:6)

默认字体不同

制作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: {1}{0}Font Family: {2}{0}Font 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”size 11

Windows 7的默认字体是“Segoe UI”大小12

答案 2 :(得分:2)

我的经验:

我不确定是不是问题,我注意到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 =中间的东西,如果猜测

答案 3 :(得分:2)

不同版本的Windows具有不同的默认字体(也是相同字体的不同版本)和不同的字体渲染引擎 - 因此系统之间的文本大小不同。

您可以尝试将字体设置为相同的字体并查看其工作原理,也可以尝试使用多种字体来检查差异最小的位置。