Как определить, когда инструментарий:GestureListener Hold остановлен?

Есть ли способ, которым я могу обнаружить это? Я хочу продолжать выполнять действие, пока пользователь удерживает значок.

3 ответа

Решение

ПРИМЕЧАНИЕ: Амреш Кумар был прав, предлагая использовать события манипуляции. Кроме того, мне дали тот же совет на форумах Windows Phone App Hubs, поэтому я отредактировал этот пост, чтобы отразить изменения кода.

Раньше UX был ненадежным, потому что снятие пальца с экрана не всегда вызывало отмену. Неудивительно, что код 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();
}

Вместо использования GestureListener для этого вы могли бы вместо этого использовать события манипуляции с мышью, чтобы определить, как долго выполнять ваши действия. Например:

  • Слушай MouseLeftButtonDown знать, когда пользователь коснулся значка
  • Продолжайте выполнять действие, пока либо MouseLeftButtonUp или же MouseLeave огонь указывает на то, что пользователь больше не касается этого значка
  • Возможно, вам также придется поиграть с MouseEnter для начала действия


Только сегодня я сделал то же самое в своем проекте. Я расскажу вам основную логику того, что я реализовал (при условии, что это нужно сделать с помощью кнопки).
Шаг 1:

На кнопке _ ManipulationStarted _ событие запускается таймер с интервалом, после которого вы хотите запустить повторное действие.


Шаг 2:

На кнопке _ ManipulationCompleted _ событие остановит таймер.

Шаг 3:

Если таймер срабатывает, остановите таймер и запустите другой таймер с интервалом = интервал повторения для вашего действия. А внутри второго обработчика огня таймера выполняйте свою операцию, только если элемент управления имеет фокус. В этом случае, когда элементом управления является кнопка, вы можете проверить, является ли кнопка. Если значение 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();
};


Надеюсь это поможет.

Другие вопросы по тегам