一个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 ...
随机推荐
- The 2024 ICPC Asia East Continent Online Contest (I) G
Link: The Median of the Median of the Median 考虑二分答案,对中位数进行二分,每次去判断是否比中位数大即可. 我们钦定了一个中位数 \(x\),对于 \(\ ...
- Python网络爬虫第一弹
03.Python网络爬虫第一弹<Python网络爬虫相关基础概念> 爬虫介绍 引入 之前在授课过程中,好多同学都问过我这样的一个问题:为什么要学习爬虫,学习爬虫能够为我们以后的发展带来那 ...
- Python源码分析2 - 一个简单的Python程序的执行
本文主要通过跟踪一个非常简单的Python程序的执行,简单讨论Python实现的基本框架和结构. 要执行Python程序如下,功能非常简单:从1加到10再打印出来 # test program sum ...
- PostgreSql Docker 主从热备,异步流复制方案
环境说明 Docker Windows 11 PostgreSql 16 方案步骤 0. 宿主机准备: 找个地方创建一个文件夹用来挂载容器中数据库Data文件夹,这里我用的是: C:\Users\Ad ...
- Mybatis 实现多字段动态排序
背景 在项目的开发过程中,可能会遇到对数据表多个字段进行排序的需求(第一句话就这么难懂,不要害怕,万事开头难,结尾更难,开玩笑哒),结合需求轻松易懂. 需求 现在有一张User表 男同学先按 age ...
- docker 批量删除镜像
删除虚悬镜像 列出REPOSITORY和TAG均为<none>的虚悬镜像: $ docker images --filter dangling=true REPOSITORY TAG IM ...
- CVE-2023-0461 漏洞分析与利用
PS: 文章首发于补天社区 漏洞分析 tcp_set_ulp里面会分配和设置 icsk->icsk_ulp_data,其类型为 tls_context tcp_setsockopt do_tcp ...
- Day01 Markdown 学习笔记
Day01 Markdown 学习笔记 1.标题 n级标题 = n个"#" + 空格 + 标题名称 (最多6个) 2.文本 Hello World Hello World ...
- 如何使用图片压缩降低COS流量成本?
导语 本文将介绍如何通过[图片压缩]能力,让您降本增效的使用 COS ,文章将写得浅显易懂,旨在快速带领用户了解图片压缩的用法及带来的收益. **** 图片压缩为什么会让您降本增效?******** ...
- 百度地图各种控件:地图平移缩放控件NavigationControl、地图类型控件MapTypeControl
注:代码复制即可用,标色代码为主要代码 百度地图提供了如下控件: 1.Control:控件的抽象基类,所有控件均继承此类的方法.属性.通过此类您可实现自定义控件. 2.NavigationContro ...