WPF 实现自定义弹窗输入功能

1.前端实现

 <Grid><Grid.RowDefinitions><RowDefinition Height="60" /><RowDefinition Height="*" /></Grid.RowDefinitions><BorderGrid.Row="0"BorderBrush="WhiteSmoke"BorderThickness="0.1"><DockPanel Margin="5,0,0,0"><WrapPanelWidth="380"VerticalAlignment="Center"DockPanel.Dock="Right"><Buttonx:Name="Button_OK"Margin="5"Click="Button_OK_Click"Content="OK"Style="{DynamicResource btn-primary}" /><Buttonx:Name="Button_Del"Margin="5"Click="Button_Del_Click"Content="Del"Style="{DynamicResource btn-primary}" /><Buttonx:Name="Button_Clear"Margin="5"Click="Button_Clear_Click"Content="Clear"Style="{DynamicResource btn-primary}" /><Buttonx:Name="Button_Cancel"Margin="5"Click="Button_Cancel_Click"Content="Cancel"Style="{DynamicResource btn-primary}" /><CheckBoxx:Name="CheckBox_Case"Margin="20,5,5,5"Checked="CheckBox_Case_Checked"Content="Case"FontSize="18"Foreground="WhiteSmoke"Style="{DynamicResource CheckBox_BoxStyle}"Unchecked="CheckBox_Case_Unchecked" /></WrapPanel><DockPanel VerticalAlignment="Center"><LabelVerticalContentAlignment="Center"Content="Input:"FontSize="25"Foreground="{DynamicResource Skin-TextColor}" /><TextBoxx:Name="TextBox_Value"Margin="5,0,0,0"FontSize="20"InputMethod.IsInputMethodEnabled="False" /></DockPanel></DockPanel></Border><Border Grid.Row="1"><DockPanel><!--  数字  --><BorderWidth="200"BorderBrush="WhiteSmoke"BorderThickness="1,0.2,0.2,0.2"DockPanel.Dock="Right"><Grid><Grid.RowDefinitions><RowDefinition /><RowDefinition /><RowDefinition /><RowDefinition /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><ButtonGrid.Row="0"Grid.Column="0"Click="Button_Click"Content="7"Style="{DynamicResource ButtonSizeAdaptive}" /><ButtonGrid.Row="0"Grid.Column="1"Click="Button_Click"Content="8"Style="{DynamicResource ButtonSizeAdaptive}" /><ButtonGrid.Row="0"Grid.Column="2"Click="Button_Click"Content="9"Style="{DynamicResource ButtonSizeAdaptive}" /><ButtonGrid.Row="1"Grid.Column="0"Click="Button_Click"Content="4"Style="{DynamicResource ButtonSizeAdaptive}" /><ButtonGrid.Row="1"Grid.Column="1"Click="Button_Click"Content="5"Style="{DynamicResource ButtonSizeAdaptive}" /><ButtonGrid.Row="1"Grid.Column="2"Click="Button_Click"Content="6"Style="{DynamicResource ButtonSizeAdaptive}" /><ButtonGrid.Row="2"Grid.Column="0"Click="Button_Click"Content="1"Style="{DynamicResource ButtonSizeAdaptive}" /><ButtonGrid.Row="2"Grid.Column="1"Click="Button_Click"Content="2"Style="{DynamicResource ButtonSizeAdaptive}" /><ButtonGrid.Row="2"Grid.Column="2"Click="Button_Click"Content="3"Style="{DynamicResource ButtonSizeAdaptive}" /><ButtonGrid.Row="3"Grid.Column="0"Click="Button_Click"Content="0"Style="{DynamicResource ButtonSizeAdaptive}" /><ButtonGrid.Row="3"Grid.Column="1"Click="Button_Click"Content="."Style="{DynamicResource ButtonSizeAdaptive}" /><ButtonGrid.Row="3"Grid.Column="2"Click="Button_Click"Content="-"Style="{DynamicResource ButtonSizeAdaptive}" /></Grid></Border><!--  字母  --><Border BorderBrush="WhiteSmoke" BorderThickness="0.2,0.2,1,0.2"><Grid x:Name="UniformGrid_Letter"><Grid.RowDefinitions><RowDefinition /><RowDefinition /><RowDefinition /><RowDefinition /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><!--  abcdefg  --><Buttonx:Name="Button_Letter_1"Grid.Row="0"Grid.Column="0"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_2"Grid.Row="0"Grid.Column="1"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_3"Grid.Row="0"Grid.Column="2"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_4"Grid.Row="0"Grid.Column="3"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_5"Grid.Row="0"Grid.Column="4"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_6"Grid.Row="0"Grid.Column="5"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_7"Grid.Row="0"Grid.Column="6"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><!--  hijklmn  --><Buttonx:Name="Button_Letter_8"Grid.Row="1"Grid.Column="0"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_9"Grid.Row="1"Grid.Column="1"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_10"Grid.Row="1"Grid.Column="2"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_11"Grid.Row="1"Grid.Column="3"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_12"Grid.Row="1"Grid.Column="4"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_13"Grid.Row="1"Grid.Column="5"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_14"Grid.Row="1"Grid.Column="6"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><!--  opqrstu  --><Buttonx:Name="Button_Letter_15"Grid.Row="2"Grid.Column="0"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_16"Grid.Row="2"Grid.Column="1"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_17"Grid.Row="2"Grid.Column="2"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_18"Grid.Row="2"Grid.Column="3"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_19"Grid.Row="2"Grid.Column="4"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_20"Grid.Row="2"Grid.Column="5"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_21"Grid.Row="2"Grid.Column="6"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><!--  vwxyz-@  --><Buttonx:Name="Button_Letter_22"Grid.Row="3"Grid.Column="0"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_23"Grid.Row="3"Grid.Column="1"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_24"Grid.Row="3"Grid.Column="2"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_25"Grid.Row="3"Grid.Column="3"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_26"Grid.Row="3"Grid.Column="4"Click="Button_Letter_Click"Content=""Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_27"Grid.Row="3"Grid.Column="5"Click="Button_Letter_Click"Content="/"Style="{DynamicResource ButtonSizeAdaptive}" /><Buttonx:Name="Button_Letter_28"Grid.Row="3"Grid.Column="6"Click="Button_Letter_Click"Content="@"Style="{DynamicResource ButtonSizeAdaptive}" /></Grid></Border></DockPanel></Border></Grid>

