Поменяйте входной символ в WPF TextBox перед его добавлением в текст - PullRequest
2 голосов
/ 04 августа 2010

У меня есть TextBox, который я использую для обработки чисел.Поэтому я принимаю только [0-9.,].Тем не мение, "."является единственным действительным десятичным разделителем.Поэтому я хочу, чтобы это было только в моем тексте, но я также хочу принять "," и поменять его местами с "."такой, что отображаемый символ является действительным.

Итак - как мне поменять местами вводимый символ?Я предполагаю, что я могу получить это и обменять его в каком-либо событии ввода?Или я должен заменить его после того, как он был вставлен в 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 ]

2 голосов
/ 04 августа 2010

Вы можете использовать событие TextChanged и каждый раз заменять свойство Text.

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

Если вы используете Binding, вы можете создать конвертер, который заменит текст при обратном преобразовании.

<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(",",".");
    }
}
1 голос
/ 05 августа 2010

Вам просто нужно обработать 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...