【问题标题】:Slider not triggering ValueChanged for each value passed over滑块不会为每个传递的值触发 ValueChanged
【发布时间】:2017-07-20 08:05:48
【问题描述】:

我的 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);
    }

我在处理滑块的滑动时遇​​到问题,当它快速滑动时,并不是所有的 ValueChanges 都被拾起。例如,如果我要使用箭头键 100% 控制滑块,则如下所示:

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

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

任何想法或帮助将不胜感激,干杯。

【问题讨论】:

  • 与其发布一个全新的问题,不如编辑your previous, identical question 来改进它。不管怎样,你真的应该付出一些努力来产生一个实际的minimal reproducible example。如前所述,你的问题太宽泛了。基本答案仍然相同:您需要在观察到的值之间进行插值。但是如何做到这一点有很多可能的答案。
  • @PeterDuniho 那么你想让我做什么,我提供了一个最小而完整的例子?我只包含了相关代码,为了创建一个“工作”示例,我需要提供很多不相关的代码,并且在我看来,这使得问题比仅仅拥有最低限度的代码更糟糕。我也没有多少时间,我以为这样就够了,我尽量把自己说清楚,还有什么办法呢?
  • 如果在“最小值”设置为 0 且“最大值”设置为 100 时将拇指从曲目的开头拖动到结尾,您是否期望恰好获得 100 个事件?或者您的问题是什么?
  • @mm8 所以我将滑块设置为捕捉到刻度,每个值都有一个刻度,最大值设置为图表上的点数。我希望得到恰好 N 个事件,其中 N 是点数

标签: c# wpf xaml slider


【解决方案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);
}

【讨论】:

  • 这是个好主意,我不确定这是否会“流动”或是否会立即显示一批,但是我会尝试一下,我会在循环。
  • 经过一番努力,这似乎工作得很好。谢谢。
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多