2.后端实现

/// <summary>
/// KeyboardWindow.xaml 的交互逻辑
/// </summary>
public partial class KeyboardWindow : Window
{List<string> letterList = new List<string>();public KeyboardWindow(string value = ""){InitializeComponent();Init(value);}private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e){}/// <summary>/// 初始化/// </summary>private void Init(string value){try{value = value ?? "";TextBox_Value.Text = value;TextBox_Value.SelectionStart = value.Length;TextBox_Value.Focus();string[] ss = new string[26] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };letterList= ss.ToList();Load();}catch{}}private void Load(bool isCase = false){try{for (int i = 0; i < letterList.Count; i++){string name = string.Format("Button_Letter_{0}", i + 1);Button but = this.UniformGrid_Letter.FindName(name) as Button;if (isCase){but.Content = letterList[i].ToUpper();}else{but.Content = letterList[i].ToLower();}}}catch{}}#region 值输入/// <summary>/// 清空/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button_Clear_Click(object sender, RoutedEventArgs e){TextBox_Value.Text = string.Empty;}/// <summary>/// 删除/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button_Del_Click(object sender, RoutedEventArgs e){try{if (TextBox_Value.Text.Trim().Length > 0){TextBox_Value.Text = TextBox_Value.Text.Substring(0, TextBox_Value.Text.Trim().Length - 1);}}catch{}}/// <summary>/// 取消/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button_Cancel_Click(object sender, RoutedEventArgs e){this.DialogResult = false;this.Close();}/// <summary>/// 确定/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button_OK_Click(object sender, RoutedEventArgs e){try{this.DialogResult = true;this.Close();}catch{}}#endregion/// <summary>/// 输入值/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button_Click(object sender, RoutedEventArgs e){try{Button but = sender as Button;string value = but.Content.ToString();//TextBox_Value.Text += value;int cursorPos = TextBox_Value.SelectionStart;TextBox_Value.Text = TextBox_Value.Text.Insert(cursorPos, value);TextBox_Value.SelectionStart = cursorPos + value.Length;TextBox_Value.Focus();}catch{}}/// <summary>/// 返回值/// </summary>/// <returns></returns>public string GetValue(){return TextBox_Value.Text;}/// <summary>/// 字母输入/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button_Letter_Click(object sender, RoutedEventArgs e){try{Button but = sender as Button;string value = but.Content.ToString();//TextBox_Value.Text += value;int cursorPos = TextBox_Value.SelectionStart;TextBox_Value.Text = TextBox_Value.Text.Insert(cursorPos, value);TextBox_Value.SelectionStart = cursorPos + value.Length;TextBox_Value.Focus();}catch{}}/// <summary>/// 选中大写/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void CheckBox_Case_Checked(object sender, RoutedEventArgs e){Load(true);}/// <summary>/// 小写/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void CheckBox_Case_Unchecked(object sender, RoutedEventArgs e){Load(false);}
}

