0

我正在使用 Xaml 和 C# 开发 UWP 应用程序。这是我的问题。

我的应用程序使用 RichEditBox 来处理文本。每次用户关闭应用程序时,从应用程序内复制的剪贴板内容都会被清除。要解决这个问题,我必须使用 Clipboard.Flush()。好的,但是当我不控制复制过程时会发生什么。如果用户按 Crtl+C 或使用 RichEditBox 上下文菜单复制文本,我无法拦截该操作。另一种解决方法是使用 Clipboard.ContentChanged。但是当我在这种情况下使用它时,由于某种原因,该方法会创建一个无限循环。请,任何帮助。

4

1 回答 1

1

每次用户关闭应用程序时,从应用程序内复制的剪贴板内容都会被清除。

通过我这边的测试,如果使用Clipboard.SetContent()方法复制内容到剪贴板,应用关闭后内容默认不会被清除。但是,如果使用Ctrl+C或右键单击上下文菜单,如您所述,复制到剪贴板的内容将被清除。

另一种解决方法是使用 Clipboard.ContentChanged。但是当我将它用于这种情况时,由于某种原因,该方法会创建一个无限循环

要解决此问题,Clipboard.ContentChanged事件句柄会有所帮助,因为两者 Ctrl+C或右键单击上下文菜单都会触发此事件。循环是由您尝试 SetContentFlush导致ContentChanged再次触发引起的。在调用这些方法之前,您可以尝试删除事件订阅。例如:

private async void Clipboard_ContentChanged(object sender, object e)
{
    Clipboard.ContentChanged -= Clipboard_ContentChanged;
    DataPackageView clipboardContent = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent();
    var dataPackage = new DataPackage();
    dataPackage.SetText(await clipboardContent.GetTextAsync());
    Clipboard.SetContent(dataPackage);
    Clipboard.ContentChanged += Clipboard_ContentChanged;
   // Clipboard.Flush();
}

创建一个空的 UWP,添加一个 RichEditBox,使用 Ctrl+C 从其中复制内容并关闭应用

实际上,您可以在应用程序的暂停事件中将内容重新设置到剪贴板,该事件将在应用程序关闭之前触发。

 private async void OnSuspending(object sender, SuspendingEventArgs e)
 {
     var deferral = e.SuspendingOperation.GetDeferral();
     //TODO: Save application state and stop any background activity 
     DataPackageView clipboardContent = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent();
     var dataPackage = new DataPackage();
     dataPackage.SetText(await clipboardContent.GetTextAsync());
     Clipboard.SetContent(dataPackage);          
  // Clipboard.Flush(); 
     deferral.Complete();
 }
于 2018-05-15T06:28:00.563 回答