6

いくつかの InlineUIContainers を持つ WPF FlowDocument があります。これらは単純な InlineUIContainers であり、Button.Content にテキストを含むスタイル付きのボタンが含まれています。ボタンを含むテキストと InlineUIContainer を FlowDocument から TextBox にコピーすると、ボタンがコピーされません。

何とかインラインボタンを変換したり、貼り付けたテキストデータでボタンをテキスト化することは可能です。FlowDocument.DataObject.Copying イベントを使用してみましたが、これを使用する方法について、またはこれが正しい方向である場合でも、適切なサンプルが見つからないようです。

ありがとうございました

4

1 に答える 1

15

私は同じ問題を抱えていて、次のようなものをうまく機能させることができました:

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」などのインターフェイス関数を定義することになります。

この例では、リッチテキスト ボックス内のすべてのテキストをコピーします。テキスト ボックスの選択した部分だけをクリップボードにコピーすると、より便利になります。この投稿では、それを達成する方法の例を示します。

于 2010-03-05T13:36:44.080 に答える