RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 984072
Accepted
JDo
JDo
Asked:2020-05-22 03:39:52 +0000 UTC2020-05-22 03:39:52 +0000 UTC 2020-05-22 03:39:52 +0000 UTC

替换文本框中的字符以输入密码 C# WPF MVVM

  • 772

历史上发生过这样的情况,必须使用文本框来输入用户名和密码。如何正确组织密码文本字段中的字符替换。我草拟了代码。

public class TextToPasswordCharConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var str = new string('*', value?.ToString().Length ?? 0);
        return str;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        //throw new NotImplementedException();
        return new object();
    }
}

视图模型中的密码属性

public string PasswordField
    {
        get => passwordValue;
        set
        {
            passwordValue = value;
            OnPropertyChanged();
        }
    }

观察者

 public abstract class NotificationObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    protected void SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
    {
        if (!EqualityComparer<T>.Default.Equals(field, value))
        {
            field = value;
            OnPropertyChanged(propertyName);
        }
    }
}

标记

    <TextBox Grid.Row="0" Grid.Column="0" TextWrapping="Wrap" Margin="140,174,30,10">
        <TextBox.Text>
            <Binding Path="PasswordField" ValidatesOnDataErrors="True" Converter="{StaticResource TextToPasswordCharConverter}" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <ExceptionValidationRule />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>

该代码有效,但问题是我不知道如何正确实现转换器。现在,当输入一个字符时,他在字段“ ”中一次写了 13 个字符,并且无法使用退格键删除它们。输入字符时,必须始终在文本字段中打印字符“ ”,并具有擦除它的能力。

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    JDo
    2020-05-22T16:59:16Z2020-05-22T16:59:16Z

    让它更容易一些。下载字体 passdot.ttf。我将它添加到应用程序资源中,在标记中连接它,

    FontFamily="pack://application:,,,/Resources/#password"
    

    我禁止复制、剪切和粘贴的地方。

      <TextBox Grid.Row="0" Grid.Column="0" VerticalContentAlignment="Center" 
                 TextWrapping="Wrap" Margin="140,174,30,10" 
                 FontFamily="pack://application:,,,/Resources/#password"
                 CommandManager.PreviewExecuted="OnPreviewExecuted"
                 ContextMenu="{x:Null}">
            <TextBox.Text>
                <Binding Path="PasswordField" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>
                        <ExceptionValidationRule />
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
            <TextBox.InputBindings>
                <!--Disable CTRL+C -->
                <KeyBinding Command="ApplicationCommands.NotACommand"
                            Key="C"
                            Modifiers="Control" />
            </TextBox.InputBindings>
        </TextBox>
    

    到目前为止,为了测试,我已经在视图中抛出了一个事件,之后我将用命令替换它。

    /// <summary>
        ///     Forbid Copy, Cut, Paste
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnPreviewExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            if (e.Command == ApplicationCommands.Copy ||
                e.Command == ApplicationCommands.Cut ||
                e.Command == ApplicationCommands.Paste)
                e.Handled = true;
        }
    

    我还没有打扰密码框。接下来,我将对字段中的字符串进行哈希处理。什么不会将文本存储在内存中。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5