一个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 ...
随机推荐
- C#验证IP是否为局域网地址的三种方法
C#验证IP是否为局域网地址的三种方法 前一阵子有[广州.NET群]的客户问起这个问题,说他们需要验证客户输入的网站是否为局域网.其实局域网的IP并没有确定的定义,只要是局域网中,即可设置为任何一个I ...
- QOJ 5020. 举办乘凉州喵,举办乘凉州谢谢喵
QOJ 5020. 举办乘凉州喵,举办乘凉州谢谢喵 飞天数据结构. 思路 设 \(f[u][k]\) 为 \(u\) 子树内距离 \(u\) 小于等于 \(k\) 的点的个数,\(g[u][k]\) ...
- TSCTF-J2024 密码向WP(5/8)
ezRSA part 1 #part1 p = getPrime(512) q = getPrime(512) n = p * q phi = (p-1) * (q-1) d = getPrime(2 ...
- Python网络爬虫实践案例:爬取猫眼电影Top100
以下是一个Python网络爬虫的实践案例,该案例将演示如何使用Python爬取猫眼电影Top100的电影名称.主演和上映时间等信息,并将这些信息保存到TXT文件中.此案例使用了requests库来发送 ...
- Python 潮流周刊#78:async/await 是糟糕的设计(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 多线程实现的Java爬虫程序
以下是一个Java爬虫程序,它能从指定主页开始,按照指定的深度抓取该站点域名下的网页并维护简单索引. 参数:private static int webDepth = 2;//爬虫深度. 主页的深度为 ...
- 元数建模工具之chiner
chiner,发音:[kaɪˈnər],使用React+Electron+Java技术体系构建的一款元数建模平台. 下载地址:https://gitee.com/robergroup/chiner/r ...
- web移动端常见问题(一)
1.1物理像素 产生原因:css样式的最小值是1px,不过这个1px只是代表css像素,在高清屏上展示的物理像素要>1(iphone6 1css像素=2物理像素.而iph6p则是1css像素=3 ...
- Nuxt.js 应用中的 afterResponse 事件钩子
title: Nuxt.js 应用中的 afterResponse 事件钩子 date: 2024/12/6 updated: 2024/12/6 author: cmdragon excerpt: ...
- 【邮件伪造】SPF与DKIM验证原理及实战解析(上)
0x01 前言 大家好,我是VoltCary 本篇文章是系列邮件安全专题的第一篇,主要帮助大家掌握邮件安全的基础知识. 基础内容包括: SMTP协议 邮件安全验证原理与过程 SPF验证与DKIM签名验 ...