【发布时间】:2011-04-21 17:32:46
【问题描述】:
有什么方法可以检测到这个吗?只要用户按住图标,我就想继续执行操作。
【问题讨论】:
标签: windows-phone-7 silverlight-toolkit gesture
有什么方法可以检测到这个吗?只要用户按住图标,我就想继续执行操作。
【问题讨论】:
标签: windows-phone-7 silverlight-toolkit gesture
您可以使用鼠标操作事件来检测执行操作的时间,而不是使用GestureListener。例如:
MouseLeftButtonDown 以了解用户何时触摸了图标MouseLeftButtonUp 或 MouseLeave 触发,表明用户不再触摸该图标MouseEnter 来启动操作【讨论】:
今天只有我在我的项目中做了同样的事情。我会告诉你我实现的基本逻辑(假设它必须在按钮上完成)。
第 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();
};
希望这会有所帮助。
【讨论】:
注意: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();
}
【讨论】: