在我的应用程序中,我使用两个滑块来控制某些图像的亮度和对比度,并且当两个滑块中的任何一个更改其 value-property 时,每次都必须逐个像素地完全重新计算图像。
重新计算较小的图像完全没问题,不会引起任何问题,但是,较大的图像需要更长的时间重新计算,并且与鼠标指针相比,滑块的移动略有延迟。我确实需要或多或少地实时重新计算图像,因此仅在 DragCompleted
或类似情况下发生事件是 Not Acceptable 。
使用滑块的 ValueChanged
-event 初始化重新计算。
我认为这个问题的一个很好的解决方案是,如果事件没有尽快触发,但至少会等待 50 毫秒后再次触发,但是是否有滑块的属性可以控制它?
我正在考虑的另一个解决方案是,在处理事件时从一开始就从滑块中删除事件,并在短时间内再次添加它,但这本身可能会导致一些延迟,这在这里也不受欢迎。
我在任何地方都找不到关于这个主题的任何内容,所以如果有人有任何好的建议或方向我可以使用,我会非常感激。
最佳答案
如果您认为您的应用程序不需要在每次触发 ValueChanged 事件时都进行计算,您可以使用 Thumb 控件中的 DragCompleted 事件来确定用户完成拖动控件后的位置。
<Slider Thumb.DragCompleted="Slider_DragCompleted_1"
Height="27" Margin="132,162,0,0" VerticalAlignment="Top" Width="303"/>
当用户停止拖动时,
private void Slider_DragCompleted_1(object sender, DragCompletedEventArgs e)
{
Slider s = sender as Slider;
// Your code
MessageBox.Show(s.Value.ToString());
}
但请注意,这仅在用户拖动滑块时有效。当用户单击滑块时不会触发此操作。
引用 this 处理其他事件,如鼠标点击等。
如果你想计算一些时间延迟,那么你可以使用 timer 。
编辑:
根据您的要求,您可以这样做。
在“ValueChanged”事件中。
// Start a new thread only if the thread is stopped
// or the thread has not been created yet.
if (threadPopular == null || threadPopular.ThreadState == ThreadState.Stopped)
{
threadPopular = new Thread(new ThreadStart(Your function));
threadPopular.Start();
}
关于c# - WPF-slider ValueChanged-Event 的频率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18510994/