Как я могу скопировать содержимое WPF FlowDocument InlineUIContainer?
У меня есть WPF FlowDocument, который имеет несколько InlineUIContainers, это простые InlineUIContainers, которые содержат стилизованную кнопку с некоторым текстом в Button.Content. Когда я копирую текст и InlineUIContainer, содержащий кнопку из FlowDocument, в TextBox, кнопка не копируется.
Можно каким-то образом преобразовать встроенную кнопку или преобразовать кнопку в текст в вставленных текстовых данных. Я попытался использовать событие FlowDocument.DataObject.Copying, но я не могу найти какие-либо хорошие примеры того, как использовать это или даже если это правильное направление.
Спасибо
1 ответ
У меня была та же проблема, и мне удалось заставить работать что-то вроде следующего:
public class MyRichTextBox : RichTextBox
{
public MyRichTextBox()
: base()
{
CommandManager.RegisterClassCommandBinding(typeof(MyRichTextBox),
new CommandBinding(ApplicationCommands.Copy, OnCopy, OnCanExecuteCopy));
}
private static void OnCanExecuteCopy(object target, CanExecuteRoutedEventArgs args)
{
MyRichTextBox myRichTextBox = (MyRichTextBox)target;
args.CanExecute = myRichTextBox.IsEnabled && !myRichTextBox.Selection.IsEmpty;
}
private static void OnCopy(object sender, ExecutedRoutedEventArgs e)
{
MyRichTextBox myRichTextBox = (MyRichTextBox)sender;
Clipboard.SetText(GetInlineText(myRichTextBox));
e.Handled = true;
}
private static string GetInlineText(RichTextBox myRichTextBox)
{
StringBuilder sb = new StringBuilder();
foreach (Block b in myRichTextBox.Document.Blocks)
{
if (b is Paragraph)
{
foreach (Inline inline in ((Paragraph)b).Inlines)
{
if (inline is InlineUIContainer)
{
InlineUIContainer uiContainer = (InlineUIContainer)inline;
if (uiContainer.Child is Button)
sb.Append(((Button)uiContainer.Child).Content);
}
else if (inline is Run)
{
Run run = (Run)inline;
sb.Append(run.Text);
}
}
}
}
return sb.ToString();
}
}
Конечно, это очень упрощенно - вы, вероятно, создадите подкласс Button и определите интерфейсную функцию, такую как "GetCopyToClipboardText", вместо того, чтобы иметь код "как получить текст из кнопки" внутри richtextbox.
В этом примере копируется весь текст внутри richtextbox - было бы более полезно, если бы только выбранная часть текстового поля была скопирована в буфер обмена. Этот пост дает пример того, как этого добиться.