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=">L1d1>L1 d1>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
我正在使用 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=">L1d1>L1 d1>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