2013-02-05 57 views
1

有一个批评我的应用程序之一。显示的文字被认为是模糊的。我有点放大窗口,得到这个结果(所以他们是正确的)TextBlock在WPF 3.5中模糊

Blurry text

从我在这里试图在这个简单的例子导致:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <StackPanel> 
      <TextBlock Text="StatusDTC [1]"></TextBlock> 
      <TextBlock Text="StatusDTC [2]" 
         RenderOptions.BitmapScalingMode="NearestNeighbor" 
         RenderOptions.EdgeMode="Aliased"></TextBlock> 
      <TextBlock Text="StatusDTC [3]" 
         SnapsToDevicePixels="True"></TextBlock> 
      <TextBlock Text="StatusDTC [4]" 
         SnapsToDevicePixels="True" 
         RenderOptions.BitmapScalingMode="NearestNeighbor" 
         RenderOptions.EdgeMode="Aliased"></TextBlock> 
     </StackPanel> 
    </Grid> 
</Window> 

我发现了类似here东西。但UseLayoutRounding似乎不适用于.Net 3.5。我搜索了一下,发现.Net 4(TextOptions.TextRenderingMode)解决了这个问题,但是使用这个应用程序切换到.Net 4并不是一种选择。我知道Win7呈现WPF不同于XP,我也开始了一个虚拟的XP,并尝试在那里。结果是一样的。

有人有一个想法来清晰.net 3.5中的文本?

+0

另请参阅此文章:http://stackoverflow.com/questions/190344/wpf-blurry-fonts-problem-solutions(主要是4.0) – fixagon

回答

1

the link from Ameen's answer解释,这个问题大多出现在小字体大小。

是增加了字体大小为你的选择吗?我知道,这是一个多解一个解决办法,但它是一个快速如果你不能离开Framework 3.5,那么简单的方法就可以摆脱这种模糊性。

3

我不认为使用位图字体不足,你可以在这里做任何事情。 :(BitmapScalingMode应该不会影响您当前的示例,只要您使用的字体是基于矢量的,您确实需要4.0 text improvements

在Windows 7中,文本图纸已切换为DWrite,这就是为什么它与XP不同。

+1

只是为了确认,WPF中相对模糊的文本是一个长期存在的问题,只在.NET 4.0中得到修复。如果你想让WPF呈现你的文本,那么让它看起来像正常的Windows文本一样清晰的唯一方法是使用v4.0(这是公平的,大约3年前发布的!)。 –

+0

@IanGriffiths当然,.Net4并不是全新的东西。但有些事情是公司的决定,因此超出了我的影响力范围: - /感谢您为我的死胡同做了一个水晶。现在我可以停止搜索,这也有帮助。 – Markus

+0

+1。我偷了你的链接。 ;-) – Heinzi

2

如果升级到.NET 4.0绝对不是一种选择,那么您可以考虑最后一个(稍微绝望)选项:获取其他内容以呈现文本。例如,您可以使用GDI +将需要的文本呈现为位图,然后显示该文本。或者您可以使用互操作来托管Windows窗体标签控件。

这些都是真正可怕的解决方案(这就是为什么我只是在评论中证实使用WPF的最新版本不是一种选择后才提出这一点)。互操作将导致所有常见的HWND互操作问题(即,标签将获得自己的HWND,这意味着它将完全与WPF内容分开,这可能导致明显的视觉不连续性。)

所以如果我被困在这种情况下,我想我会考虑渲染到位图的选项。可以使用GDI +生成一个位图,然后您可以使用WPF图像元素进行渲染。如果你准备编写一个自定义控件来做到这一点,你甚至可以支持诸如数据绑定之类的东西(通过为你渲染的文本定义一个Text依赖项属性)。尽管在支持Windows位图方面存在共同点,但将数据从GDI +世界转移到WIC(Windows成像组件,这是WPF依赖于其位图处理所依赖的)是......很混乱。另外,如果您有任何需要支持辅助功能(例如,使屏幕阅读器可见的文本,支持助记键的访问键等),那么这将变成一项相对复杂的工作。

+0

谢谢,理论可能性很好。在绑定的DataGrid(来自WPF工具包,因为3.5)有几百个条目和许多列,我将冒险这里可能没有尝试。对于其他人来说,这可能是一种方式。 – Markus