为WPF编写特殊屏蔽文本框

为WPF编写特殊屏蔽文本框,wpf,custom-controls,Wpf,Custom Controls,我想在WPF中开发一个自定义用户控件,它有一些掩码。此功能非常类似于许多在线应用程序中提供的功能,在这些应用程序中,您可以输入信用卡号,下次登录您的帐户时,您只能看到卡号的最后一位数字(类似于***4587)但是,当我以这种方式显示数据时,我希望保持实际值不变,以便在绑定中访问完整数据。您可以尝试以下方法: string originalNumber = textBoxOriginalNumber.Text; int numberOfDigits = textBoxOriginalNumber.

我想在WPF中开发一个自定义用户控件,它有一些掩码。此功能非常类似于许多在线应用程序中提供的功能,在这些应用程序中,您可以输入信用卡号,下次登录您的帐户时,您只能看到卡号的最后一位数字(类似于***4587)但是,当我以这种方式显示数据时,我希望保持实际值不变,以便在绑定中访问完整数据。

您可以尝试以下方法:

string originalNumber = textBoxOriginalNumber.Text;
int numberOfDigits = textBoxOriginalNumber.Text.Length;
string hidden = new String('*', numberOfDigits-4);
textBoxModifiedNumber.Text = hidden + originalNumber.Remove(0, numberOfDigits-4);
这不是一个优雅的解决方案,但如果其他人给你一个更好的解决方案,它将帮助你。基本上,它取原始信用卡号,计算它有多少个数字,删除“n-4”第一个数字,然后显示*符号“n-4”乘以最后四个数字。无论原始数字有多少位数,这都将起作用


此外,我不确定掩码(或下面其他用户建议的正则表达式)是否有效,因为(如果我理解得很好的话)它将替换整数,而不是显示最后4位数字。

您可以尝试以下方法:

string originalNumber = textBoxOriginalNumber.Text;
int numberOfDigits = textBoxOriginalNumber.Text.Length;
string hidden = new String('*', numberOfDigits-4);
textBoxModifiedNumber.Text = hidden + originalNumber.Remove(0, numberOfDigits-4);
这不是一个优雅的解决方案,但如果其他人给你一个更好的解决方案,它将帮助你。基本上,它取原始信用卡号,计算它有多少个数字,删除“n-4”第一个数字,然后显示*符号“n-4”乘以最后四个数字。无论原始数字有多少位数,这都将起作用

此外,我不确定掩码(或下面其他用户建议的正则表达式)是否有效,因为(如果我理解得很好的话)它将替换整数,而不是显示最后4位数字。

您可以使用with\d来表示数字

i、 e

或者,如果要更新除最后一组之外的整个数字集

@"\d{4}-"
您可以使用with\d来表示数字

i、 e

或者,如果要更新除最后一组之外的整个数字集

@"\d{4}-"

好的,这是我解决这个问题的方法。在处理了卡号之后,我还想处理ID和SN号,所以我只写了一个小方法,它接受字符串并在这里返回屏蔽值,以防有人需要这个特性

    public static string GetMaskedNumber(string unsecuredNumber, char maskChar)
    {
        return unsecuredNumber.Substring(unsecuredNumber.Length - 4)
                     .PadLeft(unsecuredNumber.Length - 6, ' ')
                     .PadLeft(unsecuredNumber.Length, maskChar);
    }

好的,这是我解决这个问题的方法。在处理了卡号之后,我还想处理ID和SN号,所以我只写了一个小方法,它接受字符串并在这里返回屏蔽值,以防有人需要这个特性

    public static string GetMaskedNumber(string unsecuredNumber, char maskChar)
    {
        return unsecuredNumber.Substring(unsecuredNumber.Length - 4)
                     .PadLeft(unsecuredNumber.Length - 6, ' ')
                     .PadLeft(unsecuredNumber.Length, maskChar);
    }

这不是一个优雅的解决方案,我同意我们也应该注意到,VISA卡弧度长度为16位,但也有15位的信用卡长度,因此此解决方案不会起作用,因为它引入了额外的变量。这还不错,但有更好的解决方案吗?例如,使用口罩?我根据您的评论修改了我的答案。这不是一个优雅的解决方案。我同意我们还应该注意,VISA卡弧度长度为16位,但信用卡长度也为15位,因此此解决方案不会起作用,因为它引入了额外的变量。这还不错,但有更好的解决方案吗?例如,使用掩码?我根据您的评论修改了我的答案。我认为这是一个非常好的起点,但它将替换所有数字,并且不会留下最后4位可见。我认为应该创建附加属性并将其绑定到ViewModels CardNumber属性或。我理解这不是一个好的安全点,所以我理解这不是一个好的安全点,所以我理解这不是一个好的安全点,我理解这不是一个好的安全点,所以我理解这不是一个好的安全点,所以我想我会在类内创建私有变量,在类内创建私有变量,在类内创建私有变量,保持实数在那里,在它的公共获取者上,在它的公共上,我会返回格式化的数字,在它的数字,在其公共获取其公共获取其公共获取其公共获取其公共获取其上,我会返回格式化数字,我会返回格式化数字,像像像,如\35周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五\\35\35周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五###`number.Substring(number.Length-4).PadLeft(number.Length,'*')`更新了除tge last group Matcher之外的所有数字,现在更好了,但它不允许在每4个符号之间出现-因此必须有额外的步骤。我在下面提供了我自己的版本,请看一下并告诉我你的想法。我认为这确实是一个很好的起点,但它将替换所有数字,并且不会留下最后4位可见的数字。我认为应该创建附加属性并将其绑定到ViewModels CardNumber属性或。我理解这不是一个好的安全点,所以我理解这不是一个好的安全点,所以我理解这不是一个好的安全点,我理解这不是一个好的安全点,所以我理解这不是一个好的安全点,所以我想我会在类内创建私有变量,在类内创建私有变量,在类内创建私有变量,保持实数在那里,在它的公共获取者上,在它的公共上,我会返回格式化的数字,在它的数字,在其公共获取其公共获取其公共获取其公共获取其公共获取其上,我会返回格式化数字,我会返回格式化数字,像像像,如\35周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五\\35\35周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五###`number.Substring(number.Length-4).PadLeft(number.Length,'*')`更新了除tge last group Matcher之外的所有数字,现在更好了,但它不允许在每4个符号之间出现-因此必须有额外的步骤。我在下面提供了我自己的版本,请看一下并告诉我你的想法。