MaskedTextBox 强制使用大写字符

MaskedTextBox Enforce UpperCase Characters

我正在使用 Telerik 的 RadMaskedTextBox 并尝试创建一个掩码,使其遵循加拿大邮政编码模板。

模板如下 Letter Number Letter Number Letter Number

示例邮政编码 T4R1U8

目前我的掩码是 Mask="L#L #L#" 但这允许大写和小写字母。我正在尝试使用它,以便可以输入大写字母,也可以输入小写字母,但小写字母会立即变为大写字母。

我已经尝试了两种解决方案,它们非常接近但不是最终的解决方案。

第一个是在视图模型方面解决这个问题

public string PostalCode
{
    get {return postalCode;}
    set
    {
        postalCode = value;
        postalCode = postalCode.ToUpper();
        OnPropertyChanged("PostalCode");
    }
}

在这种方法中,值将更改为上限,但键入索引会移动到 MaskTextBox 的前面,而不是始终保留在键入的字符之后。

我采用的第二种方法效果很好,但不允许我输入小写字符。我最终使用了 CustomToken。 '*' 是我的自定义标记字符,所以我的新掩码是 Mask="*#* #*#"

public class CustomToken : ITokenValidationRule
{
    #region ITokenValidationRule Members

    public bool IsRequired
    {
        get { return false; }
    }

    public bool IsValid(char ch)
    {
        return ValidChars.Contains(ch);
    }

    public char Token
    {
        get { return '*'; }
    }

    public TokenTypes Type
    {
        get { return TokenTypes.AlphaNumeric; }
    }

    private string myValidChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public string ValidChars
    {
        get { return myValidChars; }
    }

    #endregion
}

如有任何提示,我们将不胜感激。

有一个与此类似的问题here

解决办法是用SelectionStart把Caret放在最后,eg:

Dispatcher.BeginInvoke(() =>
{
    if (txtPOCode.MaskedText != null)
    {
        txtPOCode.MaskedText = txtPOCode.MaskedText.ToUpper();
        txtPOCode.SelectionStart = txtPOCode.MaskedText.Length;
        txtPOCode.Focus();
    }
});

我不确定你想在这里完成什么。

如果你想在字母上输入大写字母,那么你是否尝试过将字体设置为字符大小写

TextBox1.CharacterCasing = CharacterCasing.Upper;

或者在窗体的属性上设置它,因为它可能需要放在按键事件后面。

或者在Element中设置为"Upper" in xaml

<TextBox CharacterCasing="Upper"/>

您可以使用 ValueConverter 或 MarkupConverter。

[MarkupExtensionReturnType(typeof(IValueConverter))]
public class ToUpperConverter : MarkupConverter
{
    private static ToUpperConverter _instance;

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static ToUpperConverter()
    {
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return _instance ?? (_instance = new ToUpperConverter());
    }

    protected override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var val = value as string;
        return val != null ? val.ToUpper() : value;
    }

    protected override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

使用 Telerik RadMaskedTextInput 控件时,格式标记存在限制,因此您需要使用数字语法而不是文字语法来声明掩码。例如,在使用格式化标记时,掩码 "LLL" 应该像 "L3" 一样使用。在您的情况下,您将使用 L1 和 d1 令牌,无论您使用的是 WinForms 还是 WPF(您没有指定是哪个),邮政编码的掩码应该是:

<telerik:RadMaskedTextInput Mask="&gt;L1d1&gt;L1 d1&gt;L1d1"/>

“>”大小写字符执行大写转换。

要在 MaskedTextBox 控件中强制使用大写字符,请将“>”字符添加到掩码字符串的开头。

示例:对于 CD Key 输入掩码,其中 CD Key 将有 5 组 4 letters/numbers 由短划线分隔并且您希望它全部大写,然后将掩码设置为: “>AAAA-AAAA-AAAA-AAAA-AAAA”。

在运行时,前导“>”不会出现在 MaskedTextBox 的占位符文本中。

文本框将仅显示下划线和破折号,如下所示: [____ - ____ - ____ - ____ - ____]

所有输入的字符都将转换为大写,并且只允许输入 letters/numbers。

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.maskedtextbox.mask?view=net-5.0