UWP C#。在 RichEditBox 中拦截复制命令

UWP C#. Intercept Copy command in RichEditBox

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

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

Every time the user close the app the clipboard content copied from within the app is cleared.

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

The other workaround is to use Clipboard.ContentChanged. But when I use it for this situation, for some reason, the method creates an infinite loop

要解决此问题,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();
}

Create an empty UWP, add a RichEditBox, copy content from it using Ctrl+C and close the app

实际上,您可以在应用程序 suspending event 中将内容重新设置为剪贴板,这将在应用程序关闭之前触发。

 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();
 }