【问题标题】:How do I detect when toolkit:GestureListener Hold has stopped?如何检测 toolkit:GestureListener Hold 何时停止?
【发布时间】:2011-04-21 17:32:46
【问题描述】:

有什么方法可以检测到这个吗?只要用户按住图标,我就想继续执行操作。

【问题讨论】:

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


    【解决方案1】:

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

    • 监听MouseLeftButtonDown 以了解用户何时触摸了图标
    • 继续执行该操作,直到 MouseLeftButtonUpMouseLeave 触发,表明用户不再触摸该图标
    • 您可能还需要使用 MouseEnter 来启动操作

    【讨论】:

    • 我尝试使用一些我在 SL4 应用程序中成功使用的 MouseLeftButton 代码,但它很不稳定,有时当我将手指从屏幕上移开时不会停止。此外,它与 Tap 行为冲突,因为我的鼠标按钮代码使用了 DispatcherTimer。无论如何感谢您的回复。我会继续修改它。
    【解决方案2】:


    今天只有我在我的项目中做了同样的事情。我会告诉你我实现的基本逻辑(假设它必须在按钮上完成)。
    第 1 步:

    按钮 _ManipulationStarted_ 事件启动一个计时器,并在 interval 之后触发重复动作。


    第 2 步:

    按钮 _ManipulationCompleted_ 事件停止计时器。

    第 3 步:

    如果计时器被触发,请停止计时器并使用 interval = 您的操作的重复间隔启动另一个计时器。在仅当 控件 具有 焦点 时,第二个计时器 fire 处理程序才会执行您的操作。在这种情况下,如果控件是 button,您可以检查 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();
    };
    


    希望这会有所帮助。

    【讨论】:

    • 谢谢阿姆雷什。我试过了,但没能成功(由于我自己缺乏知识)。
    • 您好,您要在哪个控件上实现功能??
    【解决方案3】:

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

    【讨论】:

    • 您可以尝试操作事件,而不是使用 MouseUp/Down。
    • 谢谢阿姆雷什。我能够成功更改代码并将其反映在此示例中。
    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多