密码框在WPF中的使用

因为安全问题密码框本身不支持MVVM,所以需要附加属性类完成

附加属性---》密码框

密码框---》附加属性

 

添加附加属性

1 、创建附加属性

  /// <summary>
    /// 密码框帮助类 通过附加属性实现
    /// </summary>
    public static class C_PasswordBoxHelper
    {

        //附加行为来实现 PasswordBox 的绑定。
        //    这通常涉及为 PasswordBox 创建一个附加行为,该行为可以监听 PasswordBox
        //    的 PasswordChanged 事件,并通过事件处理器将其值传递给 ViewModel。

        public static readonly DependencyProperty PasswordProperty =
            DependencyProperty.RegisterAttached("Password", //这个跟PasswordProperty 去掉属性
                typeof(string),
                typeof(C_PasswordBoxHelper),
                new PropertyMetadata(string.Empty, OnPasswordPropertyChanged));

        public static string GetPassword(DependencyObject obj)
        {
            return (string)obj.GetValue(PasswordProperty);
        }

        public static void SetPassword(DependencyObject obj, string value)
        {
            obj.SetValue(PasswordProperty, value);
        }
        /// <summary>
        /// 附加属性发送改变时候  
        /// </summary>
        /// <param name="d"></param>
        /// <param name="e"></param>
        public static void OnPasswordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            if (sender is PasswordBox)
            {
                PasswordBox password = (PasswordBox)sender;
                //可以在OnPasswordPropertyChanged方法中添加一个判断,
                //    只有当密码框的密码与新的属性值不同时,才将密码框的密码设置为新的属性值。
                //    这样可以避免在每次输入字符时重新设置密码,从而保持光标的位置不变。
                //    通过添加这个判断,只有在密码框的密码与新的属性值不同时,才会将密码框的密码设置为新的属性值,从而避免光标跳到第一个字符前面的问题。
                if (password.Password != e.NewValue?.ToString())// 初始化时候才会走到下面逻辑,平时更改都不会走到这个逻辑
                {
                    password.PasswordChanged -= PasswordBox_PasswordChanged;
                    password.PasswordChanged += PasswordBox_PasswordChanged;
                    password.Password = e.NewValue?.ToString();
                }
            }
        }
        private static void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
        {
            if (sender is PasswordBox)
            {
                PasswordBox password = (PasswordBox)sender;
                SetPassword(password, password.Password);
            }
        }
    }

  

2 、在绑定的页面添加普通密码属性

    private string mPwd;
        /// <summary>
        /// 登录密码
        /// </summary>
        public string Pwd
        {
            get { return mPwd; }
            set { mPwd = value; RaisePropertyChanged(); }
        }

  

3  、 使用

  <!--密码-->
                <PasswordBox  
                                Margin="20,0"
                             local:C_PasswordBoxHelper.Password="{Binding  Pwd,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                             FontSize="16" Foreground="#555" Height="40"  Grid.Row="1">
                    <PasswordBox.InputBindings>
                        <KeyBinding  Key="Enter" Command="{Binding LoginClick}" CommandParameter="{Binding ElementName=wlogin}" />
                    </PasswordBox.InputBindings>
                </PasswordBox>

  这样就实现了MVVM 中密码框的运用

 

posted @ 2024-06-19 15:05  陌念  阅读(30)  评论(0)    收藏  举报