我正在为 Surface 开发 WPF 应用程序,但遇到了一个我和我的同事都不知道答案的错误。
我有一种情况,用户可以从框中拖动东西。盒子只是一个图像,当触摸它时,会生成另一个图像并且是获得交互的对象,即被拖放。整个拖动都是用 来执行的SurfaceDragDrop.BeginDragDrop(...)
。掉落后,该物体会消失。
现在的问题是偶尔(似乎是当输入快速出现时,只是敲击屏幕而不是实际拖动对象)生成的项目永远不会消失,即即使输入已被删除,它仍会保留在屏幕上。可以通过触摸它来与它进行交互以继续拖动它,但它的移动和旋转是关闭的,因为它似乎认为已经有另一个手指与它交互。
但是,通过调试,我已经证明该对象没有注册任何触摸。它的AreAnyTouchesCaptured
属性是false
。然而,操纵是活跃的。所以似乎发生的是,它进入了某种永无止境的操纵。为了摆脱它,我实现了一个临时解决方案,它只是SurfaceDragDrop.CancelDragDrop(..)
对已经在屏幕上显示一段时间而没有捕获任何触摸的此类对象进行处理。
我希望我对问题的描述有点清楚,如果没有,请询问。下面是用于生成对象的代码。但是我没有写它(一位前同事写的),我只是坚持调试:
private void item_PreviewTouchDown(object sender, TouchEventArgs e)
{
var box = sender as Canvas;
var imgpath = String.Format(@"[someimgpath].png");
var bmp = new BitmapImage(new Uri(imgpath, UriKind.RelativeOrAbsolute));
Image draggedItem = new Image { Source = bmp, Stretch = Stretch.None, Width = bmp.Width, Height = bmp.Height };
draggedItem.UpdateLayout();
var touchPoint = e.TouchDevice.GetTouchPoint(box);
var itemX = touchPoint.Position.X - draggedItem.Width / 2.0;
var itemY = touchPoint.Position.Y - draggedItem.Height / 2.0;
box.Children.Add(draggedItem);
draggedItem.SetValue(Canvas.LeftProperty, itemX);
draggedItem.SetValue(Canvas.TopProperty, itemY);
draggedItem.Visibility = System.Windows.Visibility.Hidden;
//We should perfom drag-and-drop when the size of the draggedItem is updated, since
//BeginDragDrop uses ActualWidth and ActualHeight property
draggedItem.SizeChanged += (o, ev) =>
{
List<InputDevice> devices = new List<InputDevice>();
devices.Add(e.TouchDevice);
foreach (TouchDevice touch in box.TouchesCapturedWithin)
{
if (touch != e.TouchDevice)
{
devices.Add(touch);
}
}
var img = new Image { Source = draggedItem.Source, Stretch = Stretch.None, Width = bmp.Width, Height = bmp.Height };
img.SetValue(Canvas.LeftProperty, itemX);
img.SetValue(Canvas.TopProperty, itemY);
var cursor = SurfaceDragDrop.BeginDragDrop(box, draggedItem, img, draggedItem, devices, DragDropEffects.Move);
};
e.Handled = true;
}