有没有办法可以检测到这个?只要用户拿着图标,我就会继续执行操作。
答案 0 :(得分:2)
您可以使用鼠标操作事件来检测执行操作的时间,而不是使用GestureListener
。例如:
MouseLeftButtonDown
了解用户何时触摸了图标MouseLeftButtonUp
或MouseLeave
触发,表示用户不再触摸该图标MouseEnter
来启动操作答案 1 :(得分:1)
今天只有我在我的项目中做了同样的事情。我会告诉你我实现的基本逻辑(假设它必须在按钮上完成)。
第1步:
在 按钮 _ ManipulationStarted _事件中启动计时器间隔,之后您要触发重复操作。
第2步:
在 按钮 _ ManipulationCompleted _事件停止计时器。
第3步:
如果计时器已解雇,请停止计时器并以间隔 = 启动另一个计时器您的操作的重复间隔。在第二个计时器 fire 处理程序内,仅当控件具有焦点时才执行您的操作。在这种情况下,如果控件是按钮,您可以检查 button.IsPressed 是否为true,然后执行操作。
代码如下所示:
Button forward=new Button();
DispatcherTimer forwardHoldTimer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(2) };
forward.ManipulationStarted += (a, b) => { forwardHoldTimer.Start(); };
forward.ManipulationCompleted += (c, d) => { forwardHoldTimer.Stop(); };
forwardHoldTimer.Tick+=(s1,e1)=>
{
forwardHoldTimer.Stop();
DispatcherTimer t = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(100) };
t.Tick += (x, y) =>
{
if (forward.IsPressed)
{
//Your action logic will go here
}
else
t.Stop();
};
t.Start();
};
希望这会有所帮助。
答案 2 :(得分:1)
注意:Amresh Kumar建议使用操纵事件是正确的。此外,我在Windows Phone App Hubs论坛上获得了相同的建议,所以我编辑了这篇文章以反映代码更改。
之前,用户体验是片状的,因为我的手指从屏幕上抬起并不总是触发取消。毫不奇怪,工具包中的GestureCompleted代码似乎比鼠标按钮事件更适合触摸屏。
XAML:
<iconControls:iconUpDownArrow>
<toolkit:GestureService.GestureListener>
<toolkit:GestureListener Tap="RangeUpTap" Hold="RangeUpHold" GestureCompleted="RangeUpCancel" />
</toolkit:GestureService.GestureListener>
</iconControls:iconUpDownArrow>
代码:
private void RangeUpTap(object sender, GestureEventArgs e)
{
RangeIncrementUp(sender, e);
}
private readonly TimeSpan _rangeIncrementTimeSpan = new TimeSpan(1500000);
private readonly DispatcherTimer _rangeIncrementTimer = new DispatcherTimer();
private void RangeUpHold(object sender, GestureEventArgs e)
{
_rangeIncrementTimer.Interval = _rangeIncrementTimeSpan;
_rangeIncrementTimer.Tick += RangeIncrementUp;
_rangeIncrementTimer.Start();
}
private void RangeUpCancel(object sender, GestureEventArgs e)
{
_rangeIncrementTimer.Stop();
_rangeIncrementTimer.Tick -= RangeIncrementUp;
}
private void RangeIncrementUp(object sender, EventArgs e)
{
int range = Convert.ToInt32(tBoxRange.Text);
if (range < 1000)
{
range += 10;
}
tBoxRange.Text = range.ToString();
}