给上位机触摸屏做一个虚拟键盘,这玩意儿不就是一排的网格里面放满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下的虚拟键盘实现的更多相关文章

  1. 分享一个WPF下日历控件(Calendar)的样式

    WPF日历控件的一个样式 WPF自带的日历控件样式可能会比较丑,要修改其样式看起来挺复杂的,实际上很简单,用Blend打开,修改三个模板,基本就能改变全部面貌,也很容易 先上图 样式如下: <S ...

  2. 移动H5页面,Android手机下,input获取焦点弹出系统虚拟键盘时,挡住input解决方法

    最近在写移动端页面的时候,遇到一个问题,在Android手机下,虚拟键盘会将input框遮挡住,具体情况如下图所示: 正常页面显示  IOS端显示情况 Android端显示情况 解决方式: <t ...

  3. [分享]WPF 虚拟键盘

    场景:用WPF做触屏的软件难免会需要用户输入的问题,至少是简单的数字,这个时候就免不了需要键盘输入. 思路:既然是虚拟键盘,那么我的目的就是模拟键盘输入即可. 1.模拟键盘输入 模拟键盘输入?那么肯定 ...

  4. 在 Android 的文字编辑控件 (TEdit) 中, 如何按下 Enter 就隐藏虚拟键盘

    在 Windows 的应用中,我们常常为了让使用者能够快速输入,在Edit元件中的onKeyUp或者 onKeyDown 事件中主动侦测使用者输入的字元是否有换行符号 (Enter),当使用者按下了E ...

  5. IOS系统下虚拟键盘遮挡文本框问题的解决

    最近在项目中发现同样的代码在Android端微信网页中点击文本框唤出的虚拟键盘不会遮挡文本框,但是在IOS端的微信网页中点击文本框唤出的键盘却在大部分情况下会遮挡文本框 经过高人指点,这个问题终于解决 ...

  6. WPF 虚拟键盘

    之前做了一款WPF虚拟键盘,调用Win32的API,可以模拟键盘事件. 现将代码分享如下: 按键布局如下: <Button Name="> <StackPanel Orie ...

  7. WPF 禁用TextBox的触摸后自动弹出虚拟键盘

    前言 & 问题 如下截图,TextBox,在触摸点击后,会自动弹出windows的虚拟键盘. 如何,禁用键盘的自动弹出? 调用虚拟键盘 通过调用TapTip.exe或者osk.exe,主动弹出 ...

  8. ios下虚拟键盘出现"搜索"字样

    最近在开发过程中,发现用户输入想要检索的内容,弹出虚拟键盘,在安卓机上虚拟键盘最右下角会有‘搜索’字样,而ios上虚拟键盘最右下角只有‘换行’字样, 这样用户体验就会大打折扣. 安卓机上虚拟键盘 io ...

  9. wpf 虚拟键盘 对外部程序

    对外部程序,以记事本为例,xaml中设置模拟按键的控件 Focusable="False": /// <summary> /// 发送按键 /// </summa ...

  10. 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

    搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...

随机推荐

  1. 高性能计算-雅可比算法-MPI重复非阻塞优化(7)

    #include <stdio.h> #include <mpi.h> #include <unistd.h> #include <stdlib.h> ...

  2. axios获取上传进度报错xhr.upload.addEventListener is not a function

    错误问题 Vue:xhr.upload.addEventListener is not a function 这个问题是因为mockjs改动了axios里面XMLHttpRequest对象致使的 根据 ...

  3. jackson 中对 null 的处理

    前情提要: 在项目中如何将null值转变为空字符串呢? @Configuration public class JacksonConfig { @Bean @Primary @ConditionalO ...

  4. IEDA 控制台乱码解决

    1.修改idea 目录下的文件 idea64.exe.vmoptions idea.exe.vmoptions 在这个文件尾部增加 -Dfile.encoding=UTF-8 2.编辑ieda 文件配 ...

  5. sql注入-数据库表基本操作

    一.数据库 linux下登录: mysql -u root -p 查看数据库: show databases; 可以在phpmyadmin面板点击SQL进行操作 1. 增加/创建 创建xxx数据库,并 ...

  6. 微信小程序手机号登录

    import { wxPhoneLogin, getPhoneNumber } from '../login' // 后端接口 // 服务端接口 - 获取openid function queryOp ...

  7. (一)Springboot + vue + 达梦数据库构建RBAC权限模型前后端分离脚手架保姆级教程(界面截图)

    用户登录  系统首页  用户列表  添加用户  修改用户  角色列表  添加角色  修改角色  

  8. Shiro简单入门+个人理解(3)

    最后一天,对shiro框架的应用也到此为至了,可能不是太全,但相对于一般的项目,它的作用已经使用了很多了 Shiro的授权: 授权:对用户资源访问的授权(是否允许用户访问此资源) 用户访问系统资源时的 ...

  9. powershell禁止系统运行脚本

    错误信息: set-executionpolicy remotesigned set-executionpolicy : Windows PowerShell 已成功更新你的执行策略,但在更具体的作业 ...

  10. Vue2 面试题 (2023-09-22更新)

    基础 Vue2.0 兼容 ie 哪个版本? 不支持 ie8,部分兼容 ie9,完全兼容 ie10 因为 vue 的响应式原理是基于 es5 的 Object.defineProperty 这个方法不支 ...