Ввод числовых данных в WPF - PullRequest
62 голосов
/ 08 августа 2008

Как вы обрабатываете ввод числовых значений в приложениях WPF?

Без элемента управления NumericUpDown я использовал TextBox и обрабатывал его событие PreviewKeyDown с помощью приведенного ниже кода, но это довольно уродливо.

Кто-нибудь нашел более изящный способ получения числовых данных от пользователя, не полагаясь на сторонний элемент управления?

private void NumericEditPreviewKeyDown(object sender, KeyEventArgs e)
{
    bool isNumPadNumeric = (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || e.Key == Key.Decimal;
    bool isNumeric = (e.Key >= Key.D0 && e.Key <= Key.D9) || e.Key == Key.OemPeriod;

    if ((isNumeric || isNumPadNumeric) && Keyboard.Modifiers != ModifierKeys.None)
    {
        e.Handled = true;
        return;
    }

    bool isControl = ((Keyboard.Modifiers != ModifierKeys.None && Keyboard.Modifiers != ModifierKeys.Shift)
        || e.Key == Key.Back || e.Key == Key.Delete || e.Key == Key.Insert
        || e.Key == Key.Down || e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Up
        || e.Key == Key.Tab
        || e.Key == Key.PageDown || e.Key == Key.PageUp
        || e.Key == Key.Enter || e.Key == Key.Return || e.Key == Key.Escape
        || e.Key == Key.Home || e.Key == Key.End);

    e.Handled = !isControl && !isNumeric && !isNumPadNumeric;
}

Ответы [ 17 ]

1 голос
/ 12 августа 2008

Вы также можете попробовать использовать проверку данных, если пользователи передают данные перед их использованием. Сделать это было довольно просто и чище, чем возиться с ключами.

В противном случае вы всегда можете отключить вставку!

0 голосов
/ 23 января 2010
Private Sub Value1TextBox_PreviewTextInput(ByVal sender As Object, ByVal e As TextCompositionEventArgs) Handles Value1TextBox.PreviewTextInput
    Try
        If Not IsNumeric(e.Text) Then
            e.Handled = True
        End If
    Catch ex As Exception
    End Try
End Sub

работал для меня.

0 голосов
/ 18 февраля 2009
private void txtNumericValue_PreviewKeyDown(object sender, KeyEventArgs e)
{
    KeyConverter converter = new KeyConverter();

    string key = converter.ConvertToString(e.Key);

    if (key != null && key.Length == 1)
    {
        e.Handled = Char.IsDigit(key[0]) == false;
    }
}

Это самая простая техника, которую я нашел для достижения этой цели. Недостатком является то, что контекстное меню TextBox по-прежнему позволяет использовать не числовые значения с помощью вставки. Чтобы быстро решить эту проблему, я просто добавил атрибут / свойство: ContextMenu = "{x: Null}" в TextBox, тем самым отключив его. Не идеально, но для моего сценария этого будет достаточно.

Очевидно, что вы можете добавить еще несколько ключей / символов в тест, чтобы включить дополнительные допустимые значения (например, '.', '$' И т. Д ...)

0 голосов
/ 12 сентября 2008

Разве вы не можете использовать что-то вроде следующего?

int numericValue = 0;

if (false == int.TryParse(yourInput, out numericValue))
{
    // handle non-numeric input
}
0 голосов
/ 08 августа 2012

Можно также использовать конвертер как:

public class IntegerFormatConverter : IValueConverter
{
    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int result;
        int.TryParse(value.ToString(), out result);
        return result;
    }

    public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int result;
        int.TryParse(value.ToString(), out result);
        return result;
    }
}
0 голосов
/ 30 января 2010
void PreviewTextInputHandler(object sender, TextCompositionEventArgs e)
{
    string sVal = e.Text;
    int val = 0;

    if (sVal != null && sVal.Length > 0)
    {
        if (int.TryParse(sVal, out val))
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
    }
}
0 голосов
/ 08 августа 2008

Назовите меня сумасшедшим, но почему бы не поместить кнопки плюс и минус по обе стороны от элемента управления TextBox и просто не дать TextBox получить фокусировку курсора, создавая тем самым собственный дешевый элемент управления NumericUpDown?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...