Extensions in UWP Community Toolkit - SurfaceDialTextbox
概述
UWP Community Toolkit Extensions 中有一个为TextBox 提供的 SurfaceDial 扩展 - SurfaceDialTextbox,本篇我们结合代码详细讲解 SurfaceDialTextbox 的实现。
SurfaceDialTextbox 为 TextBox 提供了一种简单的 Surface Dial 的菜单和操作方式,支持设置 TextBox 操作在 Dial 中的圆形菜单,选择后旋转 Dial 可以方便的对 TextBox 中的数值进行调整,调整方式类似于 NumericUpdown,可以设置数值上限和下限,以及步长;旋转 Dial 可以选择有震动反馈,超过界限后也会有反馈提示,点按 Dial 可以选择 Focus 到下一个 Element。接下来看看官方示例的截图:
Doc: https://docs.microsoft.com/zh-cn/windows/uwpcommunitytoolkit/extensions/surfacedialtextboxhelper
Namespace: Microsoft.Toolkit.Uwp.UI.Extensions; Nuget: Microsoft.Toolkit.Uwp.UI;
开发过程
代码分析
SurfaceDialTextbox 的处理在类 SurfaceDialTextbox.cs 中,我们先来看看类的结构:
可以看到类中定义了如下的依赖属性:
- ForceMenuItem - 标志是否强制在 Surface Dial 上下文菜单中加入 SurfaceDialTextbox 对应的菜单,如果应用中没有其他控制器,则需要设置为 True;如果有,则设置一致即可;
- Icon - SurfaceDialTextbox 在 Surface Dial 上下文菜单中显示的 Icon,类型是 RadialControllerMenuKnownIcon,枚举类型;默认为 Ruler;
- StepValue - 标志了旋转 Surface Dial 时,每旋转一次对应的数值变化步长;变化时触发 StepValueChanged 事件;
- EnableHapticFeedback - 标志了是否允许在旋转 Surface Dial 时的震动反馈;
- MinValue - 数值变化的最小值;默认为 -100;
- MaxValue - 数值变化的最大值;默认为 100;
- EnableTapToNextControl - 标志是否在点击 Surface Dial 时,将 Focus 移动到下一个 Item;适用于表单类场景,需要切换多个 TextBox;
- EnableMinMaxValue - 标志是否为 SurfaceDialTextbox 设置数值最小值和最大值;
然后我们看几个全局静态变量:
- _controller - RadialController 类型,是 Surface Dial controller 实例;
- Controller - _controller 对应的 public 类型,支持在调用代码中获取 Surface Dial controller 实例,用于 SurfaceDialTextbox 之外的控件上;
- _stepTextMenuItem - RadialControllerMenuItem 类型,在 Surface Dial 上下文菜单中显示的菜单项;
- _textBox - SurfaceDialTextbox 对应的 textBox 控件;
接下来看几个 SurfaceDialTextbox 对应的主要处理方法:
1. Controller_RotationChanged(sender, args)
Surface Dial 旋转时触发的事件处理方法,根据当前显示的 Text,获取对应的 double 类型值;根据当前 Dial 旋转角度和 StepValue 来判断数值的变化,如果允许最大最小值区间限制,则判断是否越界后设置数值;如果 Text 不是数值,则设置默认值 0.0;
private static void Controller_RotationChanged(RadialController sender, RadialControllerRotationChangedEventArgs args) { if (_textBox == null) { return; } string t = _textBox.Text; double nr; if (double.TryParse(t, out nr)) { nr += args.RotationDeltaInDegrees * GetStepValue(_textBox); if (GetEnableMinMaxValue(_textBox)) { if (nr < GetMinValue(_textBox)) { nr = GetMinValue(_textBox); } if (nr > GetMaxValue(_textBox)) { nr = GetMaxValue(_textBox); } } } else { // default to zero if content is not a number nr = 0.0d; } _textBox.Text = nr.ToString("0.00"); }
2. StepValueChanged(d, e)
StepValue 属性改变时触发事件的处理逻,为 textBox 设置 GotFocus 和 LostFocus 事件绑定,我们来看看这两个事件的处理:
TextBox_GotFocus(sender, e) 处理逻辑:获取 Radial Controller,如果需要添加 MenuItem,则根据设置添加对应的 MenuItem;设置转动时的震动反馈,旋转的步长,旋转变化事件;如果允许点击 Focus 到下一个控件,则设置 Radial Controller 的 点击事件;
private static void TextBox_GotFocus(object sender, RoutedEventArgs e) { _textBox = sender as TextBox; if (_textBox == null) { return; } if (!IsSupported) { return; } _controller = _controller ?? RadialController.CreateForCurrentView(); if (GetForceMenuItem(_textBox)) { _stepTextMenuItem = RadialControllerMenuItem.CreateFromKnownIcon("Step Text Box", GetIcon(_textBox)); _controller.Menu.Items.Add(_stepTextMenuItem); _controller.Menu.SelectMenuItem(_stepTextMenuItem); } _controller.UseAutomaticHapticFeedback = GetEnableHapticFeedback(_textBox); _controller.RotationResolutionInDegrees = ; _controller.RotationChanged += Controller_RotationChanged; if (GetEnableTapToNextControl(_textBox)) { _controller.ButtonClicked += Controller_ButtonClicked; } }
TextBox_LostFocus(sender, e) GotFocus 事件对应的相反处理,作用是在 Radial Controller menu 中去掉对应的 MenuItem;解除 RotationChanged 和 Controller_ButtonClicked 事件的绑定;
private static void TextBox_LostFocus(object sender, RoutedEventArgs e) { if (_textBox == null) { return; } if (GetForceMenuItem(_textBox)) { _controller.Menu.Items.Remove(_stepTextMenuItem); } _controller.RotationChanged -= Controller_RotationChanged; if (GetEnableTapToNextControl(_textBox)) { _controller.ButtonClicked -= Controller_ButtonClicked; } _textBox = null; }
调用示例
我们设置一个 SurfaceDialTextbox,默认值为 0,每次变化为 1,区间是 0~100;来看第一张图中,点按 Dial 时会出现 SurfaceDialTextbox 的菜单,菜单图标是尺子;点按后可以通过旋转来改变 textbox 的值;如果初始时不点按 Dial,直接旋转也是一样改变 textbox 的值;在值超出 0~100 区间时,Dial 会有震动反馈;
<TextBox HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,0,0,10" Text="0" Width="250" Height="50" FontSize="20" extensions:SurfaceDialTextbox.StepValue="1" extensions:SurfaceDialTextbox.ForceMenuItem="True" extensions:SurfaceDialTextbox.EnableHapticFeedback="True" extensions:SurfaceDialTextbox.EnableMinMaxValue="True" extensions:SurfaceDialTextbox.MinValue="0" extensions:SurfaceDialTextbox.MaxValue="100" extensions:SurfaceDialTextbox.Icon="Ruler" extensions:SurfaceDialTextbox.EnableTapToNextControl="True"/>
总结
到这里我们就把 UWP Community Toolkit Extensions 中的 SurfaceDialTextbox 的源代码实现过程和简单的调用示例讲解完成了,希望能对大家更好的理解和使用这个扩展有所帮助。欢迎大家多多交流,谢谢!
最后,再跟大家安利一下 UWPCommunityToolkit 的官方微博:https://weibo.com/u/6506046490, 大家可以通过微博关注最新动态。
衷心感谢 UWPCommunityToolkit 的作者们杰出的工作,Thank you so much, UWPCommunityToolkit authors!!!
Extensions in UWP Community Toolkit - SurfaceDialTextbox的更多相关文章
- Extensions in UWP Community Toolkit - Overview
概述 UWP Community Toolkit 中有一个 Extensions 的集合,它们可以帮助开发者实现很多基础功能,省去自己造轮子的过程,本篇我们先来看一下 Extensions 的功能都 ...
- Extensions in UWP Community Toolkit - FrameworkElement Extensions
概述 UWP Community Toolkit Extensions 中有一个为FrameworkElement 提供的扩展 - FrameworkElement Extensions,本篇我们结合 ...
- Extensions in UWP Community Toolkit - Mouse Cursor
概述 UWP Community Toolkit Extensions 中有一个为 Mouse 提供的扩展 - Mouse Cursor Extensions,本篇我们结合代码详细讲解 Mouse C ...
- Extensions in UWP Community Toolkit - ViewExtensions
概述 UWP Community Toolkit Extensions 中有一个为 View 提供的扩展 - View Extensions,本篇我们结合代码详细讲解 View Extensions ...
- Extensions in UWP Community Toolkit - Visual Extensions
概述 UWP Community Toolkit Extensions 中有一个为可视元素提供的扩展 - VisualExtensions,本篇我们结合代码详细讲解 VisualExtensions ...
- 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 的功能都有哪些,再后面会针对每一 ...
随机推荐
- oracle、instantclient以及plsql安装包
链接:http://pan.baidu.com/s/1skZidWT 密码:l1hq
- php 图片合成时文字颜色丢失
最近在做图片合成的时候无意间发现文字颜色丢失了,仔细找了以后才发现原来是因为图片格式的原因 当图片是png图片时文字的颜色就变成了白色的,So.........去你妹的png,用jpg吧! $dest ...
- springMvc(一)
SpringMvc 1. 核心:DispatcherServlet 1.1作用:负责拦截请求并分派给相应的处理器处理 1.2配置DispatcherServlet(web.xml) 2.配置处理器映射 ...
- Effective Java 第三版——37. 使用EnumMap替代序数索引
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- docker学习系列(五):使用docker创建集成服务--lnmp
在掌握了docker的基本命令之后,我也是想着去用docker做一点实际的配套环境,就拿自己最常用的lnmp环境来做测试.配套环境运行的顺序依次是mysql->php->nginx,至于为 ...
- xlsx导入成--json
这两天遇到大难题了,就是这个 xlsx 导入问题,之前用的xlsx.full.min.js,写的导入,结果不兼容ie浏览器,研究这个也好长时间,网上居然还没有搜到合适的,自己写从xlsx官网上 ...
- IPFS网络是如何运行的(p2p网络)
IPFS是一个p2p网络,先来看看BitTorrent的p2p网络是如何工作的? 想要bt下载一个文件,首先你需要一个种子文件torrent,种子文件包含至少一个 Tracker(一台服务器地址)信息 ...
- [模拟赛] T1 高级打字机
Description 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小 ...
- Java飞机大战源代码
刚学不久java,做了一个飞机大战的小小小小游戏,现在把这个思路总结以及代码分享出来.大佬别吐槽(emmmmmm .....开发环境:jdk1.7 开发工具:eclipese PlanelJPanel ...
- 【Python】 系统配置/进程等信息查看 psutil
psutil 原以为psutil只是跟进程有关的一个模块,没想到它其实提供了从CPU到内存各种各样的信息,十分IMBA.记录一下 我用了pip install psutil安装的这个模块,不过路中遇到 ...