3.自定义Button样式

 <Style x:Key="ButtonSizeAdaptive" TargetType="Button"><Setter Property="VerticalContentAlignment" Value="Center" /><Setter Property="VerticalAlignment" Value="Stretch" /><Setter Property="HorizontalAlignment" Value="Stretch" /><Setter Property="HorizontalContentAlignment" Value="Center" /><Setter Property="Height" Value="Auto" /><Setter Property="Width" Value="Auto" /><Setter Property="FontSize" Value="30" /><Setter Property="FontWeight" Value="Bold" /></Style>

4.效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/911931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF中Converter基础用法

IValueConverter 1.创建一个类集成接口IValueConverter,并实现 2在xaml中引入 举例 性别用int来表示&#xff0c;1为男&#xff0c;2为女 核心代码 创建GenderConverter继承IValueConverter public class GenderConverter : IValueConverter {//model->view转换public…

Postgresql的json充当字典应用

一般我们会将一些系统参数放到参数表中&#xff0c;有些参数的值是json结构&#xff0c;那么如何在查询时引用这些参数&#xff1f;&#xff1f; 比如我在业务表的的xxx_type,或xxx_status记录的是key,又想在查询的时候显示其描述。 先定义字典 如下图如何应用 Postgresql对j…

Dify全面升级:打造极致智能应用开发体验,携手奇墨科技共拓AI新生态

智能应用开发平台Dify以六大核心功能升级与深度性能优化&#xff0c;重新定义AI开发效率与体验。本次更新不仅响应了开发者社区的迫切需求&#xff0c;更通过与云计算领域先锋奇墨科技的战略合作&#xff0c;为企业提供了从开发到部署的全链路智能化解决方案。 .技术领先&#…

关于uniapp开发阻止事件冒泡问题

背景。uniapp开发微信小程序。在使用两个组件拼接嵌套使用后&#xff0c;发现问题&#xff0c;会误操作跳转到更多页面。下图中两个事件若不使用stop修饰符&#xff0c;会相互影响。若点击uni-list-item会串行触发uni-card的handledoctorlist方法。 产生上面问题原因是组件之间…

箭头函数和普通函数的区别?

箭头函数&#xff08;Arrow Functions&#xff09;和普通函数&#xff08;传统函数&#xff09;在 JavaScript 中有显著的区别&#xff0c;主要体现在语法、this 的绑定、构造函数行为、参数处理等方面。以下是详细对比&#xff1a; 1. 语法差异 普通函数&#xff1a; functio…

Linux系统日志与守护进程开发实战指南

Linux系统日志与守护进程开发实战指南 系统日志与守护进程 ├── 系统日志syslog │ ├── 日志路径: /var/log/syslog │ └── 核心API │ ├── openlog │ ├── syslog │ └── closelog └── 守护进程daemon└── 创建步骤├── um…

Vue.js 过滤器详解

Vue.js 过滤器详解 下面我将详细讲解Vue.js中过滤器的语法和使用注意事项&#xff0c;并提供一个完整的演示页面。 过滤器基本概念 在Vue.js中&#xff0c;过滤器&#xff08;Filters&#xff09; 是用于文本格式化的功能&#xff0c;可以在双花括号插值和v-bind表达式中使用…

【iOS】iOS崩溃总结

【iOS】iOS崩溃总结 一、前言 之前写了一篇博文《【Flutter】程序报错导致的灰屏总结》&#xff0c;浏览量、收藏率和点赞量还挺高&#xff0c;还被收录了&#xff0c;就想着总结一下iOS崩溃&#xff0c;这个也是在iOS面试中经常被问到的。 在 iOS 开发过程中&#xff0c;导致…

机器学习:特征向量与数据维数概念

特征向量与数据维数概念 一、特征向量与维数的定义 特征向量与特征类别 在机器学习和数据处理中&#xff0c;每个样本通常由多个特征&#xff08;Feature&#xff09; 描述。例如&#xff0c;一张图片的特征可能包括颜色、形状、纹理等&#xff1b;一个客户的特征可能包括年龄…

