2017-04-07 69 views
1

我正在使用Telerik的RadMaskedTextBox,並且我正在嘗試創建一個Mask,以便它將遵循加拿大郵政編碼模板。MaskedTextBox強制UpperCase字符

模板是遵循字母編號字母編號字母數

例郵政編碼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 
} 

任何提示將不勝感激。

+0

什麼版本? WPF,Xamarin,UWP,ASP.NET? – Aphelion

回答

1

還有一個類似的問題here

的解決方案是使用SelectionStart設置插入符結尾,例如:

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

請注意,如果用戶在中間插入文本(因爲它會強制文本在最後),這會分解一點。我想你會想保存選擇的位置,轉換成大寫,然後恢復。 – FriendlyGuy

0

我不知道你想在這裏完成的任務。

如果你想什麼在爲大寫字母鍵上的字母,然後你試圖設置字體charactercasing

TextBox1.CharacterCasing = CharacterCasing.Upper;

或者將其設置在窗體上的屬性上,因爲它可能需要放置在按鍵事件後面。

或者在XAML

<TextBox CharacterCasing="Upper"/> 
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; 
    } 
} 
0

當使用Telerik的RadMaskedTextInput控制,有一個格式化令牌的限制,所以你需要使用數字語法,而不是字面的語法來聲明面具。例如,使用格式化令牌時,應使用「L3」掩碼「LLL」。在你的情況,你將使用L1和D1令牌,以及是否正在使用的WinForms或WPF(你沒有指定)郵政代碼面膜應該是:

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

的「>」殼字符執行轉換爲大寫。