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
或右键单击上下文菜单都会触发此事件。循环是由于您尝试 SetContent
或 Flush
导致 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();
}
我正在使用 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
或右键单击上下文菜单都会触发此事件。循环是由于您尝试 SetContent
或 Flush
导致 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();
}