图形的效果与滤镜
在UIElement类的成员中你可以找到BitmapEffect和Effect这两个属性,这两个属性都能用来为UI元素添加效果。
WPF最早的版本里只有BitmapEffect这个属性,这个属性使用CPU的运算能力为UI元素添加效果,这样做的问题是效果一多或者让带有效果的UI元素参加动画,程序的性能会因为CPU资源被大量占用二大幅降低(要么响应变慢,要么刷新或动画变得很卡。)随后的版本,微软决定转用显卡GPU的运算能力为UI元素添加效果,于是添加了Effect这个属性。这样既减少了对CPU的浪费又将应用程序的视觉效果拉平到与游戏程序一个级别。
简单易用的BitmapEffect
BitmapEffect属性定义在UIElement类中,它的数据类型是BitmapEffect类。BitmapEffect是一个抽象类,所以我们只能用它的派生类实例为UIElement的BitmapEffect属性赋值。BitmapEffect类的派生并不多(这也说明BitmapEffect能产生的界面效果并不是很丰富),包括如下几个:
BevelBitmapEffect:斜角效果。
BitmapEffectGroup:复合效果(可以把多个BitmapEffect组合在一起)
BlurBitmapEffect:模糊效果。
DropShadowBitmapEffect:投影效果。
EmbossBitmapEffect:浮雕效果。
OuterGlowBitmapEffect:外发光效果。
<Window x:Class="WPFLearn.DrawAndAnimation.BitmapEffect"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="BitmapEffect" Height="300" Width="300">
<Grid>
<Button Content="Click Me" Grid.Column="0" Grid.Row="0" Margin="20">
<Button.BitmapEffect>
<DropShadowBitmapEffect Direction="-45" Opacity="0.75" ShadowDepth="7"/>
</Button.BitmapEffect>
</Button>
</Grid>
</Window>
丰富多彩的Effect
使用滤镜插件能获得如下好处:
⑴ 提高工作效率。
⑵ 得到更专业的效果。
⑶ 对使用这的技术水平要求相对较低。
WPF引进了这种“滤镜插件”的思想,其成果就是UIElement类的Effect属性。Effect属性的数据类型是Effect类,Effect类是抽象类,也就是说UIElement的Effect属性可以接收Effect类的任何一个派生类实例作为它的值。Effect类位于System.Windows.Media.Effect 名称空间中,它的派生类有3个,分别是:
BlurEffect:模糊效果。
DropShadowEffect:投影效果。
ShaderEffect:着色器效果(抽象类)。
ShaderEffect仍然是个抽象类,它就是留给滤镜插件开发人员的接口。只要你开发出派生字ShaderEffect的效果类,别人就可以直接拿来用。
开发着色器效果需要使用Pixel Shader语言(简写与Photoshop一样,也是PS)和一些DirectX的知识。PS的最新版本是3.0,可以在微软的官方网站找到他的SDK和开发文档。微软PDC2008和PDC2009的视频中也有一些讲解,https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/index