在UWP中的Drop Event上获取实际丢弃的UIElement对象

时间:2016-08-07 09:15:00

标签: c# winforms drag-and-drop uwp

我将我在WinForms中编写的应用程序转换为UWP,据我所知,Drag n Drop功能略有不同。这是我的WinForms应用程序中的代码,我过去常常使用它来拖动' object,是一个名为FunctionButton的控件;

private void flowLayoutPanel_ActiveGroup_DragDrop(object sender, DragEventArgs e)
{
    Function_Button draggedItem;

    /* Check if the dragged item is one of the allowed dragged item TYPES. */
    draggedItem = (Function_Button)e.Data.GetData(type);

    if (draggedItem != null)
    {
       //DO STUFF
    }
}

我正在设置我自己的StringDataFormats,当我开始寻找我需要的信息时,我使用DataView.GetDataAsync()读取,但是如何才能直接访问UWP中拖动的UIElement对象?

2 个答案:

答案 0 :(得分:1)

我不确定这是否是最佳方式,但它有效。

首先,您需要处理DragStarting事件,并将UIElement存储在DataPackage属性公开的Data内。 DataPackage类型似乎非常依赖文件和文件格式,但幸运的是它有一个由属性Properties公开的通用字典。

<local:YourElement CanDrag="True" DragStarting="dragStarting">

</local:YourElement>

private void dragStarting(UIElement sender, DragStartingEventArgs args)
{
   args.Data.Properties.Add("anykeyworks", sender);
} 

接下来,您将按如下方式处理Drop事件:

<local:YourOtherElement AllowDrop="True" DragOver="dragOver" Drop="drop">

</<local:YourOtherElement>

private void drop(object sender, DragEventArgs e)
{
   UIElement element = e.DataView.Properties["anykeyworks"] as UIElement;
}

private void dragOver(object sender, DragEventArgs e)
{
   e.AcceptedOperation = DataPackageOperation.Copy;
}

如果您没有实现DragOver处理程序,则不会触发Drop事件。

答案 1 :(得分:-1)

正如您所知,UWP中的拖放功能与WinForms中的拖放功能不同。在UWP应用中,我们拖放的不是UIElement,而是DataPackage。因此,我们无法直接访问拖动的UIElement对象。

我不确定为什么要获取拖放的UIElement对象。如果您想在放弃时进行一些检查,我认为您可以检查由DataPackageView class属性公开的DataView的内容。

有关UWP中拖放功能的详细信息,请参阅Drag and drop以及GitHub上的官方Drag and drop sample