如何检测工具包:GestureListener Hold何时停止?

时间:2011-04-21 17:32:47

标签: windows-phone-7 silverlight-toolkit gesture

有没有办法可以检测到这个?只要用户拿着图标,我就会继续执行操作。

3 个答案:

答案 0 :(得分:2)

您可以使用鼠标操作事件来检测执行操作的时间,而不是使用GestureListener。例如:

  • 听取MouseLeftButtonDown了解用户何时触摸了图标
  • 继续执行操作,直到MouseLeftButtonUpMouseLeave触发,表示用户不再触摸该图标
  • 您可能还必须使用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();
}