如何使用通用Windows应用程序中的拖放功能将文本从一个Textblock移动到另一个Textblock?

时间:2017-01-15 15:09:57

标签: c# visual-studio visual-studio-2015 win-universal-app windows-10-universal

我知道如何设置CanDrag和AllowDrop等属性,并定义DragOver方法和Drop方法。 我只是不知道在Drop方法中写些什么。

1 个答案:

答案 0 :(得分:1)

  

如何使用拖放功能将文本从一个文本块移动到另一个文本块

我们可以为来源Textblock定义DragStarting事件,并在DragStartingEventArgs中保存来源Textblock的文字,以便在拖动过程中进行转移。并在目标Textblock drop时接受该文字。阅读DragEventHandler中的文字并将其设置为目标Textblock

我在这里写了一个简单的示例,将文本从txtsource移到附加到txttarget

XAML代码:

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="30">
    <Border BorderBrush="Azure" BorderThickness="2">
        <TextBlock x:Name="txtsource" Text="I'm the first textblock" CanDrag="True" DragStarting="txtsource_DragStarting"  />
    </Border>
    <Border BorderBrush="Azure" BorderThickness="2" Margin="20" AllowDrop="True" >
        <TextBlock x:Name="txttarget" Text="I'm the second textblock" Drop="txttarget_Drop"  Height="50" Width="400"  AllowDrop="True" DragEnter="txttarget_DragEnter"/>
    </Border>
</StackPanel>

背后的代码

  private void txtsource_DragStarting(UIElement sender, DragStartingEventArgs args)
  {
      args.Data.SetText(txtsource.Text);
  }

  private async void txttarget_Drop(object sender, DragEventArgs e)
  {
      bool hasText = e.DataView.Contains(StandardDataFormats.Text);
      e.AcceptedOperation = hasText ? DataPackageOperation.Copy : DataPackageOperation.None;
      if (hasText)
      {
          var text = await e.DataView.GetTextAsync();
          txttarget.Text +="\n"+ text;
      }
  }
  private void txttarget_DragEnter(object sender, DragEventArgs e)
  {
      bool hasText = e.DataView.Contains(StandardDataFormats.Text);
      e.AcceptedOperation = hasText ? DataPackageOperation.Copy : DataPackageOperation.None;
      if (hasText)
      {
          e.DragUIOverride.Caption = "Drop here to insert text";
      }
  }

我使用DragOver事件来帮助定义哪个区域可以删除。更多细节请参考official sample的方案2。