Drag & Drop with ItemsControl in Metro (C#/XAML)

本文关键字:Metro XAML in ItemsControl amp Drop with Drag | 更新日期: 2023-09-27 18:31:29

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

由于我的 ItemTemplate 由边框组成,因此它不像 GridView 或 ListView 那样原生支持拖放。我之前尝试将 GridView 和 ListView 用于我的方块,但 GUI 变得太慢了,所以我切换到一个简单的边框,这使得它更快。

通过连接操作事件,我仍然设法为我的边框及其内容获得拖动行为(至少在 GUI 方面)。但是,当我尝试将一个正方形(边框)拖到另一个正方形时,我似乎无法触发掉落事件。我需要知道目标方格是哪个。

我知道,由于我自己在做拖放功能,我需要做一些事情来挂钩到边框的拖放事件,但是呢?

我还尝试订阅边框事件 PointerEntered、PointerMoving 等,以找出指针在哪个方块上,当按钮松开时,我会知道目标方块是哪个方块。这似乎只在两个方向(右和下)起作用,指针事件在向左或向上移动时似乎不会触发,这很奇怪。我读过 somwhere 说项目(方块)有不同的 ZIndex,这可能会影响事件的触发。

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

Drag & Drop with ItemsControl in Metro (C#/XAML)

创建一个附加属性并将其挂接到边框外的父控件,将本机拖放到项模板的 TargetType。

将其挂接到 PreviewMouseUp 和 PreviewMouseDown 事件。

更多内容可在此处找到 WPF 教程拖放

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

您可以查看 Thumb 的 MSDN 页面以帮助您入门。

然后,当您收到Thumb通知时,您会以任何适合您的方式掌握您的底层,然后您打电话给Canvas.SetLeft/Top (object, my new coordinates)。通常,您的新坐标将类似于 Canvas.GetLeft/Top(object) + args.Horizontal/VerticalChange .

正如您所发现的,您必须使用Canvas并自己放置对象,而不是使用 GridListView .