一个WPF下的虚拟键盘实现
给上位机触摸屏做一个虚拟键盘,这玩意儿不就是一排的网格里面放满button嘛 。说归这样说 依然还是有一堆细节需要你去处理的。不论如何 先画个键盘吧。
简单的从网上找个键盘位图做参照使用 4行Grid 布局一下 是不是有模有样。主要是按键的样式要想好看的话的花一些功夫。然后所有的button需要绑定同一个事件,由于WPF里的事件是路由事件 我们直接在最外面的Grid上写 ButtonBase.Click="ButtonGrid_Click" 即可 ,以前竟然没发现还可以这样ButtonBase 了解了。然后有几个蓝色的Fun按键需要做特殊处理和定义, 还有就算我们做成的userControl控件,需要把事件暴露给外部 让按特定键的时候外部写自己的处理逻辑。
按键和事件定义
1 public Action<object> MyKeyDown;
2 private String valueString;
3
4 internal String ValueString
5 {
6 get { return valueString; }
7 }
8 public enum EKeyitem
9 {
10 DEl,
11 AC,
12 OK,
13 Shift,
14 A
15 }
事件触发
1 private void ButtonGrid_Click(object sender, RoutedEventArgs e)
2 {
3 Button clickedButton = (Button)e.OriginalSource; //获取click事件触发源,即按了的按钮
4 if ((String)clickedButton.Content == "DEL")
5 {
6 MyKeyDown(EKeyitem.DEl);
7 }
8 else if ((String)clickedButton.Content == "AC")
9 {
10 MyKeyDown(EKeyitem.AC);
11 }
12 else if ((String)clickedButton.Content == "确认")
13 {
14 MyKeyDown(EKeyitem.OK);
15 //this.Close();
16 }
17 else if ((String)clickedButton.Content == "A/a")
18 {
19 for (int j = 1; j < 4; j++)
20 {
21 Grid grd = ButtonGrid.Children[j] as Grid;
22 int count2 = grd.Children.Count;
23 for (int i = 0; i < count2; i++)
24 {
25 Button buttonTemp = grd.Children[i] as Button;
26 String contentTemp = buttonTemp.Content as String;
27 if (contentTemp == "AC" || contentTemp == "A/a")
28 continue;
29 buttonTemp.Content = contentTemp[0] > 90 ? contentTemp.ToUpper() : contentTemp.ToLower();
30 }
31 }
32
33 }
34 else
35 {
36 MyKeyDown((String)clickedButton.Content);
37 }
38 }
外部使用,常规usercontrol一样使用,先是引入命名空间xmlns:local="clr-namespace:xxx,由于虚拟键盘有一个特性 ,比如我们点击文本框那么它应该出现,且出现的位置刚好在文本框下方,我点回车虚拟键盘消失,那么这里有一丁丁的奇技淫巧,那就是可以进行绝对定位的canvas组件。
1 <Grid>
2 <TextBox Width="300" Height="50" FontSize="25" Name="tbx_QueryCode" Text="" PreviewMouseDown="tbx_QueryCode_PreviewMouseDown" KeyDown="tbx_QueryCode_KeyDown" GotFocus="tbx_QueryCode_GotFocus"></TextBox>
3 <Canvas Name="vkContext" Focusable="False" >
4 <local:VKeyBoard Canvas.Left="50" Focusable="False" Canvas.Top="100" Visibility="Hidden" x:Name="myvk"></local:VKeyBoard>
5 </Canvas>
6 </Grid>
文本框获取焦点时
1 private void tbx_QueryCode_GotFocus(object sender, RoutedEventArgs e)
2 {
3 myvk.Visibility = Visibility.Visible;
4 focusTbx = tbx_QueryCode;
5 RePointKeyBoard();
6 }
虚拟键盘的聚焦
1 public void RePointKeyBoard()
2 {
3 if (focusTbx != null)
4 {
5 Point p = focusTbx.TranslatePoint(new Point(0, 0), windContent);
6
7 this.myvk.SetValue(Canvas.LeftProperty, p.X);
8 this.myvk.SetValue(Canvas.TopProperty, p.Y + focusTbx.Height);
9 }
10
11 }
还有就是虚拟键盘外露给我们事件的处理。
开始时绑定事件
1 private void Window_Loaded(object sender, RoutedEventArgs e)
2 {
3 myvk.MyKeyDown = MyKeyDown;
4
5 }
外露事件处理
1 //虚拟键盘事件
2 private void MyKeyDown(object _key)
3 {
4 if (focusTbx == null)
5 {
6 myvk.Visibility = Visibility.Hidden;
7 return;
8 }
9 EKeyitem key = EKeyitem.A;
10 if (_key.GetType() == typeof(EKeyitem))
11 key = (EKeyitem)_key;
12
13 if (key == EKeyitem.DEl)
14 {
15 if (focusTbx.Text.Length > 0)
16 {
17 focusTbx.Text = focusTbx.Text.Substring(0, focusTbx.Text.Length - 1);
18 }
19 }
20 else if (key == EKeyitem.AC)
21 {
22 focusTbx.Text = "";
23 }
24 else if (key == EKeyitem.OK)
25 {
26
27 myvk.Visibility = Visibility.Hidden;
28 if (vm.LoginOK == true && focusTbx == tbx_QueryCode)
29 {
30 valueString = focusTbx.Text;
31 //this.Close();
32 BarCodeInputKeyDown();
33 }
34 }
35 else if (key == EKeyitem.Shift)
36 {
37
38 }
39 else
40 {
41 focusTbx.Text += _key.ToString();
42 }
43 }
一个WPF下的虚拟键盘实现的更多相关文章
- 分享一个WPF下日历控件(Calendar)的样式
WPF日历控件的一个样式 WPF自带的日历控件样式可能会比较丑,要修改其样式看起来挺复杂的,实际上很简单,用Blend打开,修改三个模板,基本就能改变全部面貌,也很容易 先上图 样式如下: <S ...
- 移动H5页面,Android手机下,input获取焦点弹出系统虚拟键盘时,挡住input解决方法
最近在写移动端页面的时候,遇到一个问题,在Android手机下,虚拟键盘会将input框遮挡住,具体情况如下图所示: 正常页面显示 IOS端显示情况 Android端显示情况 解决方式: <t ...
- [分享]WPF 虚拟键盘
场景:用WPF做触屏的软件难免会需要用户输入的问题,至少是简单的数字,这个时候就免不了需要键盘输入. 思路:既然是虚拟键盘,那么我的目的就是模拟键盘输入即可. 1.模拟键盘输入 模拟键盘输入?那么肯定 ...
- 在 Android 的文字编辑控件 (TEdit) 中, 如何按下 Enter 就隐藏虚拟键盘
在 Windows 的应用中,我们常常为了让使用者能够快速输入,在Edit元件中的onKeyUp或者 onKeyDown 事件中主动侦测使用者输入的字元是否有换行符号 (Enter),当使用者按下了E ...
- IOS系统下虚拟键盘遮挡文本框问题的解决
最近在项目中发现同样的代码在Android端微信网页中点击文本框唤出的虚拟键盘不会遮挡文本框,但是在IOS端的微信网页中点击文本框唤出的键盘却在大部分情况下会遮挡文本框 经过高人指点,这个问题终于解决 ...
- WPF 虚拟键盘
之前做了一款WPF虚拟键盘,调用Win32的API,可以模拟键盘事件. 现将代码分享如下: 按键布局如下: <Button Name="> <StackPanel Orie ...
- WPF 禁用TextBox的触摸后自动弹出虚拟键盘
前言 & 问题 如下截图,TextBox,在触摸点击后,会自动弹出windows的虚拟键盘. 如何,禁用键盘的自动弹出? 调用虚拟键盘 通过调用TapTip.exe或者osk.exe,主动弹出 ...
- ios下虚拟键盘出现"搜索"字样
最近在开发过程中,发现用户输入想要检索的内容,弹出虚拟键盘,在安卓机上虚拟键盘最右下角会有‘搜索’字样,而ios上虚拟键盘最右下角只有‘换行’字样, 这样用户体验就会大打折扣. 安卓机上虚拟键盘 io ...
- wpf 虚拟键盘 对外部程序
对外部程序,以记事本为例,xaml中设置模拟按键的控件 Focusable="False": /// <summary> /// 发送按键 /// </summa ...
- 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)
搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...
随机推荐
- P5524 Ynoi2012 NOIP2015 充满了希望
P5524 Ynoi2012 NOIP2015 充满了希望 数组开大见祖宗. 思路 不难发现只有询问才会产生贡献,而询问的值来自于距离它最近的且能覆盖这个询问的点的覆盖操作. 可以每个询问操作保存一个 ...
- 【昌哥IT课堂】MySQL8.4.0新特性:FLUSH_PRIVILEGES动态权限细化与隔离[译]
介绍MySQL 支持 RELOAD 权限.现在,想象一个数据库用户被授予了 RELOAD 权限,这允许该用户在系统上执行 FLUSH PRIVILEGES 语句.假设该用户意外地执行了另一个强大的语句 ...
- vant+vue控制列表展开
<van-list v-model="loading" :finished="finished" finished-text="没有更多了&qu ...
- (Python基础教程之十五)Python开箱Tuple–太多值无法解压
Python示例,用于unpack元组或序列或可迭代,以便该元组可能长于N个元素,从而导致" 太多的值无法unpack "异常. 1.打开任意长度的元组 Python" ...
- 性能调优、虚拟机、垃圾回收、软硬件协调相关文章和视频 — Part1
本文由 ImportNew - 顾星竹 翻译自 javacodegeeks.如需转载本文,请先参见文章末尾处的转载要求. ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 J ...
- Xdebug+Phpstorm远程调试
开发环境: 本地 Windows10 日常开发使用的环境 装有PHPStorm 远程主机 Linux 服务器 装php-fpm/nginx等所有开发依赖环境 本地可以访问远程主机 但远程主机无法访问本 ...
- MySQL 8.0 为什么会放弃查询缓存?
什么是查询缓存? 查询缓存就是将一次查询结果存储在内存中,假如下一次查询结果在内存中,就直接在内存中读取. 设计初衷 当然是提高性能,通过缓存来减少解析器.优化器.存储引擎的执行时间. MySQL查询 ...
- apisix~路由前缀的正则匹配
参考:https://apisix.apache.org/zh/docs/apisix/FAQ/ 在你提供的 Apache APISIX 路由配置中,vars 字段用于定义一些变量匹配规则.具体来说, ...
- 如何实现LLM的通用function-calling能力?
众所周知,LLM的函数function-calling能力很强悍,解决了大模型与实际业务系统的交互问题.其本质就是函数调用. 从openai官网摘图: 简而言之: LLM起到决策的作用,告知业务系统应 ...
- 痞子衡嵌入式:MCUXpresso IDE下C++源文件中嵌套定义的复合数据类型命名空间认定
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下C++源文件中嵌套定义的复合数据类型命名空间认定. 痞子衡之前写过一篇文章 <MCUXpresso ...