WPF:如果我在父元素上使用阴影效果,为什么文本和元素会变得模糊?

27

如果我向父元素添加一个DropShadowEffect,子元素的文本模糊了。为什么?

<Grid>
    <Grid.Effect>
        <DropShadowEffect />
    </Grid.Effect>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
    </Grid.RowDefinitions>
    <TextBlock Background="White">Test</TextBlock>
</Grid>

更新:

带有阴影

在此输入图片描述

不带阴影

在此输入图片描述


这种情况我没有遇到过,请贴更多的代码或截图。 - Felice Pollano
我正在使用Mac上的Parallels虚拟机运行Windows XP,这可能是问题所在吗? - Smolla
好问题。我使用的是Visual Studio 2010 Express。我应该在哪里找到WPF的版本? - Smolla
@Smolla 应该是 4,无论如何请检查 PresentationCore 的版本。 - Felice Pollano
@Smolla 我也尝试了2010年的版本,在kaxaml测试中也是正常的。 - Felice Pollano
3个回答

53

文字模糊的原因是因为效果会导致元素及其所有子元素首先被渲染为位图。这意味着无法进行亚像素渲染(ClearType),因此文本看起来质量较低。

您可以通过仅将效果应用于视觉树的某些部分来解决此问题。不包含文本的部分。

在您的情况下,您可能需要像这样:

<Grid>
    <Border>
        <Border.Effect>
            <DropShadowEffect />
        </Border.Effect>
    </Border>
    <TextBlock Background="White">Test</TextBlock>
</Grid>

1
这应该被标记为被接受的答案,因为它显然是正确的。我认为你可能需要在边框上设置背景而不是下面的文本块,以便投影显示,因为如果边框没有可视部分来投射阴影,则不会显示。 - Øyvind Bråthen
感谢Patrick的回答,我已经接受了。抱歉回复晚了 ;) - Smolla
被接受的答案可能并不完全正确,因为在我的情况下(阴影直接落在文本上,但效果应用于ContentProvider),在设计师中是可以的,但在运行应用程序时却不行。这里还有更多的问题。 - user2079562
4
您也可以尝试 <DropShadowEffect RenderingBias="Quality" />,这对我很有帮助。 - Darren
我尝试过这个,但是根据屏幕上的位置,边框在不同方向上偏移了一个像素,可能是由于四舍五入造成的。 - xr280xr

25

可能是亚像素的问题。

尝试向网格添加UseLayoutRounding ="True"


3
尝试将TextOptions.TextFormattingMode="Display"添加到TextBlock中,如WPF模糊字体问题 - 解决方案所示。
该效果可能会通过将网格移动一些像素分数来增加“模糊度”。

3
这没有改变任何事情 :( - Smolla
尝试将其添加到TextBlock而不是Grid。 - LawMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接