拖放;在Metro中使用ItemsControl进行拖放(C#/XAML)

拖放;在Metro中使用ItemsControl进行拖放(C#/XAML),c#,xaml,drag-and-drop,microsoft-metro,C#,Xaml,Drag And Drop,Microsoft Metro,我有一个应用程序,其中我有一个usercontrol,由一个带有正方形的ItemsControl(由边框和底层控件表示)组成。 把它想象成一个棋盘 因为我的ItemTemplate由边框组成,所以它不像GridView或ListView那样具有对拖放的本机支持。我以前尝试过在我的方块上同时使用GridView和ListView,但是GUI变得太慢了,所以我切换到了一个简单的边框,这使得它速度更快 通过连接操纵事件,我仍然能够获得边框及其内容的拖动行为(至少在GUI上是这样)。 然而,当我试图将一

我有一个应用程序,其中我有一个usercontrol,由一个带有正方形的ItemsControl(由边框和底层控件表示)组成。 把它想象成一个棋盘

因为我的ItemTemplate由边框组成,所以它不像GridView或ListView那样具有对拖放的本机支持。我以前尝试过在我的方块上同时使用GridView和ListView,但是GUI变得太慢了,所以我切换到了一个简单的边框,这使得它速度更快

通过连接操纵事件,我仍然能够获得边框及其内容的拖动行为(至少在GUI上是这样)。 然而,当我试图将一个方块(边框)拖动到另一个方块时,我似乎无法启动drop事件。我需要知道目标方块是哪个

我明白,因为我自己在做拖放功能,我需要做一些事情来钩住border的拖放事件,但是什么呢

我还尝试订阅边界事件PointerEntered、PointerMoved等,以确定指针位于哪个方块上,当按钮松开时,我将知道目标方块位于哪个方块上。不过,这似乎只在两个方向(向右和向下)起作用,奇怪的是,指针事件在向左或向上移动时似乎不会触发。我已经读到一些东西(方块)有不同的ZIndex,这可能会影响事件的触发


我已经为此挣扎了几个小时,非常感谢您的帮助。

创建一个附加属性并将其连接到边界外的父控件,将本机拖放到ItemTemplate的TargetType

将其连接到PreviewMouseUp和PreviewMouseDown事件


更多内容可在此处找到

创建附加属性并将其连接到边界外的父控件,将本机拖放到ItemTemplate的TargetType

将其连接到PreviewMouseUp和PreviewMouseDown事件


更多信息可在此处找到

您只需在要拖放的对象上方添加一个
Thumb
对象即可。
Thumb
对象将触发所需的事件,您可以处理这些事件中的任何行为(例如,您可能希望在画布上移动基础对象以模拟拖动基础对象)

你可以看一看,让你开始

然后,当您收到
Thumb
通知时,您将以任何适合您的方式掌握底层,并调用
Canvas.SetLeft/Top(对象,我的新坐标)
。通常,新坐标类似于
Canvas.GetLeft/Top(object)+args.Horizontal/VerticalChange


正如您所了解的,您必须使用
画布
并自己放置对象,而不是使用
网格
列表视图
您只需要在要拖放的对象上方包含
拇指
对象。
Thumb
对象将触发所需的事件,您可以处理这些事件中的任何行为(例如,您可能希望在画布上移动基础对象以模拟拖动基础对象)

你可以看一看,让你开始

然后,当您收到
Thumb
通知时,您将以任何适合您的方式掌握底层,并调用
Canvas.SetLeft/Top(对象,我的新坐标)
。通常,新坐标类似于
Canvas.GetLeft/Top(object)+args.Horizontal/VerticalChange


正如您所想,您必须使用
画布
并自己放置对象,而不是使用
网格
列表视图

您是否考虑过使用DragEnter/DragOver/DragLeave和Drop事件?您是否考虑过使用DragEnter/DragOver/DragLeave和Drop事件?