原文:WPF 设置了阴影效果后,Y轴位置会有变化的问题

背景

最近遇到一个动画执行时,文本位置变化的问题。如下图:

如果你仔细看的话,当星星变小时,文本往下降了几个像素。

貌似有点莫名其妙,因为控件之间并不在同一个Panel布局控件中,不存在高度限制变化引发此类问题。所以有了如下测试

测试场景

字体类型影响

1. 首先新建了一个空项目,前面是一个带阴影的文本,后面用一张普通图片循环变更它的高度。尝试了下,还是会移动Y轴的像素

影响很大

2. 后面使用用普通的布局控件Grid代替。依然如此

影响较大

所以此问题不是图片动画造成的。

3. 于是,我再添加个按钮,测试带阴影的非文本控件

只有文本被影响了,按钮不会被影响?

我们使用放大镜,放大到500%,发现按钮中的文本,上下位置其实还是会有细微的变化 。

所以,按钮等控件其实也是会被影响的。只是幅度较小。

5. 给按钮设置,被影响文本同样的字体系列。

按钮也被影响了。。。所以,是字体原因!那么,这种字体类型是什么呢?

当前字体: FontFamily="Microsoft YaHei Bold"。

而上一步操作4中,按钮的字体类型是默认字体,即为Microsoft YaHei UI。

所以Microsoft YaHei Bold的影响比Microsoft YaHei UI大很多?

6. 我们回到只有文本的测试模式

影响较大

影响较小

所以,我们可以得出是Y轴位置变化,的确与字体类型有关。

变动很大

变动很小,使用放大镜500%才能看到细微的变化

通过如上测试,发现只有微软雅黑UI字体类型,影响较小。并且在步骤6中,测试通的是没有设置字体类型的,没有设置字体类型,其实默认是 Microsoft YaHei UI。所以字体类型影响相对较小的是Microsoft YaHei UI

字体大小

根据上述的字体类型测试,我们添加俩个文本框,使用Microsoft YaHei UI作为字体类型,设置字体大小分别为30和60。

通过如上对比,发现字体大小30的文本,受到的影响很明显。字体为60的文本,受到的影响较小。

综上,得出的结论是,Y轴变化的幅度,与字体类型、字体大小有关。具体的详细幅度,有待确认~~~

显示区域影响

单个影响因素

我们将高度变换的区域移动下位置,也不会有影响。

测试通过

多个影响因素

有多个影响因素时,不要设置在左右,否则也有影响。

测试不通过

测试通过

Demo前端代码:

 <Grid>
<Border VerticalAlignment="Center" BorderBrush="Red" BorderThickness="0 1 0 0"></Border> <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Height="80" Width="60" Margin="-460 0 0 0">
<Grid x:Name="StoryControl" Background="Red"
Height="30" Width="30" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5"/>
</Grid> <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Height="80" Width="60" Margin="460 0 0 0">
<Grid x:Name="StoryControl1" Background="Red"
Height="30" Width="30" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5"/>
</Grid> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock x:Name="TestTextBlock0" VerticalAlignment="Center" HorizontalAlignment="Center"
Text="YaHei Bold" Foreground="White" LineHeight="18" FontSize="60" FontFamily="Microsoft YaHei Bold">
<TextBlock.Effect>
<DropShadowEffect Color="#000000" BlurRadius="4" ShadowDepth="2" Opacity="0.24"/>
</TextBlock.Effect>
</TextBlock>
</StackPanel>
</Grid>

阴影效果

再尝试将阴影效果删除,也不会有影响

测试通过

重现步骤

1.添加一个文本/按钮控件

2.此显示控件设置阴影(条件一)

3.此显示控件设置字体类型FontFamily=“Microsoft YaHei Bold”(影响因素,不是条件),如下

1     <TextBlock x:Name="TestTextBlock1"  VerticalAlignment="Center" HorizontalAlignment="Center"
2 Text="微软雅黑加粗" Foreground="White" LineHeight="18" FontSize="60" FontFamily="Microsoft YaHei Bold">
3 <TextBlock.Effect>
4 <DropShadowEffect Color="#000000" BlurRadius="4" ShadowDepth="2" Opacity="0.24"/>
5 </TextBlock.Effect>
6 </TextBlock>

