none
【C#】WPFのRichTextBoxの書式設定について RRS feed

  • 質問

  • お世話になっています。

    C#の勉強を始めて3ヶ月程度なのですが、社内で使用するデスクトップアプリケーションをWPFで

    作成する仕事を任されてしまいました。

    開発関係の部署ではないので、相談できる方がおらず、詰んでいる状態なのでアドバイスをお願い致します。

    WPFでアプリケーションを作成しているのですが、RichTextBoxコントロールにOutlookメールの

    本文をコピー&ペーストした場合にOutlook側で設定している書式がRichTextBox側に反映されてしまいます。

    他のアプリケーションからRichTextBoxにペーストする際に、テキストデータのみをペーストする方法はないのでしょうか。

    下記のように「Ctrl + V」をPreviewKeyDownイベントで識別して一旦変数に格納する方法を思いついたのですが、

    この場合、フォーカスをロストするまで無限にループしてしまい、実用できるものではありませんでした。

            private void RichTextBox_01_PreviewKeyDown(object sender, KeyEventArgs e)
            {
                if (Keyboard.Modifiers == ModifierKeys.Control && Keyboard.IsKeyDown(Key.V))
                {
                    string temp_Textvar = Clipboard.GetText();

                    FlowDocument f_Doc = RichTextBox_01.Document;
                    TextRange t_Range = new TextRange(f_Doc.ContentStart, f_Doc.ContentEnd);
                    t_Range.Text = temp_Textvar;
                    t_Range.ApplyPropertyValue(Run.FontSizeProperty, "11");
                }
            }

    上記の方法でなくてもかまいませんので、解決方法があればご教授いただけないでしょうか。

    よろしくお願い致します。

    ※文字列をチェックして着色する処理が必須要件なので、TextBoxコントロールに変更することはできません。


    2015年12月7日 2:01

回答

  • こういう風にしてみるとか。

    .xamlにてRichTextBoxのCommandBindingsのPasteにバインドして

    <RichTextBox ...>
        <RichTextBox.CommandBindings>
            <CommandBinding Command="Paste" Executed="OnPaste"/>
        </RichTextBox.CommandBindings>
    </RichTextBox>

    .xaml.csにて貼り付け処理の実装を。

    private void OnPaste(object sender, ExecutedEventArgs e) {
        var text = Clipboard.GetText();
        this.RichTextBox1.Selection.Text = text;
        e.Handled = true; // 処理済みとしてマークすることで既定の処理を防ぐ
    }
    • 回答としてマーク kekoshBrain 2015年12月8日 1:45
    2015年12月7日 2:35

すべての返信

  • こういう風にしてみるとか。

    .xamlにてRichTextBoxのCommandBindingsのPasteにバインドして

    <RichTextBox ...>
        <RichTextBox.CommandBindings>
            <CommandBinding Command="Paste" Executed="OnPaste"/>
        </RichTextBox.CommandBindings>
    </RichTextBox>

    .xaml.csにて貼り付け処理の実装を。

    private void OnPaste(object sender, ExecutedEventArgs e) {
        var text = Clipboard.GetText();
        this.RichTextBox1.Selection.Text = text;
        e.Handled = true; // 処理済みとしてマークすることで既定の処理を防ぐ
    }
    • 回答としてマーク kekoshBrain 2015年12月8日 1:45
    2015年12月7日 2:35
  • ご教授いただいた方法で実現したかった処理が実装できました。

    e.Handled = true;

    とすると、イベントに元々割り当てられている処理を実行せずに終了することが

    できるんですね。勉強になりました。

    大変助かりました。ありがとうございました。

    2015年12月8日 1:49