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组件。

相关推荐
△曉風殘月〆9 小时前
WPF颜色(SolidColorBrush)和Win32颜色(COLOREF)互转的方法
wpf·win32·solidcolorbrush·colorref
shanshan209913 小时前
上位机系统架构 | 如何设计一个高效的多相机管理系统
c#·wpf·相机
充值内卷17 小时前
WPF入门教学四 WPF控件概述
windows·ui·wpf
小白2 天前
WPF自定义Dialog模板,内容用不同的Page填充
wpf
Crazy Struggle2 天前
C# + WPF 音频播放器 界面优雅,体验良好
c#·wpf·音频播放器·本地播放器
James.TCG2 天前
WPF动画
wpf
He BianGu2 天前
笔记:简要介绍WPF中FormattedText是什么,主要有什么功能
笔记·c#·wpf
脚步的影子3 天前
.NET 6.0 + WPF 使用 Prism 框架实现导航
.net·wpf
jyl_sh3 天前
Ribbon (WPF)
ribbon·wpf·client·桌面程序开发·c/s客户端
wo63704313 天前
[Visual Stuidio 2022使用技巧]2.配置及常用快捷键
c#·.net·wpf