XAML C#语言|如何在WinUI 3 / UWP中使用自定义DataPackage实现拖放功能

nwsw7zdq  于 2022-12-07  发布在  C#
关注(0)|答案(2)|浏览(207)

我正在使用微软template studio(explanation here)中实现的拖放服务。我想,我了解它的工作方式,并且已经阅读了微软提供的基本拖放工具的文档,但仍然不知道,如何自定义我的DD。
我想通过使用DD移动UIElement来传输从自定义类派生的对象,并且根据Microsoft的文档,我应该以某种方式自定义DataPackage。我的问题是,我真的不明白,在哪里以及如何将我的自定义对象 Package 到DataPackage中。
我认为以下问题的作者也有过非常相似的问题:

  1. It is unclear how to create a custom DataPackage for drag-and-drop #2669
  2. StackOverflow question
    谢谢你的帮助!
yquaqz18

yquaqz181#

当涉及到自定义数据时,DataPackage只支持IRandomAccessStream和标量类型的实现,这里包括string。你可以找到更多的细节here
您有两个选项:把你的数据放在IRandomAccessStream的一个示例中,或者放在一个字符串中。前者适合于大量的数据。让我们假设我们使用后者来简化。

private void DragStarting(UIElement sender, DragStartingEventArgs args)
{
     string data = SerializeMyData();          
     e.Data.SetData("MyDataFormat", objData);
}

要点:

  • SerializeMyData是一个将对象转换为字符串的方法,它可以是XML、JSON等。
  • “MyDataFormat”是一个标识符,您将使用它来查找您的数据。请注意,剪贴板/拖放/共享机制支持多种数据类型和同时传输的内容。例如,Word将复制的所选内容作为它自己的格式化类型,纯文本,RTF文本,HTML文本,一次全部。

然后在拖放目标中,获取您自己格式的数据:

private async void Drop(object sender, DragEventArgs e)
{
    var obj = await e.Data.GetView().GetDataAsync("MyDataFormat"); 
    //Deserialize it anyway you wish.           
}
um6iljoc

um6iljoc2#

您可以通过DragStartEventArgs(args)参数(DragStarting事件)中DataPackage对象的.Properties集合“打包”任何自定义(数据)对象;例如:

Foo foo = new Foo();

// .Properties is a <string,object> dictionary.
args.Data.Properties.Add( "FooData", foo );

通过DragEventArgs(e)参数中的DataPackageView对象,恢复目标的Drop事件中的对象;例如:

var foo = e.DataView.Properties[ "FooData" ] as Foo;

相关问题