Silverlight NumericUpDown ValueChanging сработал дважды - PullRequest
1 голос
/ 11 марта 2011

Я использую элемент управления NumericUpDown из Silverlight Control Toolkit, который иногда запускает событие ValueChanging в два раза за одно обновление (нажатие только один раз на верхнюю или нижнюю кнопку).Кто-нибудь знает какой-нибудь обходной путь для этого поведения?


Дополнительная информация:
У меня есть следующий xaml:

    <StackPanel>
        <toolkit:NumericUpDown Name="numericUpDown1"
                               Width="35"
                               Minimum="0"
                               Maximum="3"
                               ValueChanging="valueChanging" />
        <toolkit:NumericUpDown Name="numericUpDown2"
                               Width="35"
                               Minimum="0"
                               Maximum="3"
                               ValueChanging="valueChanging" />
        <toolkit:NumericUpDown Name="numericUpDown3"
                               Width="35"
                               Minimum="0"
                               Maximum="3"
                               ValueChanging="valueChanging" />
    </StackPanel>

И код для события:

private void valueChanging(object sender, RoutedPropertyChangingEventArgs<double> e)
    {
        if (numericUpDown1.Value + numericUpDown2.Value + numericUpDown3.Value > 3)
        {
            e.Cancel = true;
            MessageBox.Show("No more than 3 in total");
        }
    }

Ошибка возникает не всегда, но иногда событие запускается дважды, и предупреждение появляется, даже когда у меня просто сумма 3 ... например (что не всегда происходит): увеличить до2 первый, затем 1 второй и 1 третий.сообщение отображается, и это правильно.уменьшите первый до 1, и если вы увеличите третий до 1, он сгенерирует сообщение, потому что событие запускается дважды ... (опять же, не всегда, когда это происходит)

Ответы [ 2 ]

1 голос
/ 11 марта 2011

Я думаю, что именно модальная природа самого MessageBox представляет проблему. С вашим кодом я могу воспроизвести проблему. Я также могу получить его так, чтобы при общем значении, равном 0 или 1, один клик вверх по ящику может привести к его переходу к 3.

Однако, когда я вынимаю MessageBox, все работает как положено.

0 голосов
/ 12 марта 2011

NumericUpDown использует RepeatButton, который может вызвать событие click несколько раз. Если вашим элементам управления NumericUpDown не нужно подниматься слишком высоко (как в примере, который вы разместили, когда он не принимает сумму, превышающую 3), вы можете изменить шаблон элемента управления, чтобы использовать вместо него кнопку.

Примечание: Я пытался изменить только шаблон SpinnerStyle, но это не сработало. Мне пришлось изменить стиль NumericUpDown и там указать на мою модифицированную версию SpinnerStyle

...