WPF密碼輸入框明文掩碼切換

1,效果

?

2,代碼:

????????WPF的PasswordBox不能像Winform中的PasswordBox那樣,通過PasswordBox.PasswordChar=(char)0顯示明文。所以這里使用無外觀控件構筑掩碼明文切換。

無外觀控件遵守Themes/Generic.xaml文件配置.

<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:StudentInfoManagerWPF"><Style TargetType="{x:Type local:PasswordBoxExt}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type local:PasswordBoxExt}"><Grid><PasswordBox  x:Name="Part_Pwd"  VerticalContentAlignment="Center" Padding="0,0,30,0"  PasswordChar="{TemplateBinding PasswordChar}"></PasswordBox><TextBox x:Name="Part_TxtBox" VerticalContentAlignment="Center" Padding="0,0,30,0" Visibility="Collapsed" Text="{Binding RelativeSource={RelativeSource  Mode=FindAncestor,   AncestorType=local:PasswordBoxExt, AncestorLevel=1}, Path=Password}"></TextBox><ToggleButton x:Name="Part_Toggle"  HorizontalAlignment="Right" MaxWidth="30" ><ToggleButton.Template><ControlTemplate TargetType="ToggleButton"><Grid><Image x:Name="Part_ImgShow" Source="/icon/1.png" Visibility="Collapsed"></Image><Image x:Name="Part_ImgHide" Source="/Icon/2.png" Visibility="Visible"></Image></Grid><ControlTemplate.Triggers ><Trigger Property="IsChecked" Value="true"><Setter Property="Visibility" Value="Visible" TargetName="Part_ImgShow"></Setter><Setter Property="Visibility" Value="Collapsed" TargetName="Part_ImgHide"></Setter></Trigger></ControlTemplate.Triggers></ControlTemplate></ToggleButton.Template></ToggleButton></Grid><ControlTemplate.Triggers><Trigger SourceName="Part_Toggle" Property="IsChecked" Value="true"><Setter TargetName="Part_TxtBox" Property="Visibility" Value="Visible"></Setter></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style>
</ResourceDictionary>
public class PasswordBoxExt : Control{public static readonly DependencyProperty PasswordProperty;public static readonly DependencyProperty PasswordCharProperty;PasswordBox passwordBox;static PasswordBoxExt(){DefaultStyleKeyProperty.OverrideMetadata(typeof(PasswordBoxExt), new FrameworkPropertyMetadata(typeof(PasswordBoxExt)));PasswordProperty = DependencyProperty.Register("Password", typeof(string), typeof(PasswordBoxExt),new PropertyMetadata(new PropertyChangedCallback(PasswordPropertyChanged)));PasswordCharProperty = DependencyProperty.Register("PasswordChar", typeof(char), typeof(PasswordBoxExt), new PropertyMetadata('*'));}private static void PasswordPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){//如此每次變化均導致passwordbox被重新覆蓋新值,致使光標每次置于字符串首位而不是字符串末尾//if( (d as PasswordBoxExt).passwordBox != null)// {//     (d as PasswordBoxExt).passwordBox.Password = e.NewValue.ToString();// }}/// <summary>/// 密碼/// </summary>public string Password{get{return (string)GetValue(PasswordProperty);}set{SetValue(PasswordProperty, value);}}/// <summary>/// 掩碼字符/// </summary>public char PasswordChar{get{return (char)GetValue(PasswordCharProperty);}set{SetValue(PasswordCharProperty, value);}}public override void OnApplyTemplate(){base.OnApplyTemplate();passwordBox=  this.GetTemplateChild("Part_Pwd") as PasswordBox;ToggleButton btn = this.GetTemplateChild("Part_Toggle") as ToggleButton;if (passwordBox != null){passwordBox.PasswordChanged += Pwdbox_PasswordChanged;}if (btn != null){btn.Click += Btn_Click;}}private void Btn_Click(object sender, RoutedEventArgs e){if((sender as ToggleButton).IsChecked == false){passwordBox.Password = Password;}}private void Pwdbox_PasswordChanged(object sender, RoutedEventArgs e){if(sender is PasswordBox){Password = (sender as PasswordBox).Password;}}}

添加自定義控件

<DockPanel  Grid.Row="2" Grid.Column="1"  VerticalAlignment="Center"><TextBlock Text="密碼:"  DockPanel.Dock="Left"   FontSize="16"></TextBlock><local:PasswordBoxExt x:Name="pwd01" PasswordChar="#" DockPanel.Dock="Right"  MinHeight="30" Margin="10,0,0,0"></local:PasswordBoxExt></DockPanel>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15140.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15140.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15140.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

視覺檢測實戰項目——九點標定

本文介紹九點標定方法 已知 9 個點的圖像坐標和對應的機械坐標,直接計算轉換矩陣,核心原理即最小二乘擬合 {??′=????+????+????′=??′??+??′??+??′ [??1??11??2??21?????9??91][????′????′????′]=[??1′??…

[Linux]磁盤管理

一.Linux磁盤管理的原理 磁盤分區與Linux的目錄是借助"掛載機制"鏈接的&#xff0c;將一個分區與一個目錄連接起來。訪問目錄&#xff0c;相當于訪問某塊分區 lsblk命令: lsblk命令可以查看磁盤分區&#xff0c;以及每個分區所掛載的目錄 lsblk -f 可以查看更細節的…

山東大學軟件學院項目實訓-創新實訓-基于大模型的旅游平臺(十九)- JUC(5)

synchronized優化原理 輕量級鎖 如果一個對象有多個線程訪問&#xff0c;但多線程訪問的時間是錯開的&#xff08;沒有競爭&#xff09;&#xff0c;可以用輕量級鎖優化 Slf4j(topic "c.ExerciseTransfer")public class Test {?static final Object obj new Obj…

關于陽光雨露外派聯想的面試感想

最近在找工作&#xff0c;接到了一個陽光雨露外派聯想的面試邀請。說實在的一開始就有不對勁的感覺。想必這就是大廠的自信吧&#xff0c;上就問能不能現場面試&#xff0c;然后直接發面試邀請。這時候我倒是沒覺得有啥問題。 然后今天就去面試去了&#xff0c;住的比較偏&…

【研發日記】【策劃向】(一)游戲策劃其實就是一道加減法題

文章目錄 序設計的過程其實是控制自己欲望的過程我海納百川&#xff0c;你要不要看看&#xff1f;我跟別人不一樣&#xff01;我的人設就是沒有人設&#xff0c;或者說任何人設都是我的人設 記 序 不知不覺進入這個行業幾年了&#xff0c;也經歷了獨立開發和團隊開發的過程。在…

欣賞倪詩韻青桐斷紋古琴很罕見:萬中無一。

欣賞倪詩韻青桐斷紋古琴很罕見&#xff1a;萬中無一。龍池側簽海門倪詩韻制&#xff0c;帶收藏證書此琴斷紋優美如江面波光粼粼&#xff0c;為流水蛇腹斷&#xff0c;是倪老師作品精品中的精品。細心的朋友可以看出倪老師在這張琴上題字非常小心認真。用一個詞來形容——萬中無…

CPython3.7.9源碼學習一:C語言基礎、整數對象

C 語言基礎 結構體 // struct(關鍵字) 名稱 {結構體成員};// 定義結構體 struct Student { char name[50]; int age; float score; };// 初始化 結構體變量 struct Student stu1; strcpy(stu1.name, "張三"); stu1.age 20; stu1.score 90.5;// 初始化 …

Spring Boot線程池的 使用

一.異步方法 1.啟動類加EnableAsync注解 2.在需要異步執行的方法上添加Async注解 3.直接調用 結論&#xff1a;異步方法是通過SpringBoot中自動注入的線程池任務執行器實現的 二.自定義線程池 1.創建線程的配置類 2.使用Async注解時指定名稱 3.結論 手動注入多個線程池任務執…

Java 18新特性

Java 18引入了一系列新的特性和改進&#xff0c;這些更新覆蓋了從基本語言構造到更高級別的API等多個方面。以下是一些Java 18的主要新特性&#xff1a; 模式匹配增強&#xff1a;Java 18改進了模式匹配功能&#xff0c;使其更加強大和易于使用。開發人員可以使用模式匹配來簡…

Linux echo命令(在終端輸出文本)

文章目錄 Linux Echo命令深度解析簡介命令語法常見選項- -n&#xff1a;不輸出行尾的換行符&#xff0c;這意味著輸出后不會換到下一行。- -e&#xff1a;啟用反斜杠轉義的解釋&#xff0c;允許使用特殊字符。- -E&#xff1a;禁用反斜杠轉義的解釋&#xff08;默認選項&#x…

基于地理坐標的高階幾何編輯工具算法(2)——相交面裁剪

文章目錄 工具步驟應用場景算法輸入算法輸出算法示意圖算法原理后處理 工具步驟 選中一個需要裁剪的面&#xff0c;點擊“相交面裁剪”工具&#xff0c;多選裁剪模板面&#xff0c;空格執行。 應用場景 常用于基于遙感影像的建筑物幾何面編輯。 算法輸入 一個待裁剪的面&a…

sqlserver的查詢(三)

目錄 10. group by(分組) 11. having(對分組后的信息過濾) 可能從這里開始&#xff0c;執行順序越來越顯得重要了&#xff01;&#xff01;&#xff01; 10. group by(分組) 這個查詢相比前面會有一些困難&#xff1b; 格式&#xff1a;group by 字段的集合&#xff1b; 功…

Java進階學習筆記8——單繼承、Object類、方法重寫

Java 是單繼承的&#xff0c;Java中的類不支持多繼承&#xff0c;但是支持多層繼承。 Object類是所有類的父類。 Java不支持多類繼承&#xff1a; Java支持多層繼承&#xff1a; 反證法&#xff1a; Object類&#xff1a; Object類是java所有類的祖宗類&#xff0c;我們寫的任…

AI爆文寫作:我一般不告訴別人的爆文玩法:如何100%抄襲10W+的爆文標題,讓你也篇篇爆款

有現成的10w擺在眼前我們要做的就是&#xff0c;100%抄標題&#xff0c;以及內容重述。 具體操作步驟&#xff1a; 找到適合自己賬號選題的10w(微信看一看或者頭條)100%抄爆文的標題將這篇文章喂給Al&#xff0c;讓AI分析文章的寫法和主題根據提煉出來的寫法和主題&#xff0…

使用魚香肉絲一鍵安裝重新安裝ROS后mavros節點報錯,.so文件不匹配

解決方案&#xff1a; 1、寫在mavros相關軟件&#xff0c;共卸載7個包 sudo apt-get remove ros-melodic-mav*2、重新安裝mavros&#xff0c;共安裝10個包 sudo apt-get remove ros-melodic-mav*

每日AIGC最新進展(10):符號音樂生成SYMPLEX、新型圖像編輯數據集ReasonPix2Pix、角色一致性插畫生成、高級的風格個性化擴散模型

Diffusion Models專欄文章匯總&#xff1a;入門與實戰 SYMPLEX: Controllable Symbolic Music Generation using Simplex Diffusion with Vocabulary Priors http://arxiv.org/abs/2405.12666v1 本文介紹了一種新的符號音樂生成方法&#xff0c;名為SYMPLEX&#xff0c;它基于…

pod 庫發布腳本

repo_tag.sh 文件 #!/bin/zsh# 私有庫名稱 #PODNAME${PWD##*/} PODNAME"LBHorizontalCenterLayout"function obtain_git_tag {# 類似 "s.version 0.0.1"VERSION_STRINGgrep -E s.version.* ${PODNAME}.podspecTAGtr -cd "[0-9.]" <<&…

使用 JavaParser 解析代碼

[自用] 如何判斷出 java 代碼文本中一個方法的輸入參數個數以及類型。用結構體數組存儲遍歷信息&#xff0c;最后用一個方法實現打印。可以使用第三方庫。 如果是一個語句如何判斷這個語句中的局部變量個數和類型。那么該怎么實現呢&#xff1f; 要判斷 Java 代碼文本中一個方…

【電源專題】什么是層間短路(Rare Short),如何檢測?

層間短路發生的原因 一般線圈類制品是以漆包線纏繞導磁材料制造而成,漆包線是指外層披覆一層薄薄絕緣漆的銅線。我們常見的線圈類制品有: 電源變壓器、 高壓變壓器、 Switching Power 變壓器、 通訊變壓器、 脈沖變壓器、 環型變壓器、 電力傳輸變壓器、 音頻傳輸變壓器、 電…

k8s pvc pending waiting for first consumer to be created before binding

動態創建PV失敗且提示waiting for first consumer to be created before binding 問題現象 使用WaitForFirstConsumer的StorageClass創建PV失敗&#xff0c;PVC Event提示persistentvolume-controller waiting for first consumer to be created before binding。 問題原因 PV…