C # UWP, как набрать номерную строку и получить запятые в реальном времени в порядке? - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь ввести числа в текстовое поле и добавить запятую после каждого третьего числа в режиме реального времени.Мне нужно преобразовать строку чисел в действительное число, потому что мне нужно также сделать простое математическое уравнение в реальном времени.Проблема, с которой я сталкиваюсь, заключается в том, что если после нажатия 4 я набираю порядок 1234567, добавляется запятая, а затем поле ввода переходит к началу строки.Поэтому я набираю от 1 до 7, я получаю 5 671 234

private void PriceBox_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args)
        {
            if (!String.IsNullOrEmpty(PriceBox.Text))
            {
                int x = Int32.Parse(PriceBox.Text, NumberStyles.AllowThousands);
                float y = x * .50f;
                Half.Text = y.ToString("N0");
                PriceBox.Text = x.ToString("N0");
            }
        }

1 Ответ

0 голосов
/ 01 января 2019

Вы можете отформатировать число, которое будет иметь запятые после каждых 3 цифр, как описано здесь .Один из способов - перехватить событие TextChanged, преобразовать текущий номер в число, разделенное запятыми, и заменить текущий текст номером, разделенным запятыми.

Кроме того, чтобы прекратить исключение ovetflow, необходимо отписаться отTextChanged событие, а затем снова подпишитесь.

Общий обработчик событий здесь:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    TextBox textBox = sender as TextBox;

    /// unsubscribe, so that the replacing doesn't invoke this handler again
    textBox.TextChanged -= TextBox_TextChanged;
    if(double.TryParse(textBox.Text, out double value))
    {
        textBox.Text = value.ToString("N0");
    }

    /// put the cursor in the end of the text
    textBox.Select(textBox.Text.Length, 0);

    /// subscribe again
    textBox.TextChanged += TextBox_TextChanged;
}

Надеюсь, что поможет.

Редактировать: Чтобы разрешить только числовые значения, подключите событие PreviewKeyDown, разрешите только числовые ключи.например:

private void TextBox_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
    bool proceed =
        (e.Key >= Windows.System.VirtualKey.Number0 && e.Key <= Windows.System.VirtualKey.Number9) ||
        (e.Key >= Windows.System.VirtualKey.NumberPad0 && e.Key <= Windows.System.VirtualKey.NumberPad9);
    e.Handled = !proceed;
}

И наконец, чтобы разрешить более 3 запятых, я отредактировал код, теперь он должен разрешать более 3 запятых (в основном, я заменил int на double),

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