Как определить, когда инструментарий: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();
};
Надеюсь это поможет.