在UWP中获取在Drop事件中实际丢失的UIElement对象

3

我正在将我编写的WinForms应用程序转换为UWP,据我所知,拖放功能略有不同。以下是我从WinForms应用程序中获取“拖动”对象的代码,它是一个名为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个回答

4

我不确定这是最好的方式,但它有效。

首先,您需要处理DragStarting事件,并将将要拖动的UIElement存储在由Data属性公开的DataPackage中。 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事件。


很好的解决方法,但不幸的是,如果我想将其保留在UI代码中与DataPackage分开,这对我没有用。好吧,我猜这就是hacky code。这似乎是UWP的正确方式。 - Neme

-1

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

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

关于UWP中的拖放功能的更多信息,请参见拖放,以及GitHub上的官方拖放示例


为什么我想知道这个?也许是为了防止一个项目被拖到自己身上?尽管原始项目在拖动时实际上是不可见的,但这似乎是可能的。而且显然我甚至无法修复它。微软干得好。 - Neme
正如我所说,我们无法直接访问拖动的UIElement对象。但是您始终可以检查由DataView属性公开的DataPackageView类的内容。@Frank Rem的答案就是这样做的。它使用e.DataView.Properties["anykeyworks"]获取了UIElement - Jay Zuo
我知道。我发现了一个bug,导致当我从GridView拖动某个东西时,我可以将其放回到原来的占位符上(它是不可见的-显然是意外的行为)。在发布软件之前,你可能需要修复你的错误。但我已经在处理两个不同的错误了,这并不是什么不寻常的事情,这就是我所说的星期二。几乎所有的东西都充满了漏洞,我从未见过这样的情况。你总是不得不做各种各样的hack和workaround。这几乎就像没有人真正使用UWP一样。 - Neme
如果我要报告每一个漏洞,那么我的全职工作就是报告漏洞了。 - Neme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接