4.在此显示控件的显示区域,变更其它控件的高度(条件二)

完整案例如下:

 1 <Window x:Class="TextBlockShadowEffectForStoryBoardDemo.MainWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:local="clr-namespace:TextBlockShadowEffectForStoryBoardDemo"
7 mc:Ignorable="d" Title="MainWindow" Height="600" Width="800" Background="LightGray">
8 <Window.Resources>
9 <Storyboard x:Key="Storyboard.ChangeHeight" DesiredFrameRate="20">
10 <DoubleAnimationUsingKeyFrames Storyboard.TargetName="StoryControl" Storyboard.TargetProperty="Height" RepeatBehavior="Forever">
11 <EasingDoubleKeyFrame KeyTime="0:0:0" Value="0" />
12 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="15" />
13 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="30" />
14 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="30" />
15 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="15" />
16 <EasingDoubleKeyFrame KeyTime="0:0:1.0" Value="0" />
17 <EasingDoubleKeyFrame KeyTime="0:0:2" Value="0" />
18 </DoubleAnimationUsingKeyFrames>
19 </Storyboard>
20 </Window.Resources>
21 <Grid>
22 <Border VerticalAlignment="Center" BorderBrush="Red" BorderThickness="0 1 0 0"></Border>
23
24 <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Height="80" Width="60" Margin="0 60 0 0">
25 <Grid x:Name="StoryControl" Background="Red"
26 Height="30" Width="30" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5"/>
27 </Grid>
28 <TextBlock x:Name="TestTextBlock1" VerticalAlignment="Center" HorizontalAlignment="Center"
29 Text="微软雅黑加粗" Foreground="White" LineHeight="18" FontSize="60" FontFamily="Microsoft YaHei Bold">
30 <TextBlock.Effect>
31 <DropShadowEffect Color="#000000" BlurRadius="4" ShadowDepth="2" Opacity="0.24"/>
32 </TextBlock.Effect>
33 </TextBlock>
34 </Grid>
35 </Window>
 1     /// <summary>
2 /// MainWindow.xaml 的交互逻辑
3 /// </summary>
4 public partial class MainWindow : Window
5 {
6 public MainWindow()
7 {
8 InitializeComponent();
9 this.Loaded += MainWindow_Loaded;
10 }
11
12 private void MainWindow_Loaded(object sender, RoutedEventArgs e)
13 {
14 var storyboard = Resources["Storyboard.ChangeHeight"] as Storyboard;
15 storyboard?.Begin();
16 }
17 }

界面显示:

测试Demo请点击下载:https://files.cnblogs.com/files/kybs0/TextBlockShadowEffectDemo.zip

解决方案(只是规避)

按照如上重现步骤,有三个条件才会出现此问题。

1.设置了阴影效果 2.显示区域有宽高变更 3.字体类型/字体大小是一个影响幅度因素(影响较小的字体类型与字体大小组合,例如:微软雅黑UI+字体大小60)

针对这些条件,我们给出规避的解决方案

规避措施1:

不设置阴影效果

测试通过

规避措施2:

将高度变换的区域移动一点位置,不在带阴影的控件显示区域内。

测试通过

注:至于如上测试步骤中左右结构的多个影响因素

对于带阴影有控件,如俩侧控件同时有高度变化,引发的Y轴位置变化问题,暂时无规避方案。。。

规避措施3

设置一个字体类型+字体大小的最小影响组合,例如FontFamily="Microsoft YaHei UI",FontSize=60;

如果需要加粗,可以通过设置FontWeight加粗:

  影响很小,不用放大镜500%查看的话,看不到影响,可以忽略。

注:如上规避措施只是临时解决方案,如小伙伴们有其它方案或者发现其它根本原因,可以联系我~谢谢

