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

Pet*_*ter 12 wpf rendering windows-xp windows-7

为什么WPF在Windows XP和Windows 7上呈现不同?

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

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

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

这样我希望在所有计算机上获得相同的布局,但它似乎在Windows XP上的呈现方式完全不同.有些项目有点小,布局看起来不那么好.

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

两台计算机都使用96 DPI.

Windows XP

Windows 7的

Sim*_*ver 10

花了大约三个小时才终于解决这个问题 - 经过大量的侦探工作,但现在它完美无缺!

看来,WPF在Windows XP和WPF在Windows 7不仅有不同的默认字体面临以及默认字体大小.

  • 我遇到的问题是,Windows XP上的字体与Windows 7上的字体呈现方式不同.由于最终输出是打印机,因此它们必须完全相同.最初似乎问题是线间距的差异.
  • 是的 - 我在Windows XP上安装了与在Windows 7上使用的完全相同的字体
  • 是的 - 我尝试了一种非常通用的字体(Arial),但仍然遇到了同样的问题.
  • 是 - 两台机器上的DPI相同.
  • 是 - 无论是在VM(Windows XP模式)还是在真正的Windows XP计算机上,都会产生相同的结果.

最后我发现我在Windows XP上指定显式大小的字体看起来是相同的,只有我没有指定明确大小的字体才有所不同.

所以这就是我如何修复它MainWindow.xaml- 用a ContentControl来设置默认大小:

<Grid x:Name="LayoutRoot" Background="#FFDEDEDE" UseLayoutRounding="True">
    <ContentControl FontFamily="Segoe UI" FontSize="12">
         ... window contents ...
    </ContentControl>
</Grid>
Run Code Online (Sandbox Code Playgroud)

注意:如果您正在使用Blend,则可能需要FontSize="12"手动输入.如果从属性设计器中选择它,它将删除它,因为它认为12已经是默认值!

就像我说我的目的地是打印机 - 所以我必须对打印的控件做同样的事情.

我还能在哪里设置这个默认字体大小?无论如何,我现在在Windows XP和Windows 7上具有像素完美渲染,并且它们的区别仅在于明确的抗锯齿差异.

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


小智 6

默认字体不同

制作WPF按钮

<Button x:Name="button" Width="100" Height="25" Content="Button" Click="Button_Click"/>
Run Code Online (Sandbox Code Playgroud)

和代码背后:

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);
}
Run Code Online (Sandbox Code Playgroud)

在每个操作系统上运行此命令,您将看到XP和Windows7的默认字体不同.

XP的默认字体是"Tahoma"size 11

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


Ric*_*ick 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您的渲染层使用完整的硬件加速绘图,则它应该返回 2。0 = 软件,1 = 中间的东西(如果猜测的话)