Windows phone 7 如何检测toolkit:GestureListener保持何时停止?
有没有办法让我发现?只要用户按住图标,我就想继续执行操作。为此,您可以使用鼠标操作事件来检测执行操作的时间。例如:Windows phone 7 如何检测toolkit:GestureListener保持何时停止?,windows-phone-7,silverlight-toolkit,gesture,Windows Phone 7,Silverlight Toolkit,Gesture,有没有办法让我发现?只要用户按住图标,我就想继续执行操作。为此,您可以使用鼠标操作事件来检测执行操作的时间。例如: 收听MouseLeftButtonDown以了解用户何时触摸了图标 继续执行该操作,直到MouseLeftButtonUp或MouseLeave触发,表明用户不再触摸该图标 您可能还需要使用MouseEnter启动操作 今天,只有我在我的项目中做了同样的事情。我会告诉你我实现的基本逻辑(假设它必须在按钮上完成)。步骤1:在按钮上操作开始事件启动一个计时器,时间间隔为之后,你要启动
- 收听
以了解用户何时触摸了图标MouseLeftButtonDown
- 继续执行该操作,直到
或MouseLeftButtonUp
触发,表明用户不再触摸该图标MouseLeave
- 您可能还需要使用
启动操作MouseEnter
今天,只有我在我的项目中做了同样的事情。我会告诉你我实现的基本逻辑(假设它必须在按钮上完成)。
步骤1:在按钮上操作开始事件启动一个计时器,时间间隔为之后,你要启动重复操作。
步骤2:按钮上的操作完成事件停止计时器。
第3步:如果计时器已启动,请停止计时器并启动另一个计时器,时间间隔为动作的重复时间间隔。=。在第二个计时器启动处理程序中,仅当控件有焦点时,才执行操作。在这种情况下,如果控件是按钮,则可以检查按钮.IsPressed是否为真,然后执行操作。
代码将类似于:
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();
};
希望这有帮助。注意:Amresh Kumar建议使用操纵事件是正确的。此外,我在Windows Phone App Hubs论坛上也得到了同样的建议,因此我编辑了这篇文章以反映代码的变化。 以前,用户体验是脆弱的,因为将手指从屏幕上移开并不总能触发取消。毫不奇怪,工具箱中的手势完成代码似乎比鼠标按钮事件更适合触摸屏 XAML:
代码:
private void RangeUpTap(对象发送方,GestureEventArgs e)
{
RangeIncrementUp(发送方,e);
}
私有只读时间跨度_rangeIncrementTimeSpan=新时间跨度(1500000);
private readonly dispatchermer_rangeIncrementTimer=new dispatchermer();
私有无效范围(对象发送者、GestureEventArgs e)
{
_rangeIncrementTimer.Interval=\u rangeIncrementTimeSpan;
_rangeIncrementTimer.Tick+=RangeIncrementUp;
_rangeIncrementTimer.Start();
}
私有无效范围取消(对象发送方、GestureEventArgs e)
{
_rangeIncrementTimer.Stop();
_rangeIncrementTimer.Tick-=RangeIncrementUp;
}
私有void RangeIncrementUp(对象发送方,事件参数e)
{
int range=Convert.ToInt32(tBoxRange.Text);
如果(范围<1000)
{
范围+=10;
}
tBoxRange.Text=range.ToString();
}
我试着使用一些我在SL4应用程序中成功使用的MouseLeftButton代码,但它很脆弱,有时当我把手指从屏幕上拿开时,它不会停止。此外,它与点击行为相冲突,因为我的鼠标按钮代码使用了一个分派器。无论如何,谢谢你的回复。我会继续修修补补的。谢谢Amresh。我尝试过这个方法,但没有成功(因为我自己缺乏知识)。您好,您想在什么控件上实现功能?您可以尝试操纵事件,而不是使用鼠标上下键。谢谢Amresh。我能够成功地更改代码,并在这个示例中反映了这一点。
<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();
}