在XAML中我有<Slider />
。它有ValueChanged事件。每次更改Value都会触发此事件。我需要检测价值变化何时结束。 LostFocus,PointerReleased不是正确的事件。我如何检测这个?如何检测XAML Slider何时完成?
回答
您可以创建一个新的类,并从滑块继承。从那里开始,您可以查找Thumb控件&监听您想要的事件。
像这样的东西应该工作:
public class SliderValueChangeCompletedEventArgs : RoutedEventArgs
{
private readonly double _value;
public double Value { get { return _value; } }
public SliderValueChangeCompletedEventArgs(double value)
{
_value = value;
}
}
public delegate void SlideValueChangeCompletedEventHandler(object sender, SliderValueChangeCompletedEventArgs args);
public class ExtendedSlider : Slider
{
public event SlideValueChangeCompletedEventHandler ValueChangeCompleted;
private bool _dragging = false;
protected void OnValueChangeCompleted(double value)
{
if (ValueChangeCompleted != null)
{
ValueChangeCompleted(this, new SliderValueChangeCompletedEventArgs(value));
}
}
protected override void OnApplyTemplate()
{
base.OnApplyTemplate();
var thumb = base.GetTemplateChild("HorizontalThumb") as Thumb;
if (thumb != null)
{
thumb.DragStarted += ThumbOnDragStarted;
thumb.DragCompleted += ThumbOnDragCompleted;
}
thumb = base.GetTemplateChild("VerticalThumb") as Thumb;
if (thumb != null)
{
thumb.DragStarted += ThumbOnDragStarted;
thumb.DragCompleted += ThumbOnDragCompleted;
}
}
private void ThumbOnDragCompleted(object sender, DragCompletedEventArgs e)
{
_dragging = false;
OnValueChangeCompleted(this.Value);
}
private void ThumbOnDragStarted(object sender, DragStartedEventArgs e)
{
_dragging = true;
}
protected override void OnValueChanged(double oldValue, double newValue)
{
base.OnValueChanged(oldValue, newValue);
if (!_dragging)
{
OnValueChangeCompleted(newValue);
}
}
}
我在Windows8/WinRT上使用Slider
也有类似的问题。
我的问题如下:我对ValueChanged
事件做出了反应,并在每次触发后执行持久操作(对文件异步写入)。并因此陷入并发编辑异常。为了避免这种情况,我使用了一个DispatcherTimer
。
//Class member
private DispatcherTimer myDispatcherTimer = null;
private void OnSliderValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
//I update my UI right away
...
//If the dispatcher is already created, stop it
if (myDispatcherTimer!= null)
myDispatcherTimer.Stop();
//Overwrite the DispatcherTimer and thus reset the countdown
myDispatcherTimer= new DispatcherTimer();
myDispatcherTimer.Tick += (sender, o) => DoSomethingAsync();
myDispatcherTimer.Interval = new TimeSpan(0,0,2);
myDispatcherTimer.Start();
}
private async void DoSomethingAsync()
{
await DoThatLongSaveOperation();
}
不能直接检测最终值是什么,但你至少可以延迟操作,直到有两次更新之间长时间的停顿(例如,在我的情况下,如果用户拖动滑块和停止,同时保持拖动2秒,无论如何都会触发保存操作)。
Ack!一个计时器。 2秒?为什么不是1. 1秒,为什么不是3?我想我宁愿明确的事件。如果他们的系统很慢?如果他们的系统很快?你知道我的意思。 –
您可以使用一对bool值isValueChanged和(如果可能,更改值,不用指针 )isPressed;
private void Slider_ValueChanged(object s, RangeBaseValueChangedEventArgs e) {
if (!isPressed) {
AcceptChanges();
} else {
isValueChanged = true;
}
}
初始化代码:
Window.Current.CoreWindow.PointerPressed += (e, a) => { isPressed = true; };
Window.Current.CoreWindow.PointerReleased += (e, a) => {
isPressed = false;
if (isValueChanged) AcceptChanges();
};
不确定这将支持键盘。 –
XAML,的WinRT,Windows8.1和UWP:
PointerCaptureLost事件应适用于鼠标/触摸
KEYUP事件键盘
- 1. 检测FileStreamResult何时完成
- 2. 如何检测NSURLConnection何时完成
- 3. 如何检测innerHTML何时完成
- 4. 如何检测MotionEvent.ACTION_MOVE何时完成
- 5. 如何检测时FileDownloader在vaadin完成
- 6. 动画完成时如何检测
- 7. 如何检测UIWebView何时在Swift中完全加载完成
- 8. 检测每个任务何时完成
- 9. 检测uploadValues何时完成?
- 10. didAnimateRoation toInterfaceorientation - 检测何时完成旋转?
- 11. 检测UIButton事件何时完成
- 12. 检测YouTube视频何时完成
- 13. 检测异步连接何时完成
- 14. 检测时ValueAnimator完成
- 15. QWebview:如何检测Flash视频完成?
- 16. IOS如何检测定位完成
- 17. 如何检测NSManagedObject加载完成?
- 18. 如何检测SKVideoNode播放完成
- 19. 如何检测UIViewController完成加载?
- 20. 如何检测NSURLConnection sendAsynchronousRequest是否完成
- 21. 如何检测观察员完成Firebase
- 22. 如何检测歌曲播放完成?
- 23. 如何检测TWebBrowser何时完成下载页面?
- 24. 如何检测BarChart何时完成在Flex中的渲染
- 25. iOS:如何检测动画何时完成?
- 26. 如何检测在ASP.NET中文件下载何时完成?
- 27. 如何检测Web页面何时完成加载WebBrowser控件?
- 28. 如何检测UITableView何时完成加载所有行?
- 29. 如何检测何时在WebView中重定向完成?
- 30. 如何检测Firefox何时使用Python完成加载页面?
也许一个附加到ValueChanged的计时器? –
听起来像你正在努力的是确定你到底想要接收这个事件。我想如果你知道这一点,那么你可能会想出如何发送它。也许一个带有离散值选项的滑块可以让这个更清晰? – mydogisbox
你有没有解决这个问题? – Carlo