我的解决方案基本上是Santo的解决方案,只是加了一些标志。对我来说,滑块是从读取流或用户操作(通过鼠标拖动或使用箭头键等)更新的。
首先,我编写了代码从读取流更新滑块值:
delegate void UpdateSliderPositionDelegate();
void UpdateSliderPosition()
{
if (Thread.CurrentThread != Dispatcher.Thread)
{
UpdateSliderPositionDelegate function = new UpdateSliderPositionDelegate(UpdateSliderPosition);
Dispatcher.Invoke(function, new object[] { });
}
else
{
double percentage = 0;
percentage *= 100;
slider.Value = percentage;
}
}
我随后添加了代码,以捕获用户使用鼠标拖动滑块的操作:
<Slider Name="slider"
Maximum="100" TickFrequency="10"
ValueChanged="slider_ValueChanged"
Thumb.DragStarted="slider_DragStarted"
Thumb.DragCompleted="slider_DragCompleted">
</Slider>
并添加了代码:
bool sliderThumbDragging = false;
private void slider_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e)
{
sliderThumbDragging = true;
}
private void slider_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
sliderThumbDragging = false;
}
当用户通过鼠标拖动更新滑块的值时,由于正在读取流并调用
UpdateSliderPosition()
,因此该值仍将发生变化。为了防止冲突,必须更改
UpdateSliderPosition()
函数:
delegate void UpdateSliderPositionDelegate();
void UpdateSliderPosition()
{
if (Thread.CurrentThread != Dispatcher.Thread)
{
UpdateSliderPositionDelegate function = new UpdateSliderPositionDelegate(UpdateSliderPosition);
Dispatcher.Invoke(function, new object[] { });
}
else
{
if (sliderThumbDragging == false)
{
double percentage = 0;
percentage *= 100;
slider.Value = percentage;
}
}
}
虽然这样做可以避免冲突,但我们仍无法确定该值是由用户更新还是由调用UpdateSliderPosition()
更新。为了解决这个问题,我们需要设置另一个标志,这次是在UpdateSliderPosition()
内部设置的。
bool updatingSliderPosition = false;
delegate void UpdateSliderPositionDelegate();
void UpdateSliderPosition()
{
if (Thread.CurrentThread != Dispatcher.Thread)
{
UpdateSliderPositionDelegate function = new UpdateSliderPositionDelegate(UpdateSliderPosition);
Dispatcher.Invoke(function, new object[] { });
}
else
{
if (sliderThumbDragging == false)
{
updatingSliderPosition = true;
double percentage = 0;
percentage *= 100;
slider.Value = percentage;
updatingSliderPosition = false;
}
}
}
最后,我们能够检测到滑块是由用户更新还是通过调用UpdateSliderPosition()
更新:
private void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (updatingSliderPosition == false)
{
}
else
{
}
}
希望这能帮到某个人!
...不包含Slider_DragCompleted的定义,也没有可访问的扩展方法Slider_DragCompleted接受类型为'MainWindow'的第一个参数
。 - mrid