▶ 터치를 계속 하고 있다는 (=HOLD) 것을 체크하기 위한 Behavior 내의 함수들입니다.
타이머와 Position의 이동으로 유무를 이용하여 HOLD가 발생한지 체크할 수 있습니다.
public class TouchHoldBehavior : Behavior<FrameworkElement>
{
private List<Point> pointList;
private bool btouchdown = false;
private static readonly int tabcount = 1;
...
...
// Touch Down 시에 타이머를 구동시키는 코드입니다.
private void AssociatedObject_TouchDown(object sender, TouchEventArgs e)
{
// Touch Hold를 위해서 Timer 완료시, 저장포인트의 범위로 FireHold를 할지말지 결정.
if (_HoldTimer == null)
{
_HoldTimer = new DispatcherTimer();
_HoldTimer.Interval = TimeSpan.FromSeconds(DefaultInterval);
_HoldTimer.Tick += new EventHandler(TimerCallback);
_HoldTimer.Start();
}
Point pt = e.GetTouchPoint(AssociatedObject).Position;
pointList = new List<Point>();
pointList.Add(pt);
btouchdown = true;
}
// Touch Move 시에 터치포인트의 위치를 저장하는 코드입니다.
private void AssociatedObject_TouchMove(object sender, TouchEventArgs e)
{
if (btouchdown == true)
{
Point pt = e.GetTouchPoint(AssociatedObject).Position;
if (pointList != null)
pointList.Add(pt);
}
}
// TouchUp시에 타이머를 종료하고, 저장한 포인트리스트를 Clear합니다.
private void AssociatedObject_TouchUp(object sender, TouchEventArgs e)
{
if (btouchdown == true)
{
btouchdown = false;
if (_HoldTimer != null)
{
_HoldTimer.Stop();
_HoldTimer = null;
}
pointList.Clear();
pointList = null;
}
}
// 타이머 구동 콜백함수
private void TimerCallback(object sender, EventArgs e)
{
Rect bd;
// Timer를 종료합니다.
_HoldTimer.Tick -= new EventHandler(TimerCallback);
_HoldTimer.Stop();
_HoldTimer = null;
// 저장한 Point List를 이용하여 범위처리.
foreach (Point p in pointList)
{
StylusPoint sp = new StylusPoint(p.X, p.Y);
stpoint.Add(sp);
Stroke sd = new Stroke(stpoint);
Strokes.Add(sd);
}
// 특정범위 밖으로 벗어나지 않고 있다면 TOUCH HOLD 되고 있는 것으로 간주함
bd = Strokes.GetBounds();
if ((bd.Height < limitbound)
&& (bd.Width < limitbound)
&& pointList.Count != tabcount)
{
// HOLD Delegate 이벤트발생시켜 주도록 한다.
TouchHoldDelegateMethod(args);
}
else
{
// 이쪽으로 들어오는 것은 Drag 입니다.
}
Strokes.Clear();
pointList.Clear();
}
...
...
}