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();
}