2010-08-04 69 views
2

我有一個TextBox用於處理數字。因此我只接受[0-9。,]。但是,「。」是唯一有效的小數點分隔符。因此,我只是想在我的文本中這樣做,但我也想接受「,」,並將其與「。」交換。使得顯示的字符是有效的字符。將輸入字符交換爲WPF文本框,然後將其添加到文本中

那麼 - 如何交換輸入字符?我假設我可以獲取並在某些輸入事件中交換它?或者我必須在插入到TextBox後將其替換?

我試着在OnPreviewKeyDown和OnPreviewTextInput事件中交換它,但保持輸入字符的屬性是隻讀的。我想要這樣做:

protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e) 
{ 
    if (e.Key == Key.OemComma) 
    { 
     e.Key = Key.OemPeriod; 
    } 
    base.OnPreviewKeyDown(e); 
} 

回答

2

您可以使用TextChanged事件並每次替換Text屬性。

private void textBox_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    TextBox box = (TextBox)sender; 
    box.Text = box.Text.Replace(",", "."); 
} 

如果您使用綁定,您可以使轉換器在轉換回來時替換文本。

<TextBox Name="textBox" Text="{Binding Path=number, Converter=DecimalConverter}" /> 

public class DecimalConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     string strValue = (string)value; 
     return strValue.Replace(",","."); 
    } 
} 
+0

Thx。聽起來像是一個合理的解決方案,如果我需要在文本插入後做到這一點。在我接受答案之前等待,看看是否有人知道我是否可以控制實際輸入字符。 – stiank81 2010-08-04 12:13:10

1

你只需要處理PreviewKeyDown而不被應用到文本停止,然後只需插入自己的性格。您也可以使用它來過濾非數字輸入:

protected override void OnPreviewKeyDown(KeyEventArgs e) 
{ 
    switch (e.Key) 
    { 
     case Key.D0: 
     case Key.D1: 
     case Key.D2: 
     case Key.D3: 
     case Key.D4: 
     case Key.D5: 
     case Key.D6: 
     case Key.D7: 
     case Key.D8: 
     case Key.D9: 
     case Key.OemPeriod: 
      base.OnPreviewKeyDown(e); 
      break; 
     case Key.OemComma: 
      e.Handled = true; 
      int caretIndex = CaretIndex; 
      Text = Text.Insert(caretIndex, "."); 
      CaretIndex = caretIndex + 1; 
      break; 
     default: 
      e.Handled = true; 
      break; 
    } 
} 
+0

這應該可以幫助我在一個地方處理所有問題,所以我相信這會有所幫助。謝謝! – stiank81 2010-08-05 09:05:19

相關問題