蜀黍我做的工作跟IM软件有关,UWP同时会跑在电脑和手机上。电脑和手机的使用习惯不尽一致,通常我倾向于根据窗口尺寸来进行布局的变化,但是特定的操作习惯是依赖于设备类型,而不是屏幕尺寸的,比如聊天窗口的发送消息。假设如下场景,desktop运行时要求回车键直接发送消息,而mobile版则要求回车键换行,仅能通过点击按钮发送消息。

  第一段的铺垫是为了今天提到的两个主题,判断设备类型和处理Shift+Enter的组合。

  首先判断设备类型我们使用的是Windows.System.Profile命名空间下的AnalyticsInfo类,通过AnalyticsInfo.VersionInfo.DeviceFamily这个属性我们可以拿到当前的设备类型,小屏幕的设备类型是"Windows.Mobile",其他还是有Windows.Desktop,Windows.Xbox等。这里我们只希望单独区分小屏幕设备,不关心其他设备类型。同时需要指出的是,随之今后Windows设备类型的不断扩充,该属性可能出现的值会不断变化,所以在使用时需要考虑到变化是否会产生bug。

        public bool IsAcceptReturn
{
get
{
return AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Mobile";
}
}

  我们根据设备类型来定义了一个属性IsAcceptReturn来标识是否接受回车键换行。

  接下来进行Shift+Enter组合键的响应了。UWP在这一点上果然又开了历史倒车,没记错的话连WinForm也无需如此麻烦,竟然要额外地储存一个标志位来标识VirtualKey.Shift是否被按下,在此基础之上再进一步判断是否有Enter键被触发。实际的代码中,我使用了KeyDown事件来记录Shift键的按下,同时通过KeyU事件来进行Enter键触发的判断。

        private void KeyUp(KeyRoutedEventArgs e)
{
if (e.Key == VirtualKey.Enter)
{
if (_isShiftKeyPressed)
{
int oldIndex = Index;
InputText = InputText.Replace(Environment.NewLine, "\n").Insert(Index, "\n");
Index = oldIndex + ;
}
else if (IsAcceptReturn == false)
{
SendMessage();
}
}
_isShiftKeyPressed = false;
} private void KeyDown(KeyRoutedEventArgs e)
{
if (e.Key == VirtualKey.Shift)
{
_isShiftKeyPressed = true;
}
}

  在KeyUp事件中如果涉及Enter键的触发,将判断_isShiftKeyPressed字段的值,同时根据IsAcceptReturn来判断是否不处理换行,直接发送消息。这里值得一提的是Environment.NewLine在Windows下对应的“\r\n”符号,计算字符串索引时仅作为1位处理,导致我很尴尬总是算不对Shift+Enter换行后的光标位置。无奈出下策将其替换成"\n",其中奥妙各位一试便知。程序对应的XAML如下:

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ListView Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" ItemsSource="{Binding Messages}"/>
<TextBox Grid.Row="1" Grid.Column="0" Text="{Binding InputText, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectionStart="{Binding Index, Mode=TwoWay}"
MaxHeight="100" AcceptsReturn="{Binding IsAcceptReturn}" TextWrapping="Wrap"> <Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="KeyUp">
<Core:InvokeCommandAction Command="{Binding KeyUpCommand,Mode=OneTime}"/>
</Core:EventTriggerBehavior>
<Core:EventTriggerBehavior EventName="KeyDown">
<Core:InvokeCommandAction Command="{Binding KeyDownCommand,Mode=OneTime}"/>
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors> </TextBox>
<Button Grid.Row="1" Grid.Column="1" Width="80" Command="{Binding SendMessageCommand}" Content="Send"/>
</Grid>

  ListView模拟聊天窗口,TextBox的Text属性Binding到了InpuText,同时SlectionStar属性Binding到Index,用于Shift+Enter换行时,插入\n换行符号,及确定光标位置。AcceptsReturn属性在Mobile设备上是true,而在其他设备上就会无视回车键来。TextWrapping属性也很重要,如果不设置为Wrap,即使实际的字符串是包含“\n”等换行符号,但在TextBox中也不会显示出来。

  求看到这里的各位评论一下嗨,让俺知道还有人在看Windows UWP。

  Behaviors的使用我计划后续的篇章再介绍,同时本篇的代码使用了Mvvmlight框架,我想是时候把Mvvmlight的介绍也拾起来了!最后是完整代码在GitHub的地址,欢迎看了批评指正哈。

  https://github.com/manupstairs/UWPSamples/tree/master/UWPSamples/DeviceFamilyAndVirtualKey

