Windows 8 如何检测XAML滑块何时完成?

Windows 8 如何检测XAML滑块何时完成?,windows-8,winrt-xaml,Windows 8,Winrt Xaml,在XAML中,我有。它具有ValueChanged事件。此事件随值的每次更改而激发。我需要检测值更改何时结束。LostFocus、PointerReleased不是正确的事件。如何检测此问题?我在Windows8/WinRT上使用滑块时遇到类似问题 我的问题如下:我对ValueChanged事件做出反应,并在每次触发后执行一个长期操作(异步写入文件)。并因此遇到并发编辑异常。为了避免这种情况,我使用了一个dispatchermer //类成员 私有DispatcherTimer myDispat

在XAML中,我有
。它具有ValueChanged事件。此事件随值的每次更改而激发。我需要检测值更改何时结束。LostFocus、PointerReleased不是正确的事件。如何检测此问题?

我在Windows8/WinRT上使用
滑块时遇到类似问题

我的问题如下:我对
ValueChanged
事件做出反应,并在每次触发后执行一个长期操作(异步写入文件)。并因此遇到并发编辑异常。为了避免这种情况,我使用了一个
dispatchermer

//类成员
私有DispatcherTimer myDispatcherTimer=null;
SliderValueChanged上的私有void(对象发送方,RangeBaseValueChangedEventArgs e)
{
//我马上更新我的用户界面
...
//如果已创建调度程序,请停止它
如果(MyDispatcherTime!=null)
myDispatcher.Stop();
//覆盖调度程序,从而重置倒计时
myDispatcherTimer=新DispatcherTimer();
Tick+=(发送方,o)=>DoSomethingAsync();
myDispatcherTimer.Interval=新的时间跨度(0,0,2);
myDispatcherTimer.Start();
}
专用异步void DoSomethingAsync()
{
等待DoThatLongSaveOperation();
}

您无法直接检测最终值是什么,但您至少可以延迟操作,直到两次更新之间有一个长时间的暂停(例如,在我的情况下,如果用户拖动滑块并停止,同时保持拖动2秒,则无论如何都会触发保存操作)。

您可以使用一对bool值isValueChanged和isValueChanged(如有可能,在不操纵指针的情况下更改值。) )表达

private void Slider\u值已更改(对象s、RangeBaseValueChangedEventArgs e){
如果(!isPressed){
接受变化();
}否则{
isValueChanged=true;
}
}
初始化代码:

Window.Current.corefown.PointerPressed+=(e,a)=>{isPressed=true;};
Window.Current.CoreWindow.PointerReleased+=(e,a)=>{
isPressed=false;
如果(isValueChanged)接受更改();
};

您可以创建一个新类并从Slider继承。从此,您可以查找Thumb控件并侦听所需的事件

像这样的方法应该会奏效:

公共类SliderValueChangeCompletedEventArgs:RoutedEventArgs
{
私有只读双_值;
公共双值{get{return_Value;}}
公共SliderValueChangeCompletedEventArgs(双值)
{
_价值=价值;
}
}
公共委托无效SlideValueChangeCompletedEventHandler(对象发送者,SlideValueChangeCompletedEventArgs args args);
公共类ExtendedSlider:Slider
{
公共事件SlideValueChangeCompletedEventHandler值ChangeCompleted;
private bool\u drawing=false;
受保护的无效OnValueChangeCompleted(双值)
{
如果(ValueChangeCompleted!=null)
{
ValueChangeCompleted(这是新的SliderValueChangeCompletedEventArgs(值));
}
}
受保护的覆盖无效OnApplyTemplate()
{
base.OnApplyTemplate();
var thumb=base.GetTemplateChild(“HorizontalThumb”)作为thumb;
if(thumb!=null)
{
thumb.DragStarted+=ThumbOnDragStarted;
thumb.DragCompleted+=ThumbOnDragCompleted;
}
thumb=base.GetTemplateChild(“VerticalThumb”)作为thumb;
if(thumb!=null)
{
thumb.DragStarted+=ThumbOnDragStarted;
thumb.DragCompleted+=ThumbOnDragCompleted;
}
}
私有无效ThumbOnDragCompleted(对象发送方,DragCompletedEventArgs e)
{
_拖动=假;
OnValueChangeCompleted(此.Value);
}
私有void ThumbOnDragStarted(对象发送方,DragStartedEventArgs e)
{
_拖动=真;
}
受保护的覆盖无效OnValueChanged(双oldValue,双newValue)
{
base.OnValueChanged(旧值、新值);
如果(!\u拖动)
{
OnValueChangeCompleted(新值);
}
}
}

XAML、WinRT、Windows8.1和UWP:

PointerCaptureLost事件应适用于鼠标/触摸

KeyUp键盘事件

可能是连接到ValueChanged的计时器?听起来你正在努力定义你想要接收此事件的确切时间。我想如果你弄清楚了,那么你可能会弄清楚如何发送它。也许带离散值选项的滑块会更清楚?你知道吗解决过这个问题吗?这似乎是WPF/Silverlight之后的问题。但是,如果你仔细想想,你怎么知道值更改何时真正结束?除非你设置一个特定的持续时间,你才能真正知道用户是否使用了滑块。所以我认为最好的方法是像Tim Bo那样使用Dispatchermerurguignon做了。不确定这是否支持键盘。确认!计时器。2秒?为什么不1.1秒,为什么不3秒?我想我更喜欢显式事件。如果他们的系统很慢怎么办?如果他们的系统很快怎么办?你知道我的意思。