关闭的Windows Universal App的剪贴板内容

ctr*_*ron 7 c# windows-runtime win-universal-app windows-10 uwp

我编写了一个C#Windows Universal App,用户可以将文件复制到剪贴板中.但如果应用程序关闭,剪贴板内容就会丢失.如果用户可以如此轻松地丢失剪贴板内容,则可用性非常糟糕.有没有办法像任何其他经典的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();
}
Run Code Online (Sandbox Code Playgroud)

所以问题是如何将文件放到剪贴板中,以便即使应用程序关闭,用户也可以粘贴它?

编辑:似乎这是所有Windows Universal Apps的问题,例如,如果您在Windows照片应用程序中复制图片,则只能在Photo App运行时粘贴它.我无法想象这种奇怪的行为应该是Apps的默认行为.它看起来更像是一个bug,因为我认为没有理由这种奇怪的行为.

Edit2:问题的新例子(感谢Joe300的反馈意见).它适用于字符串但不适用于StorageFile(即使它首先复制到本地app文件夹).Flush()命令不能与文件一起使用的原因是什么?我在使用文件(权限,......)时会考虑一些特别的事情吗?

Wir*_*rie 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                  
}
Run Code Online (Sandbox Code Playgroud)

除此之外,真的没有任何其他选项可以操作Clipboard.

  • `Clipboard.Flush();` 需要在 `Clipboard.SetContent(dp);` 之后执行,以便在应用程序关闭后内容保留在剪贴板中。`剪贴板.SetContent(dp); 剪贴板.Flush();` (2认同)