为什么WPF在Windows XP和Windows 7上的渲染方式不同?
我在两台计算机上都使用.NET SP1。
我的布局就像这个没有工具栏的窗口,并且设置为最大化,因此它适合整个屏幕。
在此之下,我有一个Viewbox设置为使用Stretch:Uniform,在我之下我有我的LayoutRoot。
这样我希望在所有计算机上获得相同的布局,但似乎它在Windows XP上的渲染效果并不完全相同。有些项目有点小,布局看起来不那么好。
我试图将我的Windows 7计算机上的重新设置更改为与Windows XP计算机相同的设置,并保持其应有的布局。
两台计算机都使用96 DPI。
答案 0 :(得分:10)
花了我大约三个小时的时间才最终搞清楚这一点 - 经过大量的侦探工作,但现在它的像素完美!
Windows XP上的WPF和Windows 7上的WPF似乎不仅具有不同的默认字体面以及默认字体尺寸。
最终我发现我指定显式大小的字体在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具有不同的默认字体(也是相同字体的不同版本)和不同的字体渲染引擎 - 因此系统之间的文本大小不同。
您可以尝试将字体设置为相同的字体并查看其工作原理,也可以尝试使用多种字体来检查差异最小的位置。