我正在使用Telerik的RadMaskedTextBox,我正在尝试创建一个Mask,使其遵循加拿大邮政编码模板。
模板如下 字母编号 字母编号 字母编号
邮政编码示例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
}
任何提示将不胜感激。
这里有一个类似的问题。
解决方案是使用 SelectionStart 在末尾设置插入符号,例如:
Dispatcher.BeginInvoke(() =>
{
if (txtPOCode.MaskedText != null)
{
txtPOCode.MaskedText = txtPOCode.MaskedText.ToUpper();
txtPOCode.SelectionStart = txtPOCode.MaskedText.Length;
txtPOCode.Focus();
}
});
若要在 MaskedTextBox 控件中强制使用大写字符,请在掩码字符串的开头添加">"字符。
示例:对于 CD 密钥条目掩码,其中 CD 密钥将有 5 组,每组 4 个字母/数字,用破折号分隔,并且您希望全部大写,然后将掩码设置为: ">啊
前导">"不会在运行时出现在掩蔽文本框的占位符文本中。
文本框将仅显示下划线和短划线,如下所示: [____ - ____ - ____ - ____ - ____]
所有输入的字符都将转换为大写,并且只允许在条目中使用字母/数字。
https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.maskedtextbox.mask?view=net-5.0
我不确定你想在这里完成什么。
如果您想在字母上键入大写的内容,那么您是否尝试过将字体设置为字符大小写
文本框1.字符大小写 = 字符大小写.上部;
或者将其设置在窗体上的属性上,因为可能需要将其放在按键事件后面。
或者在 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=">L1d1>L1 d1>L1d1"/>
">"大小写字符执行转换为大写。