C# 將內容拖曳至 WinUI3 應用程式中 教學

在之前的 C# 將內容、檔案拖曳至 WinForm 應用程式中 這篇文章有介紹 WinForms 的拖曳方式,但是在 WinUI3 中稍有不同,本篇來示範 WinUI3 的使用方式。

開啟一個新的 WinUI3 專案,在原先的 MainWindow.xaml 程式碼中加入一個新的 TextBox 元件,等等我們會讓文字資訊可以被拖曳到此輸入框中:
    
<?xml version="1.0" encoding="utf-8"?>
<Window
    x:Class="WinUi3Test0309.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
        <Button x:Name="myButton" Click="myButton_Click">Click Me</Button>
        <TextBox x:Name="MyTextBox"></TextBox>
    </StackPanel>
</Window>
    

在 MainWindow.xaml.cs 中,只有三個步驟要做:
  • 允許 Drop
  • 在 DragOver 事件中判斷來源資料型態(在 WinForms 中是 DragEnter)
  • 在 Drop 中處理資料
    
MyTextBox.AllowDrop = true;

MyTextBox.DragOver += (sender, args) =>
{
    // 判斷是否是文字
    if (args.DataView.Contains(StandardDataFormats.Text))
    {
        args.AcceptedOperation = Windows.ApplicationModel.DataTransfer.DataPackageOperation.Copy;
    }
    
};

MyTextBox.Drop += (sender, args) =>
{
    if (!args.DataView.Contains(StandardDataFormats.Text)) return;
    var deferral = args.GetDeferral();
    var text = args.DataView.GetTextAsync().AsTask().Result;
    MyTextBox.Text = text;
    
    deferral.Complete(); // 不加這個介面會卡在拖曳狀態
};

    

留言