WPF中的效果Effect

WPF中的效果Effect

前言

WPF提供了可应用于任何元素的可视化效果。效果的目标是提供一种简便的声明式方法,从而改进文本、图像、按钮以及其他控件的外观。不是编写自己的绘图代码,而是使用某个继承自Effect的类,以立即获得诸如模糊、光辉以及阴影等效果。

效果类

名称 说明 属性
BlurEffect 模糊元素中的内容 Radius,KernelType,RenderingBias
DropShadowEffect 在元素背后添加矩形阴影 BlurRadius,Color,Direction,Opacity,ShadowDepty,RenderingBias
ShaderEffect 应用像素着色器,像素着色器是使用高级着色语言事先制作好的并且已经编译过的效果 PixelShader

BlurEffect类

最简单的WPF效果是BlurEffect 类。该类模糊元素的内容,就像通过失焦透镜观察到的效果。通过增加Radius属性的值(默认值是5)可增加模糊程度。

xml 复制代码
            <Button Content="blurred(radius=2)" Padding="5" Margin="3">
                <Button.Effect>
                    <BlurEffect Radius="2"/>
                </Button.Effect>
            </Button>
            <Button Content="blurred(radius=5)" Padding="5" Margin="3">
                <Button.Effect>
                    <BlurEffect Radius="5"/>
                </Button.Effect>
            </Button>
            <Button Content="blurred(radius=20)" Padding="5" Margin="3">
                <Button.Effect>
                    <BlurEffect Radius="20"/>
                </Button.Effect>
            </Button>

DropShadowEffect类

DropShadowEffect类在元素背后添加了轻微的偏移阴影。

DropShadowEffect类的属性

名称 说明
Color 设置阴影的颜色(默认黑色)
BlurRadius 确定阴影离开内容多远,单位为像素(默认值为5).将该属性设置为0会创建外侧辉光(outer-glow)效果,该效果会在内容周围添加晕彩(halo of color)
Opacity 使用从1(完全不透明,默认值)到0(完全透明)之间,使阴影部分透明
Direction 使用从0到360之间的角度值指定阴影相对于内容的位置。将该属性设置为0会将阴影放置到右边,增加该属性的值会逆时针移动阴影,默认值是315,该值会将阴影放置到元素的右下方
xml 复制代码
            <TextBlock FontSize="20" Margin="5" >
                <TextBlock.Effect>
                    <DropShadowEffect/>
                </TextBlock.Effect>
                <TextBlock.Text>basic dropshadow</TextBlock.Text>
            </TextBlock>
            <TextBlock FontSize="20" Margin="5" >
                <TextBlock.Effect>
                    <DropShadowEffect Color="SlateBlue"/>
                </TextBlock.Effect>
                <TextBlock.Text>light blue dropshadow</TextBlock.Text>
            </TextBlock>
            <TextBlock FontSize="20" Foreground="White"  Margin="5" >
                <TextBlock.Effect>
                    <DropShadowEffect BlurRadius="15"/>
                </TextBlock.Effect>
                <TextBlock.Text>blurred dropshadow with white text</TextBlock.Text>
            </TextBlock>
            <TextBlock FontSize="20" Foreground="Magenta" Margin="5" >
                <TextBlock.Effect>
                    <DropShadowEffect ShadowDepth="0"/>
                </TextBlock.Effect>
                <TextBlock.Text>close dropshadow</TextBlock.Text>
            </TextBlock>
            <TextBlock FontSize="20" Foreground="LimeGreen" Margin="5" >
                <TextBlock.Effect>
                    <DropShadowEffect ShadowDepth="25"/>
                </TextBlock.Effect>
                <TextBlock.Text>distant dropshadow</TextBlock.Text>
            </TextBlock>

有时候可通过将元素添加到高层的容器中来模拟多个效果,例如,为TextBlock元素使用阴影效果,然后将其放入使用效果的stackpanel面板中。大多数情况下,应避免这种变通方法,因为这种方法会成倍增加渲染工作量并会降低性能。相反,应当查找能够完成所有内容的单个效果。

ShaderEffect类

ShaderEffect类没有提供就绪的效果。相反,它是一个抽象类,可继承该类以创建自己的自定义像素着色器。通过使用ShaderEffect类(或从该类派生的自定义效果),可实现更多的效果,而不仅局限于模糊和阴影。

可能与你的预期相反,实现像素着色器的逻辑不是直接在效果类中使用C#代码编写的,相反,像素着色器是用高级着色语言编写的,该语言是Microsoft DirectX的一部分。

将HLSL文件编译成.ps文件,就可以在项目中使用它了。需要将文件添加到已有的WPF项目中,在解决方案中选择该文件,并将它的生成方式属性设置为Resource。最后要创建一个继承自ShaderEffect的自定义类并使用该资源。

csharp 复制代码
    public class customeEffect : ShaderEffect
    {
        public customeEffect()
        {
            Uri uri = new Uri("Effect.ps", UriKind.Relative);

            PixelShader = new PixelShader();
            PixelShader.UriSource = uri;
        }
    }

现在创建自定义效果类的一个实例,应用它设置元素的Effect属性:

xml 复制代码
            <Image>
                <Image.Effect>
                    <local:customeEffect></local:customeEffect>
                </Image.Effect>
            </Image>

除非是非常专业的图形开发人员,否则获取更高级像素着色器的最好方法不是自己编写HLSL代码。相反,应当查找现成的HLSL例子,甚至更好的使用已经提供了自定义效果类的第三方WPF组件。

相关推荐
码农水水12 小时前
得物Java面试被问:大规模数据的分布式排序和聚合
java·开发语言·spring boot·分布式·面试·php·wpf
时光慢煮14 小时前
行走在多端之间:基于 Flutter × OpenHarmony 的旅行记录应用实践 —— 旅行详情查看模块解析
flutter·华为·开源·wpf·openharmony
xiaobaishuoAI1 天前
分布式事务实战(Seata 版):解决分布式系统数据一致性问题(含代码教学)
大数据·人工智能·分布式·深度学习·wpf·geo
小北方城市网1 天前
微服务注册中心与配置中心实战(Nacos 版):实现服务治理与配置统一
人工智能·后端·安全·职场和发展·wpf·restful
cjp5601 天前
017.WPF使用自定义样式
wpf
故事不长丨1 天前
C#log4net详解:从入门到精通,配置、实战与框架对比
c#·.net·wpf·log4net·日志·winform·日志系统
cjp5601 天前
002.为C#动态链接库添加wpf窗体
microsoft·c#·wpf
bugcome_com2 天前
WPF控件模板
wpf
上海物联网2 天前
Prism WPF中的自定义区域适配器解决了什么问题?在项目中怎么实现一个自定义适配器
wpf
code bean3 天前
【C#高级】TCP请求-应答模式的WPF应用实战
tcp/ip·c#·wpf