Как определить, когда инструментарий: GestureListener Hold остановлен? - PullRequest
2 голосов
/ 21 апреля 2011

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

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

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

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

ПРИМЕЧАНИЕ: Амреш Кумар был прав, предлагая использовать события манипуляции. Кроме того, мне дали тот же совет на форумах 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();
}
1 голос
/ 22 апреля 2011


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

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


Шаг 2:

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

Шаг 3:

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


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

...