滑块不会为

时间:2017-07-20 08:05:49

标签: c# wpf xaml slider

我的WPF上有一个图表来显示一些图表,图表被绑定到一个名为DisplayPoints的列表,当滑块值改变时,一个点被移动到DisplayPoints中以使其出现在图表上。这是图表XAML:

<oxy:Plot Name="Plot" Margin="0,0,10,0" Background="WhiteSmoke">
    <oxy:Plot.Series>
        <oxy:LineSeries ItemsSource="{Binding DisplayPoints}" Color="Transparent" MarkerFill="SteelBlue" MarkerType="Circle"/>
    </oxy:Plot.Series>
    <oxy:Plot.Axes>
        <oxy:LinearAxis Position="Left" Minimum="0" Maximum="{Binding BuildPlateSize}"/>
        <oxy:LinearAxis Position="Bottom" Minimum="0" Maximum="{Binding BuildPlateSize}"/>
    </oxy:Plot.Axes>
</oxy:Plot>

我在此图表下方还有一个滑块控制图表上显示的图表百分比,我目前正在使用ValueChanged事件处理其事件,这是因为要求图表更新,因为它正在滑动而不是一旦它失去了焦点等。此滑块的XAML是:

<Slider Name="ProgressSlider" Width="300" Minimum="0" Value="0" Height="30" Foreground="Black" BorderBrush="Black" IsSnapToTickEnabled="True"/>

最大值设置为图表所包含的多个点,并为滑块上的每个值创建一个勾号。事件处理如下:

public async void ProgressSliderEvent(object sender, System.Windows.RoutedPropertyChangedEventArgs<double> e)
    {
        if (e.NewValue > e.OldValue)
        {
            await this.mainWindow.DisplayNewPoint();
        }
        else if (e.OldValue > e.NewValue)
        {
            await this.mainWindow.RemovePoint();
        }

        this.mainWindow.UpdateGUI(e.NewValue);
    }

我在处理滑块的滑动时遇​​到问题,当它快速滑动时,并非所有的ValueChange都被拾取。例如,如果我使用箭头键控制滑块100%如下所示: enter image description here

但是如果我将它滑动到100%正常速度,它只会加载一部分值,因为我想它会快速移动以触发每个传递的值的事件: enter image description here

我的问题是如何更好地处理我的滑块事件,这样我就可以将其滑动并加载所有值,无论它移动得多快还是实时更新图形?

任何想法或帮助都将受到高度赞赏,为人们欢呼。

1 个答案:

答案 0 :(得分:1)

  

我的问题是如何才能更好地处理我的滑块事件,这样我就可以将其滑动并加载所有值,无论它移动的速度有多快,还是实时更新图形?

您可以计算事件处理程序中新值和旧值之间的差异,并为每个不同的点调用您的方法一次。像这样:

public async void ProgressSliderEvent(object sender, System.Windows.RoutedPropertyChangedEventArgs<double> e)
{
    if (e.NewValue > e.OldValue)
    {
        double diff = e.NewValue - e.OldValue;
        for (double d = 0; d < diff; ++d)
        {
            await this.mainWindow.DisplayNewPoint();
        }
    }
    else if (e.OldValue > e.NewValue)
    {
        double diff = e.OldValue - e.NewValue;
        for (double d = 0; d < diff; ++d)
        {
            await this.mainWindow.DisplayNewPoint();
        }
    }

    this.mainWindow.UpdateGUI(e.NewValue);
}