9

ユーザーがファイルをクリップボードにコピーできる C# Windows ユニバーサル アプリを作成します。ただし、アプリを閉じると、クリップボードの内容が失われます。ユーザーがクリップボードの内容を簡単に失う可能性がある場合、使いやすさは最悪です。他の従来の Windows アプリケーションのように、アプリのクリップボードの内容を永続化する方法はありますか?

サンプルコード:

public static void CopyFileToClipboard(StorageFile file) {
    DataPackage dp = new DataPackage();
    dp.RequestedOperation = DataPackageOperation.Copy;
    dp.SetStorageItems(new List<StorageFile>() { file });
    Clipboard.SetContent(dp); // not available after app closed
    Clipboard.Flush();
}

public static void CopyTextToClipboard(string text) {
    DataPackage dp = new DataPackage();
    dp.RequestedOperation = DataPackageOperation.Copy;
    dp.SetText(text); // available after app closed
    Clipboard.SetContent(dp);
    Clipboard.Flush();
}

//I have tried to copy the file to the app folder first but it has nothing changed.
public async static void CacheAndCopyFileToClipboard(StorageFile file) {
    DataPackage dp = new DataPackage();
    dp.RequestedOperation = DataPackageOperation.Copy;
    var xfile = await ApplicationData.Current.LocalFolder.CreateFileAsync(file.Name);
    await file.CopyAndReplaceAsync(xfile);
    dp.SetStorageItems(new List<StorageFile>() { xfile });
    Clipboard.SetContent(dp); // not available after app closed
    Clipboard.Flush();
}

問題は、アプリが閉じていてもユーザーがファイルを貼り付けられるように、ファイルをクリップボードに配置するにはどうすればよいかということです。

編集: すべての Windows ユニバーサル アプリの問題のようです。たとえば、Windows フォト アプリで画像をコピーすると、フォト アプリの実行中にのみ貼り付けることができます。この奇妙な動作がアプリのデフォルトの動作であるべきだとは想像できません。その奇妙な動作の理由がわからないので、バグのように見えます。

Edit2: 問題の新しい例 (Joe300 のフィードバックに感謝)。文字列では機能しますが、StorageFile では機能しません (最初にローカル アプリ フォルダーにコピーされた場合でも)。Flush()コマンドがファイルで機能しない理由は何ですか? ファイルが使用されるときに考慮すべき特別なことはありますか (パーミッションなど)?

4

1 に答える 1

5

Flushアプリのシャットダウン後にコンテンツを利用できるようにするには、呼び出しを追加する必要があります。

コンテンツをクリップボードに追加し、ソース アプリから DataPackage オブジェクトを解放します。この方法により、アプリケーションがシャットダウンした後もコンテンツを利用できるようになります。

次も設定する必要がありますRequestedOperation

dp.RequestedOperation = DataPackageOperation.Copy;
try
{
    Windows.ApplicationModel.DataTransfer.Clipboard.SetContent(dp);
    Clipboard.Flush();
}
catch (Exception ex)
{
   // Copying data to Clipboard can potentially fail - for example, if another application is holding Clipboard open                  
}

これ以外に、 を操作するためのオプションは他にありませんClipboard

于 2015-08-05T12:39:45.890 に答える