コピーと貼り付け

コピーと貼り付けは、ユーザーがアプリ間またはアプリ内でデータを交換するための基本的な方法です。 この記事では、クリップボード API を使用して WinUI アプリにコピーと貼り付けを実装する方法について説明します。 データのコピー、切り取り、貼り付け、クリップボードの変更の追跡、DataPackage クラスを使用してさまざまなデータ形式を処理する方法について説明します。

注

これらの API は、Windows ランタイム (WinRT) API を介して他のデスクトップ アプリでも使用できます。 詳細については、「Call Windows ランタイム API in desktop apps」を参照してください。

組み込みのクリップボードのサポートを確認する

多くの場合、クリップボード操作をサポートするためにコードを記述する必要はありません。 アプリの作成に使用できる既定の XAML コントロールの多くは、既にクリップボード操作をサポートしています。

セットアップを行う

まず、アプリにWindows.ApplicationModel.DataTransfer名前空間を含めます。 次に、DataPackage オブジェクトのインスタンスを追加します。 このオブジェクトには、ユーザーがコピーするデータと、含めるプロパティ (説明など) の両方が含まれます。

using Windows.ApplicationModel.DataTransfer;
...
var dataPackage = new DataPackage();

コピーと切り取り

コピーと切り取り ( 移動とも呼ばれます) の動作はほぼ同じです。 RequestedOperation プロパティを使用して、必要な操作を選択します。

// copy 
dataPackage.RequestedOperation = DataPackageOperation.Copy;
// or cut
dataPackage.RequestedOperation = DataPackageOperation.Move;

コピーしたコンテンツを設定する

次に、ユーザーが選択したデータを DataPackage オブジェクトに追加できます。 このデータが DataPackage クラスでサポートされている場合は、DataPackage オブジェクトの対応するメソッドのいずれかを使用できます。 SetText メソッドを使用してテキストを追加する方法を次に示します。

dataPackage.SetText("Hello World!");

最後の手順では、静的な SetContent メソッドを呼び出して、DataPackage をクリップボードに追加します。

Clipboard.SetContent(dataPackage);

貼り付け

クリップボードの内容を取得するには、静的 な GetContent メソッドを呼び出します。 このメソッドは、コンテンツを含む DataPackageView を返します。 このオブジェクトは、DataPackage オブジェクトとほぼ同じですが、その内容は読み取り専用です。 そのオブジェクトを使用すると、 AvailableFormats メソッドまたは Contains メソッドを使用して、使用可能な形式を識別できます。 次に、対応する DataPackageView メソッドを呼び出してデータを取得できます。

async void OutputClipboardText()
{
    DataPackageView dataPackageView = Clipboard.GetContent();
    if (dataPackageView.Contains(StandardDataFormats.Text))
    {
        string text = await dataPackageView.GetTextAsync();
        // To output the text from this example, you need a TextBlock control
        TextOutput.Text = "Clipboard now contains: " + text;
    }
}

クリップボードへの変更を追跡する

コマンドのコピーと貼り付けに加えて、クリップボードの変更を追跡することもできます。 これを行うには、クリップボードの ContentChanged イベントを 処理します。

Clipboard.ContentChanged += async (s, e) => 
{
    DataPackageView dataPackageView = Clipboard.GetContent();
    if (dataPackageView.Contains(StandardDataFormats.Text))
    {
        string text = await dataPackageView.GetTextAsync();
        // To output the text from this example, you need a TextBlock control
        TextOutput.Text = "Clipboard now contains: " + text;
    }
};