开发基于Jeston Orin Nx 开发版 16G的实现

一、基本配置 1.配置参数 密码&#xff1a;yahboom Ubuntu 20.04版本、python3.8、CUDA11.4、cuDNN8.6、TensorRT8.5、Jetpack5.1.1、Opencv4.5.4版本 终端输入命令&#xff1a;sudo jtop 其中Jetpack是英伟达提供的专门供它自己的嵌入式计算机平台使用的人工智能包。 终…

【技术分享】XR技术体系浅析:VR、AR与MR的区别、联系与应用实践

XR技术体系浅析&#xff1a;VR、AR与MR的区别、联系与应用实践 作者&#xff1a;EQ 雪梨蛋花汤 本文是技术分享文档&#xff0c;浅析VR&#xff08;虚拟现实&#xff09;、AR&#xff08;增强现实&#xff09;、MR&#xff08;混合现实&#xff09;的定义、特性、技术演进路线&…

R语言入门课| 05 一文掌握R语言常见数据类型

视频教程 大家可以先做一做R语言基础小测验&#xff0c;看看自己是否需要跟我们5.5h入门R语言的课程。 先上教程视频&#xff0c;B站同步播出&#xff1a; https://www.bilibili.com/video/BV1miNVeWEkw 完整视频回放和答疑服务可见&#xff1a;5.5h入门R语言 本节课程视频…

vRDMA 发布,助力云上 VPC 内高性能通信

资料来源&#xff1a;火山引擎-开发者社区 近日&#xff0c;火山引擎基于部分云服务器实例规格邀测发布 vRDMA 特性&#xff0c;提供云上 VPC 内大规模 RDMA 加速能力&#xff0c;可兼容传统 HPC 应用、AI 应用以及传统 TCP/IP 应用&#xff0c;降低大众化场景的适配门槛&#…

Win10安装dify

一、win10虚拟化设置&#xff0c;控制面板中开启如下三个服务 二、检查确认wls服务开启 设置自动启动并启动 确认服务开启 bcdedit 是否为auto&#xff0c;如果不是&#xff0c;设置为auto bcdedit /set hypervisorlaunchtype autocpu是否为虚拟化 更新wsl wsl --update二 …

【ai学习笔记】GitLab

CI/CD&#xff08;持续集成/持续交付&#xff09;是现代软件开发中的关键实践&#xff0c;通过自动化工具可以大幅提升开发效率和软件质量。下面为你介绍CI/CD的核心概念、常用工具以及示例配置&#xff1a; 1. CI/CD 核心概念 持续集成&#xff08;CI&#xff09;&#xff1…

Solidity 从 0 到 1 |Web3 开发入门免费共学营

开启你的 Web3 开发之旅&#xff0c;从 Sonic 开始&#xff01; 想进入区块链开发的世界&#xff0c;却不知道从哪里开始&#xff1f;选择对的语言和平台&#xff0c;才能事半功倍。 Solidity 是 Web3 中最主流、最通用的智能合约开发语言&#xff0c;被广泛应用于以太坊及其…

【unitrix】 4.4 类型级整数比较系统(cmp.rs)

一、源码 这段代码实现了一个类型级别的整数比较系统&#xff0c;允许在编译时进行整数比较操作。它定义了一套类型来表示比较结果&#xff0c;并为不同类型的整数实现了比较逻辑。 use core::cmp::Ordering; use core::default::Default; use crate::sealed::Sealed; use cr…

2025年渗透测试面试题总结-2025年HW(护网面试) 14(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 1. SQL注入原理 &#x1f4a5; 2. XXE攻击&#xff08;XML外部实体注入&#xff09; &#x1f9e9; 3. SQ…

Android开发根据滑动距离标题栏进行渐变

Android开发根据滑动距离标题栏进行渐变 假设滑动控件是NestedScrollView。 先监听NestedScrollView的滑动距离&#xff1a; nslv_preview_me.setOnScrollChangeListener(object :NestedScrollView.OnScrollChangeListener{override fun onScrollChange(v: NestedScrollView…

高中成绩可视化平台开发笔记

高中成绩可视化平台&#xff08;1&#xff09; 一、项目概述 本系统是一个基于 PyQt5 和 Matplotlib 的高中成绩数据可视化分析平台&#xff0c;旨在帮助教师快速了解学生成绩分布、班级对比、学科表现等关键指标。平台支持文科与理科的数据切换&#xff0c;并提供多个维度的图…