WPF 设置了阴影效果后,Y轴位置会有变化的问题的更多相关文章

  1. WPF 文本框设置了阴影效果后,因左右的transform变化引发的拉伸渲染问题

    背景 最近遇到一个动画执行时,文本位置变化的问题.如下图: 如果你仔细看的话,当星星变小时,文本往下降了几个像素. 貌似有点莫名其妙,因为控件之间并不在同一个Panel布局控件中,不存在高度限制变化引 ...

  2. Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8570428 通过前面几篇文章的学习,我们知道了 ...

  3. WPF 设置控件阴影后,引发的Y轴位置变化问题

    原文:WPF 设置控件阴影后,引发的Y轴位置变化问题 背景 最近遇到一个动画执行时,文本位置变化的问题.如下图: 如果你仔细看的话,当星星变小时,文本往下降了几个像素. 貌似有点莫名其妙,因为控件之间 ...

  4. WPF设置VistualBrush的Visual属性制作图片放大镜效果

    原文:WPF设置VistualBrush的Visual属性制作图片放大镜效果 效果图片:原理:设置VistualBrush的Visual属性,利用它的Viewbox属性进行缩放. XAML代码:// ...

  5. WPF设置DataGrid行内容高度自适应 与 TextBox/TextBlock内容高度自适应

    WPF设置DataGrid行内容高度自适应  TextBox/TextBlock内容高度自适应  参考: DataGrid 控件中的调整大小选项: http://msdn.microsoft.com/ ...

  6. iOS 设置View阴影

    iOS 设置View投影 需要设置 颜色 阴影半径 等元素 UIView *shadowView = [[UIView alloc] init]; shadowView.frame = CGRectM ...

  7. WPF设置全局字体和字体嵌入

    原文:WPF设置全局字体和字体嵌入 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/CLeopard/article/details/40590373 ...

  8. WPF 设置TextBox为空时,背景为文字提示

    WPF 设置TextBox为空时,背景为文字提示.   <TextBox FontSize="17" Height="26" Margin="2 ...

  9. WPF设置Window的数据上下文(DataContext)为自身

    WPF设置Window的数据上下文(DataContext)为自身的XAML: DataContext="{Binding RelativeSource={RelativeSource Se ...

随机推荐

  1. cordova android

    Image.png Image.png http://www.jscss.cc/2016/10/18/cordova.html 装一个全局的cordova: 官网介绍:http://cordova.a ...

  2. [Angular] Step-By-Step Implementation of a Structural Directive - Learn ViewContainerRef

    For example we have two buttons: When we click nether one of those tow button, the modal should show ...

  3. context.getSystemService的简单说明

    在android开发过程中这种方法一定不会陌生,比方我们在获取WindowManager和LayoutInflater对象的时候就须要我们调用这种方法.这种方法在context这个抽象类的一个抽象方法 ...

  4. storm编程指南

    目录 storm编程指南 (一)创建spout (二)创建split-bolt (三)创建wordcount-bolt (四)创建report-bolt (五)创建topo storm编程指南 @(博 ...

  5. 6 、字符编码笔记:ASCII,Unicode和UTF-8

    1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出 256种状态,这被称为一个字节(byte) ...

  6. 23、uevent/hotplug热拔插机制

    (class_device_create的目的是为了让mdev根据它注册的信息来创建设备节点) class_device_create class_device_register class_devi ...

  7. Java文档上传问题设计

    近期公司让做一个文档上传的功能,功能描写叙述大概是这样子滴 书籍名称.书籍定价.书籍封面图片(须要上传).文档内容 (须要上传) .还有其它相关的描写叙述信息. 我的设计  表 A  包括以上字段 , ...

  8. php框架排名(Laravel一直第一)

    php框架排名(Laravel一直第一) 一.总结 1.Laravel,后面就用这个框架(要用好这个框架,英语得6啊) 2.YII框架和tp框架一样,也是一个国产框架 二.2017世界PHP框架排名T ...

  9. System.ComponentModel.Win32Exception (0x80004005):拒绝访问。——解决办法

    一.问题如下: (无法执行程序.所执行的命令为 "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe" /noconfi ...

  10. 【Heritrix基础教程之3】Heritrix的基本架构 分类: H3_NUTCH 2014-06-01 16:56 1267人阅读 评论(0) 收藏

    Heritrix可分为四大模块: 1.控制器CrawlController 2.待处理的uri列表  Frontier 3.线程池 ToeThread 4.各个步骤的处理器 (1)Pre-fetch ...