[UWP小白日记-12]使用新的Composition API来实现控件的阴影
前言
看了好久官方的Windows UI Dev Labs示例好久才有点心得,真是头大。(其实是英语幼儿园水平(⊙﹏⊙)b)
真的网上关于这个API的资料可以说几乎没有。
正文
首先用这东西的添加WIN2D。其实这个API实现阴影的步骤和正儿八经使用WIN2D差不多,但是我自己感觉比用WIN2D简单,毕竟微软大法做了封装就是要简单粗暴。差不多的实现都是自定义控件,官方的也是。
其实就这个API做阴影就是用了2个图层来实现的。
上图是CorelDRAW里的阴影效果图,明显看出是2个图层的堆叠。
so,用这个API来实现太简单了,只用控制下面几个属性就能完美实现了外加一个动画就搞定了。
前台XAML
<Grid Background="White">
<Canvas x:Name="ShadowHost"
Margin=""/>
<Image x:Name="CircleImage"
Margin=""
Source="Assets/3275.jpg" Canvas.ZIndex=""/>
</Grid>
后退CS
首先在构造函数中定义一个方法来实现阴影。
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
DropShadow(ShadowHost, CircleImage);
} private void DropShadow(UIElement shadowHost, Image shadowTarget)
{
Visual hostVisual = ElementCompositionPreview.GetElementVisual(shadowHost);
Compositor compositor = hostVisual.Compositor; // 创建阴影
var dropShadow = compositor.CreateDropShadow();
dropShadow.Color = Color.FromArgb(, , , );
dropShadow.BlurRadius = 20.0f;
dropShadow.Offset = new Vector3(2.5f, 2.5f, 0.0f);
dropShadow.Opacity = 50.0f;
// 拿到要做阴影的元素的外形用来做阴影的形状,比如我这里是矩形,那这个阴影就是矩形阴影,是圆是扁就看这里了
dropShadow.Mask = shadowTarget.GetAlphaMask(); // 创建一个视觉树来hold住阴影
var shadowVisual = compositor.CreateSpriteVisual();
shadowVisual.Shadow = dropShadow; // 把自定义的阴影添加到视觉树
ElementCompositionPreview.SetElementChildVisual(shadowHost, shadowVisual); // 用一个动画来保证阴影和视觉树同步,就是你变我也变,大家一起变。
var bindSizeAnimation = compositor.CreateExpressionAnimation("hostVisual.Size");
bindSizeAnimation.SetReferenceParameter("hostVisual", hostVisual); shadowVisual.StartAnimation("Size", bindSizeAnimation);
}
}
TIPS:GetAlphaMask()这个方法只有3个控件实现了:Image、Shape、TextBlock当时我看到就懵逼了,那么多控件怎么才实现这3个?,最后想想貌似绝大多数控件最外层都是Shape里的各种形状。
是否是发现了,既然阴影是用2个图层来实现的,那么这是不是共同点,有了共同点是不是就有了用户控件和模版控件的表演上了?
用户控件和模版控件我以前一直都懵逼的。最近看了好多别人的代码,最近突然就悟了,真悟了。吗蛋这和平时写的窗口程序有毛线区别- -,以前看的各种相关自定义控件的文章都是很高大上,各种牛逼,然并卵看不懂。
拿上面的阴影来说,要把他做成类库,在类库里定义一个用户控件,然后把上面的改造下就可以哪里需要哪里搬了。
自定义控件最让我等小白懵逼的就是依赖属性,看到那一坨就怕- -。
下面用阴影颜色来看看一个完整的依赖属性的定义。
1.
/// <summary>
/// 设置阴影的颜色
/// 默认值为黑色
/// </summary>
public Color Color
{
get { return (Color)GetValue(ColorProperty); }
set { SetValue(ColorProperty, value); }
} public static readonly DependencyProperty ColorProperty =
DependencyProperty.Register(nameof(Color), typeof(Color), typeof(CompositionShadow), new PropertyMetadata(Colors.Black,OnBorederColorChaged));
2.
private static void OnBorederColorChaged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((CompositionShadow)d).OnBorederColorChaged((Color)e.NewValue);
}
3.
private void OnBorederColorChaged(Color newValue)
{
_dropShadow.Color = newValue;
}
看看2、3步是不是劫完财、再劫个色的套路,反正我理解能力有限,听到回调根本无法第一时间想到具体的东西,完全没概念。
现在看到回调第一个想法就是畜生,劫财还劫色。
现在要做的就是把上面的属性全撸成依赖属性。然后定义更新方法来更新SIZE、Mask、OFFset的变化就可以了。
private void UpdateShadowMask()
{
if (_castingElement != null)
{
CompositionBrush mask = null;
if (_castingElement is Image)
{
mask = ((Image)_castingElement).GetAlphaMask();
}
else if (_castingElement is Shape)
{
mask = ((Shape)_castingElement).GetAlphaMask();
}
else if (_castingElement is TextBlock)
{
mask = ((TextBlock)_castingElement).GetAlphaMask();
} _dropShadow.Mask = mask;
}
else
{
_dropShadow.Mask = null;
}
} private void UpdateShadowOffset(float x, float y, float z)
{
_dropShadow.Offset = new Vector3(x, y, z);
} private void UpdateShadowSize()
{
Vector2 newSize = new Vector2(, );
if (_castingElement != null)
{
newSize = new Vector2((float)_castingElement.ActualWidth, (float)_castingElement.ActualHeight);
} _shadowVisual.Size = newSize;
} private FrameworkElement _castingElement;
private readonly DropShadow _dropShadow;
private readonly SpriteVisual _shadowVisual;
总结
其实上面的代码在微软爸爸的各种示例代码中都有。大家搜索下Windows UI dev labs这个GitHub上。全是Composition API的使用例子
[UWP小白日记-12]使用新的Composition API来实现控件的阴影的更多相关文章
- [UWP小白日记-9]页面跳转过度动画(二)
又打算动手写了 [UWP小白日记-6]页面跳转过度动画 上次写的,这次随着学习的进度使用新的玩法. 最近在搞GIT的学习,结果把好好的项目玩坏,都不知道当时是怎么想的拿在写的APP来玩GIT,害我重写 ...
- win10 UWP 等级控件Building a UWP Rating Control using XAML and the Composition API | XAML Brewer, by Diederik Krols
原文:Building a UWP Rating Control using XAML and the Composition API | XAML Brewer, by Diederik Krols ...
- 小白日记12:kali渗透测试之服务扫描(二)-SMB扫描
SMB扫描 Server Message Block 协议.与其他标准的TCP/IP协议不同,SMB协议是一种复杂的协议,因为随着Windows计算机的开发,越来越多的功能被加入到协议中去了,很难区分 ...
- [UWP小白日记-8]一些零碎的东西
设置启动窗口大小 直接上代码了没什么好解释的了,既然能设置最小,那铁定就能设置最大 public MainPage() { //设定窗口启动显示大小 ApplicationView.Preferred ...
- [UWP小白日记-6]页面跳转过度动画
前言 在学习中发现页面导航默认是没有过度动画的,直接就导航过去太粗暴了( ̄へ ̄),于是打算上动画结果不言而喻自己进了坑完全不懂动画,然后就是各种疯狂(´・_・`)的搜索资料看了后终于有点头绪. 再后来 ...
- ActiveReports 9 新功能:借助目录(TOC)控件为报表添加目录功能
在最新发布的ActiveReports 9报表控件中添加了多项新功能,以帮助你在更短的时间里创建外观绚丽.功能强大的报表系统,本文将重点介绍新增文档目录控件(TOC),通过拖拽操作便可添加报表目录. ...
- ActiveReports 报表控件V12新特性 -- 文本框和标签控件的浓缩
ActiveReports是一款专注于 .NET 平台的报表控件,全面满足 HTML5 / WinForms / ASP.NET / ASP.NET MVC / WPF 等平台下报表设计和开发工作需求 ...
- 12款优秀的 JavaScript 日历和时间选择控件
这些插件能够帮助 Web 开发人员更快速的实现各种精美的日历和时间选择效果. 1. The Coolest Calendar 界面非常漂亮的一款日期选择插件,有详细的使用文档,最新版本 1.5. 点 ...
- [UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)
前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Enti ...
随机推荐
- 【转】Android官方下拉刷新控件 SwipeRefreshLayout
今天在Google+上看到了SwipeRefreshLayout这个名词,遂搜索了下,发现竟然是刚刚google更新sdk新增加的一个widget,于是赶紧抢先体验学习下. SwipeRefreshL ...
- 【转】Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9671609 记得在很早之前,我写了一篇关于Android滑动菜单的文章,其中有一个 ...
- Couchbase 服务器
安装 Couchbase 服务器 一. 下载安装包 首先,到官网下载安装包:http://www.couchbase.com/ 下载的地址:http://www.couchbase.com/downl ...
- C++ Builder中splitter控件的使用方法简介
C++ Builder提供了一个Splitter控件来实现对用户窗口的分割,只需拖动该控件到窗体上,就可以实现窗口的任意分割.把面板控件(Panel)拖动到窗体上,设置其对齐方式,然后把Splitte ...
- ODP.NET
1,什么是ODT?就是Oracle 为 .NET (ODP.NET) 专门编写了 Oracle Data Provider,一个用于 Microsoft .NET 环境下的 Oracle 数据访问 A ...
- c#二进制、十进制、16进制之间的转换
//十进制转二进制 Console.WriteLine(Convert.ToString(69, 2)); //十进制转八进制 Console.WriteLine(Convert.ToString(6 ...
- C#利用Emit反射实现AOP,以及平台化框架封装思路
C#利用Emit反射实现AOP,以及平台化框架封装思路 这是前两天扒的一段动态代理AOP代码,用的Emit反射生成子类来实现代理模式,在这里做个小笔记,然后讨论一下AOP框架的实现思路. 首先是主函数 ...
- xhEditor实现插入代码功能
如果大家经常使用CSDN或者其他技术博客,都会有插入程序代码或脚本功能 开源中国 CSDN 这里介绍xhEditor实现插入代码功能,对xhEditor进行插件扩展 一.首先定义插件样式 <st ...
- Modern 阅读笔记 一 PSR标准
一.标准 PSR php standards Recommendation PHP 推荐标准 PSR-1 基本代码风格 PSR-2 严格的代码风格 PSR-3 日志记录器接口 PSR-4 自动加载 ...
- service structure flowchart [mobile to server via HTTP RESTful API and TCP/IP in a map]
mobile to server in RESTful and TCP/IP way