MaskedTextBox强制使用UpperCase字符

时间:2017-04-07 14:13:37

标签: c# mvvm telerik

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

模板如下字母编号字母编号字母编号

示例邮政编码T4R1U8

目前我的面具是Mask="L#L #L#"但是这允许大写和小写字母。我试图让它可以输入大写字母并且可以输入小写但小写字母会立即变为高位。

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

第一个是在viewmodel端解决这个问题

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
}

任何提示都将不胜感激。

5 个答案:

答案 0 :(得分:1)

对此here也有类似的问题。

解决方案是使用SelectionStart在最后设置Caret,例如:

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

答案 1 :(得分:1)

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

示例:对于 CD 密钥输入掩码,其中 CD 密钥将有 5 组 4 个字母/数字,以破折号分隔,并且您希望它全部大写,然后将掩码设置为: ">AAAA-AAAA-AAAA-AAAA-AAAA"。

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

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

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

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

答案 2 :(得分:0)

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

如果您想要在字母上键入大写字母,那么您是否尝试将字体设置为字符

TextBox1.CharacterCasing = CharacterCasing.Upper;

或者将其设置在表单上的属性中,因为可能需要将其置于按键事件后面。

或者将元素设置为" Upper"在xaml

<TextBox CharacterCasing="Upper"/>

答案 3 :(得分:0)

您可以使用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;
    }
}

答案 4 :(得分:0)

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

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

“&gt;”套管字符执行转换为大写。