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.pswp.cn/news/911931.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/911931.shtml
英文地址,請注明出處:http://en.pswp.cn/news/911931.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋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;并提供多個維度的圖…