我正在为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;
}
。
我希望我对这个问题的描述有点清楚,如果没有请问。下面是用于生成对象的代码。然而,我没有写它(前同事),我只是坚持调试:
{{1}}