UWP开发砸手机系列(一)—— Accessibility
因为今天讨论的内容不属于入门系列,所以我把标题都改了。这个啥Accessibility说实话属于及其蛋疼的内容,即如何让视力有障碍的人也能通过声音来使用触屏手机……也许你这辈子也不会接触,但如果有一天你遇到了,碰巧你又看了我这一篇,你就可以挺起胸膛大声说:这个逼我装定了!
首先我们来看下Accessibility在Windows 10 Mobile上原生支持的情况,点击“设置”-》“轻松使用”-》“讲述人”,开启讲述人之后,你可以先体验个几分钟(另外讲述人对中文的支持并不是很好,建议切换到英文系统)。
我知道你想砸手机,但先别急着,等我们把今天的内容讲完再砸……
如何实现让“讲述人”朗读屏幕内容呢?按照某软一贯的尿性,HelloWorld必然简单到让人发指,只需给想要被朗读的控件添加“AutomationProperties.Name”就可以了。
<Button AutomationProperties.Name="I am a button">Button</Button>
手指戳上去的时候就会听到“I am a button”。如果你做完了这个Sample然后就跑去汇报可行性,那你就完了……
首先我们遇到的第一个问题就是讲述人无法识别自定义的控件,甚至连Grid,Border这样的默认没有交互的控件也不会识别,这个是很糟糕的。项目中难免会用到一些UserControl、CustomControl的,DataTemplate里又总会用到Grid啥的。这里统统读不出来,作为一个负责任的大公司,产品就不能发布了,后果很严重。
如何解决这个问题呢?其实也没那么复杂啦,某软还是提供了一些接口来做这些事情,参考了MSDN上的文档(极其没有卵用)和给出的Sample(有误导人的嫌疑),最终又查看了Silverlight里Button和TextBlock的源码(Windows Runtime貌似没有可以反编译的工具可以看到源码,ILSpy和JustDecompile均只能看到接口定义)。给出以下的解决方案:
解决方案以Grid举例,意图让“讲述人”识别Grid并念出AutomationProperties.Name中填写的文本。
public class CanReadGrid : Grid
{
protected override AutomationPeer OnCreateAutomationPeer()
{
return new GridAutomationPeer();
}
} public class GridAutomationPeer : AutomationPeer
{
protected override object GetPatternCore(PatternInterface patternInterface)
{
if (patternInterface == PatternInterface.Grid)
{
return this;
} return null;
} protected override AutomationControlType GetAutomationControlTypeCore()
{
return AutomationControlType.Custom;
} protected override string GetClassNameCore()
{
return "CanReadGrid";
}
}
第一步需要继承自现有的系统控件Gird,然后override方法OnCreateAutomationPeer,该方法继承自UIElement,已经是非常底层的对象了。但如果你去查看Grid类本身的接口定义,会发现Grid是没有对该方法做处理的。而默认就可以读出的Button和TextBlock等控件均override了该方法。
//
// Summary:
// 在派生类中实现时,为 Microsoft UI 自动化基础结构返回类特定的 AutomationPeer 实现。
//
// Returns:
// 要返回的类特定的 AutomationPeer 子类。
protected virtual AutomationPeer OnCreateAutomationPeer();
第二步需要创建类GridAutomationPeer继承自AutomationPeer。AutomationPeer文档中给出的说法是“提供一个对 Microsoft
UI 自动化公开关联所有者类的自动化同级的基类”。(虽然高考语文还可以,但仍不足以正确阅读理解MSDN天书……)既然文档看不懂,干脆就直接抄袭Button和TextBlock的源码来写呗。经反复比较推敲,确认了最为核心的方法protected override object GetPatternCore(PatternInterface
patternInterface),亲测鉴定只要实现了该方法,即可由讲述人识别。GetAutomationControlTypeCore和GetClassNameCore都只是锦上添花而已。最终使用的XAML如下:
<local:CanReadGrid Background="Red"
AutomationProperties.Name="Can read gird">
</local:CanReadGrid>
这个自定义的Grid终于能被“讲述人”毫无感情的念出“can read gird”了。说实话还是Contana的声音好听一些。
本篇介绍了如何让讲述人念出自定义控件,并强力建议先不要砸手机或汇报可行性分析,因为我还留了一个大坑给你们。可交互的控件比如Button,讲述人会语音提示双击可以激活Click操作,通过ViewModel中的Command绑定也没有问题。但问题是没有Command属性的控件要如何处理?通过Behaviors绑定的Command是万万不可能会自动识别的啦?想要知道答案的,下个礼拜见……
UWP开发砸手机系列(一)—— Accessibility的更多相关文章
- UWP开发砸手机系列(二)—— “讲述人”识别自定义控件Command
上一篇我们提到如何让“讲述人”读出自定义的CanReadGrid,但“讲述人”仍然无法识别CanReadGrid上绑定的Command.XAML代码如下: <StackPanel> < ...
- [UWP开发]处理手机后退事件
众所周知,uwp程序是一套代码,可以run在不同的平台上.但是不同的设备肯定有其独特之处,所以针对这些独特之处,必须用“独特的代码”来处理. 所以微软提供了一系列的拓展类库来实现这种特殊处理. 如上图 ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- UWP开发入门系列笔记之(一):UWP初览
标签: 随着微软Build2015带来的好消息,Win10正式版发布的日子已经离我们越来越近了,我们也终于欣喜地看到:一个统一的Windows平台对于开发人员来说充满了吸引力,这局棋下的好大的说--于 ...
- Android开发—智能家居系列】(二):用手机对WIFI模块进行配置
在实际开发中,我开发的这款APP是用来连接温控器,并对温控器进行控制的.有图为证,哈哈. 上一篇文章[Android开发—智能家居系列](一):智能家居原理的文末总结中写到: 手机APP控制智能温控器 ...
- Win10 UWP 开发系列:使用SQLite
在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中 ...
- Win 10 UWP开发系列:设置AppBarButton的图标
在WP8以前,页面最下面的四个小圆按钮是不支持绑定的,WP8.1 RT之后,系统按钮升级成了AppBarButton,并且支持绑定了.在Win10 UWP开发中,按钮的样式发生了变化,外面的圆圈没有了 ...
- 基于Prism.Windows的UWP开发备忘
以前做UWP开发都是使用MvvmLight,主要是简单易上手,同时也写了很多MvvmLight的开发系列文章: UWP开发必备以及常用知识点总结 UWP开发之Mvvmlight实践九:基于MVVM的项 ...
- UWP开发-在UWP中使用sqlite
原文:UWP开发-在UWP中使用sqlite sqlite是一种轻量级的数据库,对于一些资源紧张又需要数据库的开发非常好用. SQLite 是一个开源的无服务器嵌入式数据库. 这些年来,它已作为面向存 ...
随机推荐
- javascript客户端遍历控件与获取父容器对象
javascript客户端遍历控件与获取父容器对象示例代码 1,遍历也面中所有的控件function findControlAll() { var inputs=document. ...
- IntelliJ IDEA—IDEA2018.1激活方式
前言 以前用过2015的版本,后面就没有使用了,现在又重新用起来了,突然发现激活好难,通过网上找破解方式,总算找到了一种可以实现破解的方法了.. 破解方式 本人使用的是使用破解补丁的方式实现破解的,此 ...
- [译]2D空间中使用四叉树Quadtree进行碰撞检测优化
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity2017.2.0f3 原文出处 : Quick Tip: Use Quadtrees to Detect Lik ...
- Redis RDB文件
[Redis RDB文件] 1.RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). RDB 的优点 RDB 是一个非常紧凑(compact)的 ...
- nice & renice
[nice & renice & getpriority & setpriority] 1.nice & renice 参考:http://man.ddvip.com/ ...
- 282 expression and operations添加运算符
[抄题]: 给定一个仅包含数字 0 - 9 的字符串和一个目标值,返回在数字之间添加了 二元 运算符(不是一元)+, - 或 * 之后所有能得到目标值的情况. "123", 6 - ...
- 解题报告 - 577. Employee Bonus
Select all employee's name and bonus whose bonus is < 1000. Table:Employee +-------+--------+---- ...
- c语言字符串指针
最近正在看c语言,在指针这块遇到了麻烦,特别是字符串指针这块,简单记录下. 字符串指针 void main() { char *p = "tasklist"; printf(&qu ...
- ubuntu 基础环境
一.序言 这里记录了安装ubuntu 系统,以及里面常用的东西,jdk,idea,maven,svn,git 等等工具的安装,因为这些动作不是经常操作的,因此这里做一个记录,方便新手或者忘记的时候看看 ...
- MySql创建多表关联的步骤
一,一对多表的创建 1.创建主表 create table HostTable( cid varchar(32) primary key, cname varchar(100)); 2.创建从表 cr ...