为WPF中DropShadowBitmapEffect提供轻量级的替代品
原文:为WPF中DropShadowBitmapEffect提供轻量级的替代品
为WPF中DropShadowBitmapEffect提供轻量级的替代品
周银辉
WPF有一个激动人心的新特性:我们可以很方便地为可视元素提供位图效果(BitmapEffect),比如阴影等.但令人沮丧饿是位图效果是非常消耗CPU资源的,从平时的开发中我们几乎可以得出的两条经验:1,尽量少地使用位图效果,因为它是由CPU计算的而不是GPU. 2,不要将位图效果与稍稍复杂一点的动画(Animation)使用,它常常使动画变得很不流畅.
在位图效果中,最常用的当数阴影(DropShadowBitmapEffect),这里有一个DropShadowBitmapEffect的替代品SystemDropShadowChrome,其虽算不上完美,但在很多时候却是一个不错的解决DropShadowBitmapEffect性能问题的方法.
我们可以使用一个SystemDropShadowChrome对象,其将充当"阴影",然后将我们需要添加阴影的对象作为SystemDropShadowChrome对象的Child,这与将一个对象作为的Border的子对象一样.
在上图中,淡蓝色方块的阴影效果便是使用我们的SystemDropShadowChrome得到的,桔黄色方块的阴影效果是使用DropShadowBitmapEffect得到的.你可以粘贴下面的代码到XamlPad查看:
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提供轻量级的替代品的更多相关文章
- wpf中的触发器详解
原文 http://zwkufo.blog.163.com/blog/static/25882512009724113250883/ 7.1.2 简单逻辑的表示--触发器(1) 在本章的多处介绍中都会 ...
- wpf中的触发器详解 (转自 乂乂的日志 - 网易博客)
2010-03-24 16:19:07| 分类: WPF相关 | 标签: |字号大中小 订阅 wpf中的触发器详解 WPF/C# 2009-08-24 11:32:50 7.1.2 简单 ...
- WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式
原文:WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式 由于WPF中没有提供PropertyGrid控件,有些业务需要此类的控件.这篇文章介绍在WPF中实现PropertyGr ...
- WPF中嵌入Skyline提供的COM组件填坑
网上有很多关于在WPF中使用的Skyline提供的COM组件的教程,但大都雷同一律,其中很多的细节均为涉及,本文意在在其原基础上进行一些细节的补充. 工具:Visual Studio 2017 1. ...
- 把演讲人的桌面、头像、声音合成后推送到 指定的直播流平台上; 录制电脑桌面、摄像头头像、声音保存为本地视频; 适用于讲课老师、医生等演讲内容保存为视频; 提供PPT嵌入Winform/WPF解决方案,Winform/WPF 中嵌入 office ppt 解决方案
提供PPT嵌入Winform/WPF解决方案,Winform/WPF 中嵌入 office ppt 解决方案 Winform/WPF 中嵌入 office ppt(powerpoint)解决方案示: ...
- 在 WPF 中使用 MahApps.Metro.IconPacks 提供的大量图标
MahApps.Metro.IconPacks https://github.com/MahApps/MahApps.Metro.IconPacks 提供了大量的高质量的图标供WPF使用,极其方便. ...
- 提供PPT嵌入Winform/WPF解决方案,Winform/WPF 中嵌入 office ppt 解决方案
Winform/WPF 中嵌入 office ppt(powerpoint)解决方案示: 1. 在winform中操作ppt,翻页.播放.退出:显示 总页数.当前播放页数 2. 启动播放ppt时录制视 ...
- 在WPF中自定义你的绘制(二)
原文:在WPF中自定义你的绘制(二) 在WPF中自定义你的绘制(二) ...
- WPF中的3D变换PlaneProjection
在UWP中有一个比较好用的伪3D变换PlaneProjection,可以以一种轻量级和非常简单的方式实现3D的效果.这种效果在Silverlight中也有这种变换,但在WPF中确一直没有提供. 虽然W ...
随机推荐
- Python3循环语句
Python3 循环语句 Python中的循环语句有for和while. 循环语句控制结构图如下: 一.while循环 ①循环结构 while 判断条件: 执行语句 实例: n = int(input ...
- 20165322 预备作业3 Linux安装及学习
Linux安装及学习 安装部分 由于是第一次接触虚拟机知识,之前也没什么了解,我选择完全按照老师教程里的安装vbox虚拟机. 虚拟机安装的过程很顺利,不做详细讲解. 出现的问题 在启动我新建的虚拟电脑 ...
- 动态规划(DP),最长递增子序列(LIS)
题目链接:http://poj.org/problem?id=2533 解题报告: 状态转移方程: dp[i]表示以a[i]为结尾的LIS长度 状态转移方程: dp[0]=1; dp[i]=max(d ...
- Idea 配置 Database 组件的MySql数据库连接
1.选择MySql
- [LuoguP1141]01迷宫
1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务 ...
- SpringBoot非官方教程 | 第十七篇:上传文件
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot14-upload/ 本文出自方志朋的博客 这篇文 ...
- SpringBoot非官方教程 | 第十三篇:springboot集成spring cache
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot13-springcache/ 本文出自方志朋的博 ...
- Oracle 11g RAC小结
1.查看数据库所有实例与状态 unixdev$[/home/grid]srvctl status database -d unixdev Instance unixdev11 is running o ...
- Linux修改时区以及同步时间
Centos7为例:修改时区 timedatectl list-timezones |grep Shanghai #查找中国时区的完整名称 Asia/Shanghai timedatectl set- ...
- 转载:Python中的if __name__ == '__main__'
刚开始学习Python时,对于有些书出现的函数带有“if __name__ == '__main__'”总是迷惑不解,比如<dive into Python>中开头的哪个根据输入的数字计算 ...