Как я могу скопировать содержание WPF FlowDocument InlineUIContainer?

У меня есть WPF FlowDocument, который имеет несколько InlineUIContainers, это простые InlineUIContainers, которые содержат стилизованную кнопку с некоторым текстом в Кнопке. Содержание. Когда я копирую текст и InlineUIContainer, содержащий кнопку от FlowDocument до TextBox, кнопка не копируется.

Возможно так или иначе преобразовать встроенную кнопку или преобразовать кнопку для отправки текстовых сообщений в данных вставленного текста. Я попытался использовать FlowDocument. DataObject. Событие Copying, но я, может казаться, не нахожу хороших образцов о том, как использовать это или даже если это - правильное направление.

Спасибо

6
задан Luke 26 October 2009 в 08:14
поделиться

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 - было бы более полезно, если бы только выбранная часть текстового поля была скопирована в буфер обмена. Этот пост дает пример того, как этого добиться.

13
ответ дан 8 December 2019 в 18:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: