1

我的一个申请遭到了批评。显示的文本被认为是模糊的。我稍微放大了窗口并得到了这个结果(所以他们是对的)

文字模糊

这是我在这个简化示例中尝试过的结果:

<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>

我在这里找到了类似的东西。但 UseLayoutRounding 似乎不适用于 .Net 3.5。我用谷歌搜索了一下,发现 .Net 4 (TextOptions.TextRenderingMode) 有改进,解决了这个问题,但是用这个应用程序切换到 .Net 4 不是一种选择。

据我所知,Win7 呈现 WPF 与 XP 不同,我还启动了一个虚拟 XP 并在那里进行了尝试。结果是一样的。

有人想在 .Net 3.5 中整理文本吗?

4

3 回答 3

3

我不认为使用 Bitmap 字体你可以在这里做任何事情。:(BitmapScalingMode只要您使用的字体是基于 Vector 的,就不会影响您当前的示例,您确实需要 4.0文本改进

在 Windows 7 中,文本绘图被切换到 DWrite,这就是它与 XP 不同的原因。

于 2013-02-05T07:43:00.927 回答
2

If upgrading to .NET 4.0 is absolutely not an option, there's one last (slightly desperate) option you could consider: get something else to render the text. For example, you could use, say, GDI+ to render the text you need to a bitmap and then display that. Or you could use interop to host a Windows Forms Label control.

These are both truly horrible solutions (which is why I've only suggested this after you confirmed in the comments that using a recent version of WPF is simply not an option). The interop one will lead to all the usual HWND interop problems (i.e, the Label will get its own HWND, meaning that it will be rendered completely separately from the WPF content, which might lead to obvious visual discontinuities.)

因此,如果我陷入这种情况,我想我会考虑渲染到位图的选项。可以使用 GDI+ 生成位图,然后您可以使用 WPF Image 元素进行渲染。如果您准备编写一个自定义控件来执行此操作,您甚至可以支持数据绑定之类的东西(通过为您呈现的文本定义一个 Text 依赖属性)。虽然这并不简单——尽管在支持 Windows 位图方面存在共同点,但将数据从 GDI+ 世界传输到 WIC(Windows 图像处理组件,这是 WPF 处理位图所依赖的)是……混乱的。此外,如果您需要支持可访问性(例如,使文本对屏幕阅读器可见,支持助记访问键等),那么这将成为一项相对复杂的工作。

于 2013-02-06T10:29:58.043 回答
1

正如Ameen's answer 的链接中所解释的,这个问题主要出现在小字体上。

增加字体大小是您的选择吗?我知道这与其说是一种解决方案,不如说是一种解决方法,但如果您无法摆脱 Framework 3.5,它是一种快速简便的方法来消除模糊性。

于 2013-02-06T09:00:24.320 回答