UWP开发入门(十七)——判断设备类型及响应VirtualKey的更多相关文章

  1. UWP开发入门(十六)——常见的内存泄漏的原因

    本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍. 内存泄漏的概念我这里就不说了,之前<UWP开发入门(十三)——用Diagnostic Tool检查内存泄漏>中提到过,即使有 ...

  2. UWP开发入门系列笔记之(一):UWP初览

    标签: 随着微软Build2015带来的好消息,Win10正式版发布的日子已经离我们越来越近了,我们也终于欣喜地看到:一个统一的Windows平台对于开发人员来说充满了吸引力,这局棋下的好大的说--于 ...

  3. UWP开发入门(十)——通过继承来扩展ListView

    本篇之所以起这样一个名字,是因为重点并非如何自定义控件,不涉及创建CustomControl和UserControl使用的Template和XAML概念.而是通过继承的方法来扩展一个现有的类,在继承的 ...

  4. UWP开发入门(四)——自定义CommandBar

    各位好,再次回到UWP开发入门系列,刚回归可能有些不适应,所以今天我们讲个简单的,自定义CommandBar,说通俗点就是自定义类似AppBarButton的东西,然后扔到CommandBar中使用. ...

  5. UWP开发入门(25)——通过Radio控制Bluetooth, WiFi

    回顾写了许久的UWP开发入门,竟然没有讲过通过Windows.Devices.Radios.Radio来控制Bluetooth和WiFi等功能的开关.也许是因为相关的API设计的简单好用,以至于被我给 ...

  6. UWP开发入门(二十一)——保持Ui线程处于响应状态

    GUI的程序有时候会因为等待一个耗时操作完成,导致界面卡死.本篇我们就UWP开发中可能遇到的情况,来讨论如何优化处理. 假设当前存在点击按钮跳转页面的操作,通过按钮打开的新页面,在初始化过程中存在一些 ...

  7. UWP开发入门(十一)——Attached Property的简单应用

    UWP中的Attached Property即附加属性,在实际开发中是很常见的,比如Grid.Row: <Grid Background="{ThemeResource Applica ...

  8. UWP开发入门(二十三)——WebView

    本篇讨论在UWP开发中使用WebView控件时常见的问题,以及一些小技巧. WebView是实际开发中常用的控件,很多大家抱怨的套网页的应用都是通过WebView来实现的.这里要澄清一个问题,套网页的 ...

  9. UWP开发入门(七)——下拉刷新

    本篇意在给这几天Win10 Mobile负面新闻不断的某软洗地,想要证明实现一个简单的下拉刷新并不困难.UWP开发更大的困难在于懒惰,缺乏学习的意愿.而不是“某软连下拉刷新控件都没有”这样的想法. 之 ...

随机推荐

  1. C# 传入引用类型的参数 返回值是否发生变化

    前一段时间做项目是,一YY说如果一个方法的参数是引用类型,那么在这个方法里面所做的所有的修改再方法调用后应该有体现.事实是这样的吗? 先看code 和运行结果: 运行结果 方法SetPersonInf ...

  2. ios面试总结-

    一 C语言方法的知识 1: const  static  voilite 修辞变量各代表什么意思? const  修辞的变量为常量,常量是不容许修改.  static  修辞的变量为静态变量,在内存中 ...

  3. IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)

    上篇 IOS APP 国际化(实现不跟随系统语言,不用重启应用,代码切换stroyboard ,xib ,图片,其他资源 介绍了纯代码刷新 实现程序内切换语言. 但效率底下,也存在一些问题.暂放弃. ...

  4. 用Storm轻松实时大数据分析【翻译】

    原文地址 简单易用,Storm让大数据分析变得轻而易举. 如今,公司在日常运作中经常会产生TB(terabytes)级的数据.数据来源包括从网络传感器捕获的,到Web,社交媒体,交易型业务数据,以及其 ...

  5. 降低屏幕亮度,减缓眼疲劳 (linux/windows/firefox/android)

    Linux 在Linux上自动调整屏幕亮度来保护眼睛 - 51CTO.COM -- 介绍了Camera和RedShift这两款工具 How to automatically dim your scre ...

  6. session和jsessionid有什么关系

    首先,并不是说你一打开一个页面就会产生一个session. 所谓session你可以这样理解:当你与服务端进行会话时,比如说登陆成功后,服务端会为你开壁一块内存区间,用以存放你这次会话的一些内容,比如 ...

  7. 尝试在tensorflow上运行facenet

    上一篇装好了tensorflow的运行环境,开始尝试运行一些实例代码,在github上找到了一个tensorflow实现的facenet的代码,还是遇到了很多坑! 坚持看完,有重要总结! 代码:htt ...

  8. php安装phalcon扩展

    一.关于phalcon: 简介: Phalcon 是开源.全功能栈.使用 C /zephir 编写.针对高性能优化的 PHP 5 框架. 开发者不需要学习和使用 C 语言的功能, 因为所有的功能都以 ...

  9. KPI绩效考核为何在国内不管用?

    很多外国很好的管理制度,到了中国都有水土不服,就像KPI绩效考核一样,到了中国执行得很不好,甚至还不如用本土的人治管理方法,那是为何呢?为什么国内学平衡计分法和KPI的热情非常高,效果却往往有限? 其 ...

  10. MacBook 蓝牙无法搜索设备

    背景 经常把MacBook合上盖子就塞进包里,用时打开盖子就继续操作,偶尔会出现刚刚还在用的罗技蓝牙鼠标,重新打开笔记本后就连接不上了,而且也无法搜索到周边的蓝牙设备. 解决方案 快捷键:Option ...