0

我正在开发一个 XAML/C# WinRT 应用程序。该应用程序有一个带有分组源的 Gridview。我正在 Gridview 上实现手动拖放功能(因为 MS 以他们的智慧决定跳过分组 Gridview 中的关键功能)。

我面临的一个问题是试图获得对被拖动控件的引用。在 DragItemsStarting 事件中,我们有:

private void GVDragItemsStarting(object sender, DragItemsStartingEventArgs e)
{
var item = e.Items.FirstOrDefault();
if (item == null)
    return;

e.Data.Properties.Add("item", item);
}  

但是这里的sender只是GridView,不是被拖拽的控件,e.Items[0]指向的是底层数据模型对象,并不是实际的控件。有没有办法在拖放发生之前将实际控件拖动到拖动事件链中的某个位置?我正在考虑查看 PointerPressed 事件,但拖动时甚至没有触发。

这似乎很简单,我认为我缺少一些明显的东西。

谢谢你的帮助。

4

3 回答 3

1

正如您建议使用的ContainerFromItem那样,最好引用在处理程序中触发原始事件的 GridView:

private void GVDragItemsStarting(object sender, DragItemsStartingEventArgs e) 
{ 
   GridView g = (GridView)sender;
   var draggedControl = g.ContainerFromItem(e.Items[0]);
   // ...
}
于 2014-12-04T22:22:55.137 回答
0

在对事件进行了一些试验后,我想通了:通过处理 ManipulationStarting 事件并将 e.Container 或 e.OriginalSource 存储在类变量中以便稍后在拖动事件中访问,可以让控件被拖动。

于 2012-11-26T06:57:52.210 回答
0

下面是一个更好的解决方案,它不需要跟踪变量:

var draggedControl = itemGridView.ItemContainerGenerator.ContainerFromItem(e.Items[0]);
于 2012-11-27T20:09:25.133 回答