当前位置: 首页 > web >正文

wpf 自定义密码文本框,并且可以双向绑定

<UserControl x:Class="项目.UcPassword"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:YouMin_MicroplateReader"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"xmlns:keyboard="clr-namespace:Hs.KeyBoard.WPF.Behavior;assembly=Hs.KeyBoard.WPF" ><UserControl.Resources><Style TargetType="CheckBox" x:Key="CheckBoxStyle"><Setter Property="HorizontalAlignment" Value="Right"></Setter><Setter Property="VerticalAlignment" Value="Center"></Setter><Setter Property="Margin" Value="0 0 5 0"></Setter><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="CheckBox"><Image Margin="0 0 5 0" Height="30" Width="30" Stretch="Fill" x:Name="Img" Source="pack://application:,,,/项目名称;component/Images/GrayWhite.png"/></ControlTemplate></Setter.Value></Setter></Style><Style TargetType="CheckBox" x:Key="LookStyle"><Setter Property="HorizontalAlignment" Value="Right"></Setter><Setter Property="VerticalAlignment" Value="Center"></Setter><Setter Property="Margin" Value="0 0 5 0"></Setter><Setter Property="Cursor" Value="Hand" /><Setter Property="IsChecked" Value="False" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type CheckBox}"><Image Margin="0 0 5 0" Height="50" Width="55" Stretch="Fill" x:Name="Img"/><ControlTemplate.Triggers><Trigger Property="IsEnabled" Value="false"><Setter Property="Opacity" Value="0.6"/></Trigger><Trigger Property="IsChecked" Value="True"><Setter TargetName="Img" Property="Source" Value="pack://application:,,,/项目名称;component/Images/Look.png" /></Trigger><Trigger Property="IsChecked" Value="False"><Setter TargetName="Img" Property="Source" Value="pack://application:,,,/项目名称;component/Images/UnLook.png" /></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style></UserControl.Resources><Border Background="#F3FAFF" BorderBrush="#FFFFFF" BorderThickness="3" Height="56" Width="500" ><Grid><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions><TextBox Background="Transparent" BorderThickness="0" VerticalContentAlignment="Center" Padding="5,0,0,0"Visibility="{Binding TbVisibility,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Mode=TwoWay}" Text="{Binding Password,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"><i:Interaction.Behaviors><keyboard:KeyboardBehavior /></i:Interaction.Behaviors></TextBox><PasswordBox Background="Transparent" BorderThickness="0" local:PasswordBoxHelper.Attach="True" Padding="5,0,0,0" VerticalContentAlignment="Center"Visibility="{Binding PwVisibility,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Mode=TwoWay}" local:PasswordBoxHelper.Password="{Binding Password,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"InputMethod.IsInputMethodEnabled="False"><i:Interaction.Behaviors><keyboard:KeyboardBehavior /></i:Interaction.Behaviors></PasswordBox><CheckBox Grid.Column="1" Style="{StaticResource CheckBoxStyle}"  Panel.ZIndex="999"IsChecked="{Binding IsCleared,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Mode=TwoWay}" Visibility ="{Binding ClearVisibility,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Mode=TwoWay}"/><CheckBox Grid.Column="2" Style="{StaticResource LookStyle}"  Panel.ZIndex="999"IsChecked="{Binding IsChecked,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Mode=TwoWay}"></CheckBox></Grid></Border>
</UserControl>

PasswordBoxHelper.cs

