【求助】WPF字体各种糊各种虚,请教完美解决方式

aresskyaressky 2014-08-17 03:30:45
1、控件位置,尤其是当按钮使用当使用DropShadowEffect时
如按钮,放在这个位置文字不虚,向其他方向移动几个像素就虚了。
还有像下图所示,同样的TextBlock同样的Style,上面的实下面两个就虚

左上角的TextBlock实,右下角的按钮虚(这两个按钮怎么调整位置都是虚的)


2、窗体拉伸
如1把按钮调整到不虚的位置,把窗体最大化又虚了。

3、动画
经常出现下面的情况,动画(一般是Grid的伸缩、移动动画,Grid中包含有类似TextBlock的控件,不是单纯的文字动画)结束后,控件运动已经停止了,文字边缘就会在控件停止后上下缩幅震动2秒左右(有点像Flash做的上下进入的效果),非常讨厌,恍的眼睛受不了啊,有的时候调整TextBlock或其父控件的Margin或Height属性,会避免这种情况,有的时候怎么调整都不行,还有的时候调整好了,一换字体或字体加粗,就又出现了,完全没规律可言嘛。

尝试过的解决方法:
1、用WPF4.0中的新字体渲染方法,没有改善

<Setter Property="TextOptions.TextFormattingMode" Value="Display" />
<Setter Property="TextOptions.TextRenderingMode" Value="ClearType" />


2、给控件加上SnapsToDevicePixels属性,没有改善
其作用传说是给整个 UI 上启用像素对齐呈现。 对于运行在大于 96 dots per inch (dpi) 的设备,像素对齐呈现可以最小化在单一实线附近出现的抗锯齿视觉瑕疵。

3、使用Times New Roman字体或微软雅黑字体,好一点,但是字体比较丑,也不能完全避免虚糊,另外解决不了动画后,文字继续震动虚边现象。

4、给控件加上BitmapCache
,一开始在我的台式兼容机上貌似解决了动画虚边的现象,结果转到Mac Pro上,发现文字变成低像素图片放大了的样子,比虚边还难以接受。

肯请高手出现解决一下。

...全文
853 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
aresskyaressky 2014-08-20
  • 打赏
  • 举报
回复
动画停止后造成的文字2秒左右的虚糊主要是因为父控件和子控件的height属性,最好是把子控件的height设置为auto,一般能解决问题,有时还要给文字加上一个上margin才行。
aresskyaressky 2014-08-20
  • 打赏
  • 举报
回复
高手就是高手 总结: 1、UseLayoutRounding还有一点点虚,不建议使用。 2、要使用自定义投影效果时,采用平行元素法,Button平级的上面加一个大小相等的Border来投影。 3、对投影效果没特殊要求时,使用SystemDropShadowChrome,需要在项目引用中添加PresentationFramework.Areo的引用。
Forty2 2014-08-18
  • 打赏
  • 举报
回复
虚糊字体的主要原因是DropShadowEffect。因为DropShadowEffect使得元素/子元素先渲染为位图,从而导致的位图栅格对齐导致的模糊。

解决方法有几个,
一个是使用UseLayoutRounding,它使得控件布局的时候对齐栅格(见效果2)。
一个是让Text元素不作为DropShadowEffect的子元素,让ShadowEffect不会影响Button(见效果3)。

效果如下(0:基准 1:虚糊 2:UseLayoutRounding 3:平行元素)


效果4是试验SystemDropShadowChrome,可以注释掉。

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:luna="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna"
Title="MainWindow" Height="350" Width="525" SnapsToDevicePixels="True">
<Window.Resources>
<Style TargetType="Button">
<Setter Property="Width" Value="80" />
<Setter Property="Height" Value="40" />
<Setter Property="Margin" Value="0,5,0,5" />
</Style>
</Window.Resources>
<StackPanel>
<Button Content="基本设置 0" />
<Button Content="基本设置 1" >
<Button.Effect><DropShadowEffect/></Button.Effect>
</Button>
<Button Content="基本设置 2" UseLayoutRounding="True">
<Button.Effect>
<DropShadowEffect/>
</Button.Effect>
</Button>
<Grid Width="80" Height="40" Margin="0,5,0,5">
<Border Background="Black" Margin="1,0,0,0" CornerRadius="2">
<Border.Effect><DropShadowEffect /></Border.Effect>
</Border>
<Button Content="基本设置 3" Margin="0"/>
</Grid>
<luna:SystemDropShadowChrome Width="80" Height="40" Margin="0,5,0,0">
<Button Content="基本设置 4" Margin="0" />
</luna:SystemDropShadowChrome>
</StackPanel>
</Window>

8,734

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