原文:为WPF中DropShadowBitmapEffect提供轻量级的替代品

为WPF中DropShadowBitmapEffect提供轻量级的替代品
                                             周银辉

WPF有一个激动人心的新特性:我们可以很方便地为可视元素提供位图效果(BitmapEffect),比如阴影等.但令人沮丧饿是位图效果是非常消耗CPU资源的,从平时的开发中我们几乎可以得出的两条经验:1,尽量少地使用位图效果,因为它是由CPU计算的而不是GPU.  2,不要将位图效果与稍稍复杂一点的动画(Animation)使用,它常常使动画变得很不流畅.
在位图效果中,最常用的当数阴影(DropShadowBitmapEffect),这里有一个DropShadowBitmapEffect的替代品SystemDropShadowChrome,其虽算不上完美,但在很多时候却是一个不错的解决DropShadowBitmapEffect性能问题的方法.
我们可以使用一个SystemDropShadowChrome对象,其将充当"阴影",然后将我们需要添加阴影的对象作为SystemDropShadowChrome对象的Child,这与将一个对象作为的Border的子对象一样.

在上图中,淡蓝色方块的阴影效果便是使用我们的SystemDropShadowChrome得到的,桔黄色方块的阴影效果是使用DropShadowBitmapEffect得到的.你可以粘贴下面的代码到XamlPad查看:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:a="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" >
<Grid Width="579" Height="492">

        <a:SystemDropShadowChrome Width="75" CornerRadius="3,13,3,13" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Left" Margin="185,149,0,0" x:Name="systemDropShadowChrome" VerticalAlignment="Top" Height="75">            
            <Border Background="LightBlue" CornerRadius="3,13,3,13" Margin="1,1,1,1" />
        </a:SystemDropShadowChrome>

        <Border Background="#FFE78E16" CornerRadius="3,13,3,13" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Left" Margin="185,0,0,132" x:Name="border" VerticalAlignment="Bottom" Width="75" Height="75" >
            <Border.BitmapEffect>
                <DropShadowBitmapEffect ShadowDepth="2"/>
            </Border.BitmapEffect>            
        </Border>    
    </Grid>
</Page>

另外,阴影的颜色也是可以设定的,我们只需设置SystemDropShadowChrome对象的Color属性即可.
但很不幸运的是SystemDropShadowChrome对象不能为设置其他形状的元素设置阴影,因为它自身的形状只能做到方形与圆角方形.

你可以点击这里 或 这里查看更多的关于SystemDropShadowChrome的讨论

为WPF中DropShadowBitmapEffect提供轻量级的替代品的更多相关文章

  1. wpf中的触发器详解

    原文 http://zwkufo.blog.163.com/blog/static/25882512009724113250883/ 7.1.2 简单逻辑的表示--触发器(1) 在本章的多处介绍中都会 ...

  2. wpf中的触发器详解 (转自 乂乂的日志 - 网易博客)

    2010-03-24 16:19:07|  分类: WPF相关 |  标签: |字号大中小 订阅     wpf中的触发器详解 WPF/C# 2009-08-24 11:32:50 7.1.2  简单 ...

  3. WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式

    原文:WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式 由于WPF中没有提供PropertyGrid控件,有些业务需要此类的控件.这篇文章介绍在WPF中实现PropertyGr ...

  4. WPF中嵌入Skyline提供的COM组件填坑

    网上有很多关于在WPF中使用的Skyline提供的COM组件的教程,但大都雷同一律,其中很多的细节均为涉及,本文意在在其原基础上进行一些细节的补充. 工具:Visual Studio 2017 1.  ...

  5. 把演讲人的桌面、头像、声音合成后推送到 指定的直播流平台上; 录制电脑桌面、摄像头头像、声音保存为本地视频; 适用于讲课老师、医生等演讲内容保存为视频; 提供PPT嵌入Winform/WPF解决方案,Winform/WPF 中嵌入 office ppt 解决方案

    提供PPT嵌入Winform/WPF解决方案,Winform/WPF 中嵌入 office ppt 解决方案 Winform/WPF 中嵌入 office ppt(powerpoint)解决方案示: ...

  6. 在 WPF 中使用 MahApps.Metro.IconPacks 提供的大量图标

    MahApps.Metro.IconPacks https://github.com/MahApps/MahApps.Metro.IconPacks 提供了大量的高质量的图标供WPF使用,极其方便. ...

  7. 提供PPT嵌入Winform/WPF解决方案,Winform/WPF 中嵌入 office ppt 解决方案

    Winform/WPF 中嵌入 office ppt(powerpoint)解决方案示: 1. 在winform中操作ppt,翻页.播放.退出:显示 总页数.当前播放页数 2. 启动播放ppt时录制视 ...

  8. 在WPF中自定义你的绘制(二)

    原文:在WPF中自定义你的绘制(二)   在WPF中自定义你的绘制(二)                                                                 ...

  9. WPF中的3D变换PlaneProjection

    在UWP中有一个比较好用的伪3D变换PlaneProjection,可以以一种轻量级和非常简单的方式实现3D的效果.这种效果在Silverlight中也有这种变换,但在WPF中确一直没有提供. 虽然W ...

随机推荐

  1. Git软件的学习

    第一部分:我的git地址是https://github.com/ZHU19007/gitLearning 第二部分:我对git的认识 一.Git是一款免费.开源的分布式版本控制工具.而Github是用 ...

  2. 《机器学习实战》中贝叶斯分类中导入RSS源例子

    跟着书中代码往下写在这里卡住了,考虑到可能还会有其他同学也遇到了这样的问题,记下来分享. 先吐槽一下,相信大部分网友在这里卡住的主要原因是伟大的GFW,所以无论是软件FQ还是肉身FQ的小伙伴们估计是无 ...

  3. Android(java)学习笔记56:Android InputMethodManager输入法简介

    参见博客: http://blog.csdn.net/pi9nc/article/details/9196779

  4. Android(java)学习笔记30:泛型接口的概述和使用

    1. 泛型接口的概述和使用: package cn.itcast_06; /* * 泛型接口:把泛型定义在接口上 */ public interface Inter<T> { public ...

  5. 课堂笔记:HTML----------图片热点

    HTML----------图片热点: 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可完成跳转的效果. 代码: <!DOCTYPE html PUBLIC "-//W3C ...

  6. Java实体类的属性类型与数据库表字段类型对应表

    原文地址:https://blog.csdn.net/lyhjava/article/details/50562786 Java中的数据类型和SQL中的数据类型有很多不一样,需要仔细区分,不然易在开发 ...

  7. vue案列

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 【luogu P3709 大爷的字符串题】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3709 离散化+区间众数..? #include <iostream> #include < ...

  9. Android学习笔记_16_添加多个Activity、参数传递、请求码和结果码使用

    一.添加新的Activity步骤: 第一步:新建一个继承Activity的类,如:NewActivity public class NewActivity extends Activity { @Ov ...

  10. 整理下react中常见的坑

    其实有些也不能算是坑,有些是react的规定,或者是react的模式和平常的js处理的方式不同罢了 1.setState()是异步的this.setState()会调用render方法,但并不会立即改 ...