Extensions in UWP Community Toolkit - Visual Extensions
概述
UWP Community Toolkit Extensions 中有一个为可视元素提供的扩展 - VisualExtensions,本篇我们结合代码详细讲解 VisualExtensions 的实现。
VisualExtensions 为可视元素提供了一种简单的在 XAML 中修改通用属性的方法,这些通用属性包括 AnchorPoint,CenterPoint,Offset,Opacity,RotationAngle,RotationAngleInDegrees,RotationAxis,Scale,Size 和 NormalizedCenterPoint。 接下来看看官方示例的截图:
Doc: https://docs.microsoft.com/zh-cn/windows/uwpcommunitytoolkit/extensions/visualextensions
Namespace: Microsoft.Toolkit.Uwp.UI.Extensions; Nuget: Microsoft.Toolkit.Uwp.UI;
开发过程
代码分析
VisualExtensions 的处理逻辑在 VisualExtensions.cs 类中,下面我们先来看看类结构:
首先看一下类中定义的附加属性:
- AnchorPoint - 获取或设置 UIElement 的 Visual.AnchorPoint 属性,string 类型;改变时触发 OnAnchorPointChanged 事件;
- CenterPoint - 获取或设置 UIElement 的 Visual.CenterPoint 属性,string 类型;改变时触发 OnCenterPointChanged 事件;
- Offset - 获取或设置 UIElement 的 Visual.Offset 属性,string 类型;改变时触发 OnOffsetChanged 事件;
- Opacity - 获取或设置 UIElement 的 Visual.Opacity 属性,double 类型;改变时触发 OnOpacityChanged 事件;
- RotationAngle - 获取或设置 UIElement 的 Visual.RotationAngle 属性,double 类型,单位是弧度;改变时触发 OnRotationAngleChanged 事件;
- RotationAngleInDegrees - 获取或设置 UIElement 的 Visual.RotationAngleInDegrees 属性,double 类型,单位是角度;改变时触发 OnRotationAngleInDegreesChanged 事件;
- RotationAxis - 获取或设置 UIElement 的 Visual.RotationAxis 属性,string 类型;改变时触发 OnRotationAxisChanged 事件;
- Scale - 获取或设置 UIElement 的 Visual.Scale 属性,string 类型;改变时触发 OnScaleChanged 事件;
- Size - 获取或设置 UIElement 的 Visual.Size 属性,string 类型;改变时触发 OnSizeChanged 事件;
- NormalizedCenterPoint - 获取或设置 UIElement 的 Visual.CenterPoint 属性在 0.0 - 1.0 之间标准化的值,string 类型;改变时触发 OnNormalizedCenterPointChanged 事件;
除去 OnNormalizedCenterPointChanged 事件,其他事件的处理逻辑都是简单的进行了 Set 方法处理,我们来看一下 OnNormalizedCenterPointChanged 的处理:
OnNormalizedCenterPointChanged 的主要处理逻辑在 SetupNormalizedCenterPoint(args, element):
解除 element 的 SizeChanged 事件绑定;把 normalizedValue 转为 Vector3 类型,然后设置 element VIsual 的 CenterPoint,根据 ActualSize 和 normalizedValue 的换算关系;最后重新绑定 element 的 SizeChanged 事件;
private static void SetupNormalizedCenterPoint(DependencyPropertyChangedEventArgs e, FrameworkElement element) { element.SizeChanged -= KeepCenteredElementSizeChanged; if (e.NewValue is string normalizedValue) { var vectorValue = normalizedValue.ToVector3(); var visual = GetVisual(element); visual.CenterPoint = ); element.SizeChanged += KeepCenteredElementSizeChanged; } }
来看一下 KeepCenteredElementSizeChanged 事件的处理逻辑,和 SetupNormalizedCenterPoint(args, element) 方法的处理基本相同,都是在使用 normalizedValue 设置 element Visual 的 CenterPoint;
private static void KeepCenteredElementSizeChanged(object sender, SizeChangedEventArgs e) { var element = sender as FrameworkElement; var normalizedValue = GetNormalizedCenterPoint(element); var vectorValue = normalizedValue.ToVector3(); var visual = GetVisual(element); visual.CenterPoint = ); }
我们看到很多的属性都是 string 类型,而实际操作中需要用到各种类型的 Vector,要求 string 的格式为 "0,0", "0,0,0", "0,0,0,0" 这样的用逗号隔开的格式,类似 Margin 的格式,来看一下转换的方法:
因为 string 转换为 Vector2 Vector3 和 Vector4 的处理类似,我们以 ToVector2(str) 为例来解释一下:
- 处理前先做一些基本格式的检查,如长度过短,带有 <> 字符的情况;
- Split() 方法分割字符串,根据分割后的段数,如果为 1,则使用它创建 Vector2;如果为 2,则使用两个值创建 Vector2;
public static Vector2 ToVector2(this string str) { try { var strLength = str.Count(); ) { throw new Exception(); } ] == ] == '>') { str = str.Substring(, strLength - ); } string[] values = str.Split(','); var count = values.Count(); Vector2 vector; ) { vector = ])); } ) { vector = ]), ])); } else { throw new Exception(); } return vector; } catch (Exception) { throw new FormatException($"Cannot convert {str} to Vector2. Use format \"float, float\""); } }
调用示例
我们给 Border 设置了 Visual Extensions,包括缩放,旋转,透明度等,可以看到运行图中和设置一致;
<Border Height="100" Width="100" Background="Purple" extensions:VisualExtensions.CenterPoint="50,50,0" extensions:VisualExtensions.Opacity="0.5" extensions:VisualExtensions.RotationAngleInDegrees="80" extensions:VisualExtensions.Scale="2, 0.5, 1" extensions:VisualExtensions.NormalizedCenterPoint="0.5, 0.5, 0" />
总结
到这里我们就把 UWP Community Toolkit Extensions 中的 VisualExtensions 的源代码实现过程和简单的调用示例讲解完成了,希望能对大家更好的理解和使用这个扩展有所帮助。欢迎大家多多交流,谢谢!
最后,再跟大家安利一下 UWPCommunityToolkit 的官方微博:https://weibo.com/u/6506046490, 大家可以通过微博关注最新动态。
衷心感谢 UWPCommunityToolkit 的作者们杰出的工作,Thank you so much, UWPCommunityToolkit authors!!!
Extensions in UWP Community Toolkit - Visual Extensions的更多相关文章
- Extensions in UWP Community Toolkit - FrameworkElement Extensions
概述 UWP Community Toolkit Extensions 中有一个为FrameworkElement 提供的扩展 - FrameworkElement Extensions,本篇我们结合 ...
- Extensions in UWP Community Toolkit - Overview
概述 UWP Community Toolkit 中有一个 Extensions 的集合,它们可以帮助开发者实现很多基础功能,省去自己造轮子的过程,本篇我们先来看一下 Extensions 的功能都 ...
- Extensions in UWP Community Toolkit - Mouse Cursor
概述 UWP Community Toolkit Extensions 中有一个为 Mouse 提供的扩展 - Mouse Cursor Extensions,本篇我们结合代码详细讲解 Mouse C ...
- Extensions in UWP Community Toolkit - SurfaceDialTextbox
概述 UWP Community Toolkit Extensions 中有一个为TextBox 提供的 SurfaceDial 扩展 - SurfaceDialTextbox,本篇我们结合代码详细讲 ...
- Extensions in UWP Community Toolkit - ViewExtensions
概述 UWP Community Toolkit Extensions 中有一个为 View 提供的扩展 - View Extensions,本篇我们结合代码详细讲解 View Extensions ...
- Extensions in UWP Community Toolkit - WebViewExtensions
概述 UWP Community Toolkit Extensions 中有一个为 WebView 提供的扩展 - WebViewExtensions,本篇我们结合代码详细讲解 WebView Ext ...
- Extensions in UWP Community Toolkit - ListViewExtensions
概述 UWP Community Toolkit Extensions 中有一个为 ListView 提供的扩展 - ListViewExtensions,本篇我们结合代码详细讲解 ListView ...
- New UWP Community Toolkit
概述 UWP Community Toolkit 是一个 UWP App 自定义控件.应用服务和帮助方法的集合,能够很大程度的简化和指引开发者的开发工作,相信广大 UWPer 并不陌生. 下面是截取自 ...
- Animations in UWP Community Toolkit - Overview
概述 UWP Community Toolkit 中有一个 Animations 的集合,它们可以帮助开发者实现很多的动画,本篇我们先来看一下 Animations 的功能都有哪些,再后面会针对每一 ...
随机推荐
- 百度API地图的标注不居中显示,而显示在左上角
前言:今天弄个百度地图,弄了半天就是不居中,之前使用一直没有遇到这个问题.所以就一直在找原因. 百度地图对地图所在的div做了显示隐藏之类操作,标注就不再居中显示,而显示在左上角. 查了很久,有人提出 ...
- 【Windows】定时任务设置
Windows定时任务 linux上面的定时任务已经解除过好多次了.不外乎crontab,at之类的命令,而windows上的定时任务今天才偶尔看到怎么设置.想到以后生活上可能会用到一些这方面的知识就 ...
- c++ --> cin和cout输入输出格式
cin和cout输入输出格式 Cout 输出 1>. bool型输出 cout << true <<" or " << false < ...
- 漫谈Java IO之 Netty与NIO服务器
前面介绍了基本的网络模型以及IO与NIO,那么有了NIO来开发非阻塞服务器,大家就满足了吗?有了技术支持,就回去追求效率,因此就产生了很多NIO的框架对NIO进行封装--这就是大名鼎鼎的Netty. ...
- Docker深入浅出系列教程——Docker初体验
我是张飞洪,钻进浩瀚代码,十年有余,人不堪其累,吾不改其乐.我喜欢把玩代码,琢磨词句!代码算法让我穿透规律,文章摘句让我洞察人情.如果你觉得和我的看法不一样,请关注我的头条号,那我们一定合得来. Do ...
- Java基础学习笔记十七 集合框架(三)之Map
Map接口 通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图. Collection中的集合,元素是孤立存在的(理解为单身),向集合中存 ...
- MySQL数据库操作类(PHP实现,支持连贯操作)
<?php /** * Author: suvan * CreateTime: 2018/2/27 * description: 数据库操作类(仅对接MySQL数据库,主要利用MySQLi函数) ...
- 『转载』从内存资源中加载C++程序集:CMemLoadDll
MemLoadDll.h #if !defined(Q_OS_LINUX) #pragma once typedef BOOL (__stdcall *ProcDllMain)(HINSTANCE, ...
- JavaScript(第二十天)【DOM操作表格及样式】
DOM在操作生成HTML上,还是比较简明的.不过,由于浏览器总是存在兼容和陷阱,导致最终的操作就不是那么简单方便了.本章主要了解一下DOM操作表格和样式的一些知识. 一.操作表格 <table& ...
- 20162318 实验二《Java面向对象程序设计》实验报告
北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级:1623班 姓名:张泰毓 指导老师:娄老师.王老师 实验日期:2017年4月14日 实验密级:非密级 实验器材:带Lin ...