百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

UWP开发入门(十七)--判断设备类型及响应VirtualKey

zhezhongyun 2025-06-09 07:23 1 浏览

蜀黍我做的工作跟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 + 1;
 }
 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的地址,欢迎看了批评指正哈。

相关推荐

Renaming column names in Pandas

技术背景在数据处理过程中,经常需要对数据框(DataFrame)的列名进行重命名,以满足数据分析、可视化或其他处理的需求。Pandas是Python中用于数据处理和分析的强大库,提供了多种重命名...

JSA宏教程WPS表格常用内置对象——应用程序(Application)对象

一、关于应用程序Application对象Application对象就是一个运行着的WPS表格(即ET)应用程序,它是整个应用程序根对象,在它之上没有其他程序对象了。ET在WPS的文件夹中的图标如下:...

Pandas通过columns属性访问、修改和删除列

在pandas中,DataFrame的列可以使用columns属性进行访问、修改或删除。以下是使用columns属性访问DataFrame列的示例代码:importpandasa...

excel的高级用法——宏,原来如此实用

使用excel时,直接手动计算或者输入公式,你会感到很苦恼或者操作很繁琐,如果使用vba直接输出结果,虽然效率很高,但是不够直观。excel宏最方便的用法是作为公式里的函数使用,打开宏编辑器,编写一个...

CSS grid-template-columns属性探讨|给你代码

CSSgrid布局CSSgrid布局是一种很强大的布局,兼容性如上表所示,表现在控制台里,你可以清楚看到他的内部每一个块都由一个虚线方块组成。他的每行每列都会生产一个单元格,而划分他们之间的线称为网...

7K star!Text2SQL还不够?试试RAG2SQL的开源工具

查询数据库离不开SQL,那如何快速构建符合自己期望的SQL呢?AI发展带来了Text2SQL的能力,众多产品纷纷提供了很好的支持。今天我们分享一个开源项目,它在Text2SQL的基础上还要继续提高,通...

用Python把表格做成web可视化图表

Python中有一个streamlit库,Streamlit的美妙之处在于您可以直接在Python中创建Web应用程序,而无需了解HTML、CSS或JavaScrip,今天我们就用st...

鸿蒙开发:使用Circle绘制圆形(鸿蒙圆角)

前言本文基于Api13上篇文章,我们使用Rect组件实现了矩形效果,本篇文章,我们继续探究几何图形的中圆形,实现矩形有多种形式,同样,圆形,也是有多种形式,在上篇的文章中也简单的做了几个案例,比如,我...

pandas读取Excel数据(.xlsx和.xls)

Python,速成心法敲代码,查资料,问Ai练习,探索,总结,优化★★★★★★★★★★Python教程:PyCharm安装过程中遇到的中英...

WPF - 4.布局(wpf 表单布局)

摘要WPF布局原则一个窗口中只能包含一个元素屏幕适应程序,不要显示设置的元素(控件)的尺寸,可以设置最小或者最大尺寸不应使用坐标设置元素的位置可以嵌套布局容器正文Grid面板通过Grid.RowDef...

前端开发避坑指南:每天都能用的 CSS3/Less/Sass 实战技巧

在前端开发这条路上,CSS3、Less和Sass就像三个形影不离的好兄弟。它们既能帮你打造出惊艳的页面效果,也会偶尔给你“挖坑”。今天就分享几个我在项目里摸爬滚打总结出的实战技巧,全是干货,拿...

WPF 实现描点导航(wps描点作图)

WPF实现描点导航控件名:NavScrollPanel作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopersOrg/WPF...

WPS表格自动绘制像素风格营销宣传海报文档

先看效果原图WPS表格(类Excel)效果,这不是贴图哦操作流程分解图片为BGR数值的二维数组化的CSV将二维数组的CSV导入数据,数据-导入-选择数据源-分隔符号-逗号-完成插入脚本,开发工具-WP...

Python读写docx文件(python读文档)

Python读写docx文件Python读写word文档有现成的库可以处理pipinstallpython-docx安装一下。https://python-docx.readthedocs.io/...

UWP开发入门(十七)--判断设备类型及响应VirtualKey

蜀黍我做的工作跟IM软件有关,UWP同时会跑在电脑和手机上。电脑和手机的使用习惯不尽一致,通常我倾向于根据窗口尺寸来进行布局的变化,但是特定的操作习惯是依赖于设备类型,而不是屏幕尺寸的,比如聊天窗口的...