Слайдер WPF сбрасывает свое значение самостоятельно. Изменено значение ползунка Событие сработало без изменения значения. Не знаю, откуда берется значение - PullRequest
0 голосов
/ 14 апреля 2020

Я столкнулся с проблемой, которую я потратил в целом без результатов. Любые указатели и предложения очень ценятся !!! Прикрепленные изображения показывают информацию об отладке.

Вот упрощенная версия: я пытаюсь разработать приложение для рисования и использовать ползунок для управления радиусом и ползунок для управления шириной линии. У меня есть основной холст для рисования, выбрав различные инструменты рисования, такие как линии, прямоугольник и т. Д. c. Каждый инструмент будет иметь соответствующую панель управления. Поэтому, если вы выберете строку, появится панель управления линией.

Допустим, у меня есть инструмент, который использует aws круг, на его панели управления есть один ползунок для ширины линии и один ползунок для радиуса круга. Код xaml и code-behind для обоих ползунков одинаковы, но ползунок радиуса всегда сбрасывается сам с помощью обработчика, изменяющего значение, на значение 10, максимум на 10, даже если нет кода для изменения значения, и для max было установлено значение 100 в xaml. Слайдер для ширины линии не будет иметь такой проблемы. В ту минуту, когда вы выбираете другой инструмент, будет вызываться обработчик изменения этого значения, и из ниоткуда будет предоставлен новый ползунок со значением 10 и максимумом 20 независимо от того, какое предыдущее значение было установлено.

Я могу воспроизвести эффект, выполнив следующие действия.

Запустите приложение и выберите инструмент нумерации, значение ползунка инициируется основным свойством инструмента canvas. слайдер init

sn // Set the slder for radius foreach (var myslider in UIServices.FindVisualChildren<Slider>(this))<br> { //if (myslider.Name == "NumberLineRadiusSlider") if(myslider.Name == "NumberLineRadiusSliderValue") { myslider.Value = FrankCanvas.DrawingToolProperties.NumberLineProperty.Radius; } }

Вы можете видеть, что максимальное значение слайдера здесь составляет 120.

Ниже приведен обработчик события изменения значения, после приведенного выше кода инициализации запускается следующий обработчик. Все идет нормально.

Обработчик изменения нормального значения

 private void slNumberLineRadiusValue_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        var slider = sender as Slider;
    }

Вы можете видеть значение, установленное на 20. Затем я нажимаю другой инструмент: вот код выбора инструмента на mvvm ,

Код модели представления выбора инструмента

 public void RectTool_Selected_Handler()
    {
        SelectedToolProperty = ToolRectProperty;
        ToolType = ToolType.Rectangle;
    }

    public void NumberLineTool_Selected_Handler()
    {
        SelectedToolProperty = ToolNumberLineProperty;
        ToolType = ToolType.NumberLine;
    }

Предположим, что я выбрал инструмент recttool вдали от инструмента нумерации, после запуска вышеуказанного кода выбора он сразу же переключился на измененное значение слайдера код. Но другой ползунок, управляющий шириной линии, обработчик измененного значения не вызывается.

Значение изменено Хандер с помощью debugginginfo

Теперь это, похоже, совершенно другой ползунок , его максимум сейчас 10, а значение 10. Я не могу понять, откуда это значение. Я действительно тяну себя за то, откуда происходит изменение стоимости, и как мне это узнать.

Вот мой код Xaml для двух ползунков:

 <!-- Radius -->
                                    <TextBlock Margin="4">New Radius:</TextBlock>
                                    <DockPanel>
                                        <TextBox Text="{Binding ElementName=NumberLineRadiusSliderValue, Path=Value, UpdateSourceTrigger=PropertyChanged}" 
                                                 DockPanel.Dock="Right" Margin="0,0,6,0" 
                                                 TextAlignment="Right" VerticalAlignment="Center" Width="30" Height="20" />

                                        <Slider Name="NumberLineRadiusSliderValue"
                                                Minimum="0"  Maximum="120" Margin="4,10,4,10"                                                    
                                                ValueChanged="slNumberLineRadiusValue_ValueChanged"
                                                TickPlacement="BottomRight" TickFrequency="1" IsSnapToTickEnabled="True"/>

                                    </DockPanel>

<!--Pen Width -->
                                    <TextBlock Margin="4">Pen Width:</TextBlock>
                                    <DockPanel>
                                        <TextBox Text="{Binding ElementName=NumberLineSliderValue, Path=Value, UpdateSourceTrigger=PropertyChanged}" 
                                                 DockPanel.Dock="Right" Margin="0,0,6,0" 
                                                 TextAlignment="Right" VerticalAlignment="Center" Width="30" Height="20" />

                                        <Slider Name="NumberLineSliderValue"
                                                Minimum="0"  Maximum="20" Margin="4,10,4,10"                                                    
                                                ValueChanged="slNumberLineValue_ValueChanged"
                                                TickPlacement="BottomRight" TickFrequency="1" IsSnapToTickEnabled="True"/>

                                    </DockPanel>

Итак, вызван ползунок для обработчика измененного значения радиуса и ему присвоено случайное число, точно такое же значение ползунка ширины линии кода изменилось обработчик не вызывается и ведет себя нормально.

Что здесь может быть не так? Я даже проверил имя ползунка, который запустил обработчик, это действительно тот же ползунок радиуса, но нигде нет абсолютно никакого кода, чтобы изменить максимальное число и значения ползунка. Любые указатели высоко ценится !!! Спасибо !!!

...