UWP C #.Команда перехвата копирования в RichEditBox - PullRequest
0 голосов
/ 11 мая 2018

Я занимаюсь разработкой приложения UWP с использованием Xaml и C #. Здесь моя проблема.

Мое приложение использует RichEditBox для обработки текста. Каждый раз, когда пользователь закрывает приложение, содержимое буфера обмена, скопированное из приложения, очищается. Чтобы решить эту проблему, я должен использовать Clipboard.Flush (). Хорошо, но что происходит, когда я не контролирую процесс копирования. Если пользователь нажимает Crtl + C или использует контекстное меню RichEditBox для копирования текста, я не могу перехватить это действие. Другой обходной путь должен использовать Clipboard.ContentChanged. Но когда я использую его для этой ситуации, по какой-то причине метод создает бесконечный цикл. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 15 мая 2018

Каждый раз, когда пользователь закрывает приложение, содержимое буфера обмена, скопированное из приложения, очищается.

При тестировании на моей стороне, если использовать Clipboard.SetContent()метод для копирования содержимого в буфер обмена, содержимое не будет очищено по умолчанию после закрытия приложения.Но если использовать Ctrl+C или щелкнуть правой кнопкой мыши контекстное меню, как вы упомянули, копия содержимого в буфер обмена будет очищена.

Другим обходным решением является использование Clipboard.ContentChanged.Но когда я использую его для этой ситуации, по какой-то причине метод создает бесконечный цикл

Чтобы решить эту проблему, 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();
}

Создайте пустой 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();
 }
...