MaskedTextBox强制使用UpperCase字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MaskedTextBox强制使用UpperCase字符相关的知识,希望对你有一定的参考价值。

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

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

示例邮政编码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
}

任何提示将非常感谢。

答案

这个here也有类似的问题。

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

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

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

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

TextBox1.CharacterCasing = CharacterCasing.Upper;

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

或者在元素中将其设置为xaml中的“Upper”

<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强制使用UpperCase字符的主要内容,如果未能解决你的问题,请参考以下文章

Windows 窗体:无法单击以聚焦非***窗体中的 MaskedTextBox

C# 公共控件之maskedTextBox

如何从 kendo maskedtextbox mvvm 值绑定中删除提示字符

Vue.js 自定义过滤器

winform公共控件

选项卡关闭控制绕过验证 .NET