using System;
using System.Windows;
using System.Windows.Controls;namespace 项目名称
{public static class PasswordBoxHelper{public static readonly DependencyProperty PasswordProperty = DependencyProperty.RegisterAttached("Password", typeof(string), typeof(PasswordBoxHelper), new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));public static readonly DependencyProperty AttachProperty = DependencyProperty.RegisterAttached("Attach", typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(false, Attach));private static readonly DependencyProperty IsUpdatingProperty = DependencyProperty.RegisterAttached("IsUpdating", typeof(bool), typeof(PasswordBoxHelper));public static void SetAttach(DependencyObject dp, bool value){dp.SetValue(AttachProperty, value);}public static bool GetAttach(DependencyObject dp){return (bool)dp.GetValue(AttachProperty);}public static string GetPassword(DependencyObject dp){return (string)dp.GetValue(PasswordProperty);}public static void SetPassword(DependencyObject dp, string value){dp.SetValue(PasswordProperty, value);}private static bool GetIsUpdating(DependencyObject dp){return (bool)dp.GetValue(IsUpdatingProperty);}private static void SetIsUpdating(DependencyObject dp, bool value){dp.SetValue(IsUpdatingProperty, value);}private static void OnPasswordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e){if (sender is not PasswordBox passwordBox || passwordBox == null) { return; }try{passwordBox.PasswordChanged -= PasswordChanged;if (!(bool)GetIsUpdating(passwordBox)){passwordBox.Password = (string)e.NewValue;}passwordBox.PasswordChanged += PasswordChanged;}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}}private static void Attach(DependencyObject sender, DependencyPropertyChangedEventArgs e){if (sender is not PasswordBox passwordBox || passwordBox == null) { return; }try{if ((bool)e.OldValue){passwordBox.PasswordChanged -= PasswordChanged;}if ((bool)e.NewValue){passwordBox.PasswordChanged += PasswordChanged;}}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}}private static void PasswordChanged(object sender, RoutedEventArgs e){if (sender is not PasswordBox passwordBox || passwordBox == null) { return; }try{SetIsUpdating(passwordBox, true);SetPassword(passwordBox, passwordBox.Password);SetIsUpdating(passwordBox, false);}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}}}
}

调用

 xmlns:local="clr-namespace:项目名"           <local:UcPassword Password="{Binding Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="1" Panel.ZIndex="1" HorizontalAlignment="Left" Width="500" Height="56" />

ViewModel

  /// <summary>/// 密码/// </summary>[ObservableProperty]string _Password = string.Empty;


http://www.xdnf.cn/news/19980.html

相关文章:

  • 吱吱企业通讯软件以安全为核心,构建高效沟通与协作一体化平台
  • 什么是Agent?小白如何学习使用Agent?一篇文档带你详细了解神秘的Agent
  • 容器tomcat镜像制作
  • 算法题2:动态规划
  • Python委托迭代完全指南:从基础到高级设计模式实践
  • Vision Pro图像处理工具全解析
  • Hadoop HDFS-SecondaryNameNode(2nn)详细介绍
  • PPI网络与TF-miRNA调控网络的实现方法(基于《列腺癌研究.pdf》)
  • 跟做springboot尚品甄选项目
  • 理解用户需求
  • 第6章:垃圾回收分析与调优
  • Java内存模型解析:并发编程的基石
  • DARPA OFFSET公开资料探究
  • GEO优化专家孟庆涛:优质内容是GEO优化的核心
  • 后端一次性返回十万条数据时,前端需要采用多种性能优化策略来避免页面卡顿
  • 日志打印--idf的esp32
  • Agent开发基础---提示词编写
  • 【数据分享】土地利用矢量shp数据分享-北京
  • AI Agent重构SOC:下一代智能安全运营平台的能力跃迁
  • 产线自动化效率上不去?打破设备和平台的“数据孤岛”是关键!
  • LeetCode 面试题 16.06.最小差
  • JavaScript原型与原型链:对象的家族传承系统
  • Springboot3+SpringSecurity6Oauth2+vue3前后端分离认证授权-资源服务
  • 单片机键盘接口程序设计(汇编语言)
  • 血缘元数据采集开放标准:OpenLineage Guides 在 Airflow 中使用 OpenLineage Proxy
  • 快速在RK3588上部署运行DeepSeek-R1-Distill-Qwen-1.5B模型并进行板端推理调用流程记录
  • 重生之IOday4————多进程通信
  • Python学习笔记--使用Django修改和删除数据
  • Python学习笔记--使用Django查询数据
  • 网络协议之https?