none
RichTextBoxの文字列選択 RRS feed

  • 質問

  • いつもお世話になります。
    VisualC#2010、WindowsXPでの動作について質問があります。
    WPFのコードビハインドでのRichTextBoxの選択文字列の色変更について教えてください。

    Formの場合には、
    private void button1_Click(object sender, EventArgs e)
    {
     //RichTextBoxの選択された文字列の色を赤くする
     this.richTextBox1.SelectionColor = Color.Red;
    }
    なのですが、WPFには、richTextBox1.SelectionColorがありません。
    代わりに使うのがForegroundで、
     this.richTextBox1.Foreground = System.Windows.Media.Broushes.Red;
    とすれば、文字列全体の色を変更することはできます。

    ただこれだと文字列全体を変更してしまって、選択範囲に限ることができません。
    選択範囲のみを抜き出すのには、どうしたらよいでしょう?
    アドバイスお願いします。

    2011年4月3日 3:49

回答

  • 先述の、TextRange.ApplyPropertyValue のサンプルコードをよくご覧ください。

    まず、ここで TextRange を得るために FlowDocument を作っていますが、その後 FlowDocument は出てきませんよね? RichTextBox.Selection の時も同様に、RichTextBox 自体は TextRange(TextSelection) を取得するためだけに必要です。

    次に、ApplyPropertyValue の第一引数に注目してください。私は「FontWeight プロパティを設定」と言いましたが、第一引数に「FontWeight そのもの」は渡していませんよね? この第一引数を検索して MSDN を確認してみてください。

    • 回答としてマーク d-kot 2011年4月5日 15:23
    2011年4月5日 3:06

すべての返信

  • TextRange オブジェクトを取得または生成して(RichTextBox で選択されている範囲なら RichTextBox.Selection プロパティで取得できます)、それの ApplyPropertyValue メソッドを呼び出します。
    2011年4月3日 4:59
  • Hongliangさん、ありがとうございました。
    TextRangeは、開始点と終了点を入れることはわかりました。
    TextRange textrange = new TextRange(richTextBox1.Document.ContentStart,
    // TextPointer to the end of content in the RichTextBox.
    richTextBox1.Document.ContentEnd);
    ならオーケーでした。

    ここに選択範囲をいれるので、
    TextRange textrange = new TextRange(richTextBox1.Selection.ApplyPropertyValue, ここになにを入れる?);
    のようにしてみたのですが、終了点になにをにいれるのかわかりません。開始点も、これでよいのかわかりませんでした。

    さらに、
    this.mainRichtextBox.Foreground = System.Windows.Media.Broushes.Red;
    が、
    textrange.Select.Foreground = System.Windows.Media.Broushes.Red;
    のようになるのかと思いますが、このようにtextrangeを使うことができるのでしょうか?
    重ねてですみませんがアドバイスいただければと。

    2011年4月3日 13:47
  • TextRange textrange = new TextRange(richTextBox1.Selection.ApplyPropertyValue, ここになにを入れる?);
    のようにしてみたのですが、終了点になにをにいれるのかわかりません。開始点も、これでよいのかわかりませんでした。

    いやいやいや、RichTextBox.Selection プロパティは TextSelection オブジェクトで、これは TextRange クラスの派生クラスですから、TextSelection は TextRange と同様に扱えます。わざわざ TextSelection から TextRange をひねり出す必要はありません(選択範囲の一部だけを、とか言うのでない限り)。

    this.mainRichtextBox.Foreground = System.Windows.Media.Broushes.Red;
    が、
    textrange.Select.Foreground = System.Windows.Media.Broushes.Red;
    のようになるのかと思いますが、

    いえ、違います。代入の代わりに、ApplyPropertyValue を使うんです。

    MSDN の TextRange.ApplyPropertyValue メソッド (System.Windows.Documents) のページにサンプルコードがあります。このサンプルでは(選択範囲ではなくドキュメント全体の)FontWeight プロパティを設定していますが、Foreground プロパティでも話は変わりません。

    2011年4月3日 14:37
  • Hongliangさん、コメントありがとうございます。
    ぜんぜん理解が違っていたみたいです…。

    RichTextBox.SelectionプロパティはTextSelection オブジェクトで、これは TextRange クラスの派生クラスですから、TextSelection は TextRange と同様に扱えます。
    ということですが、これは、

    TextSelection textselection = new TextSelection(ここになに?, ここはなに?);
    って書けるということでしょうか?

    選択範囲の一部だけを使う予定はないです。

    「代入の代わりに、ApplyPropertyValue を使う」の意味を理解できませんでした。代入とは、どこの場所でしょう?

    MSDNのTextRange.ApplyPropertyValue メソッド (System.Windows.Documents)のページのサンプルコードは、FlowDocumentについてのもので、うまく応用できませんでした。
    もうすこしヒントをお願いします。

    2011年4月4日 9:18
  • TextSelection textselection = new TextSelection(ここになに?, ここはなに?);
    って書けるということでしょうか?

    いいえ。次のように書けるってことです。

    TextRange range = richTextBox1.Selection;

    「代入の代わりに、ApplyPropertyValue を使う」の意味を理解できませんでした。代入とは、どこの場所でしょう?
    textrange.Select.Foreground = System.Windows.Media.Broushes.Red;

    とかやろうとしてましたよね?

    MSDNのTextRange.ApplyPropertyValue メソッド (System.Windows.Documents)のページのサンプルコードは、FlowDocumentについてのもので、うまく応用できませんでした。

    FlowDocument をどうこうしている部分は見なくて構いません。ApplyPropertyValue の呼び出し部分だけ注目してください。


    2011年4月4日 9:57
  • Hongliangさん、コメントありがとうございます。
    TextRange textrange = RichTextBox1.Selection;
    textrange.ApplyPropertyValue(TextElement.FontSizeProperty, FontWeights.Bold);
    というのが、フォントの場合のようで、これに倣うと、
    TextRange textrange = RichTextBox1.Selection;
    textrange.ApplyPropertyValue(TextElement.FontColor, FontColor.Red);
    とかになるのかなと思うのですが、そのような命令は見当たりませんでした。
    2011年4月4日 13:27
  • えーと、文字の色を変えるのに Foreground プロパティ使うことは最初のご投稿からご存じでしたよね? なんでいきなり FontColor なるものが出てくるんでしょう?

    あと、この機会に「依存関係プロパティ」もお調べになると WPF の理解が進むと思います。

    2011年4月4日 13:54
  • Hongliangさん、コメントありがとうございます。
    TextRange textrange = RichTextBox1.Selection;
    textrange.ApplyPropertyValue(RichTextBox1.Foreground = System.Windows.Media.Brushes.Red);

    textrange.ApplyPropertyValue(RichTextBox1.Foreground,System.Windows.Media.Brushes.Red);

    textrange.ApplyPropertyValue(RichTextBox1.Foreground.Transform,System.Windows.Media.Brushes.Red);
    などいろいろトライしていますが、ぜんぜんだめです。
    どれをやってもダメなので、FontColorとかなんとかという別のものがあるのではないかと考えました。まあFontColorもないんですけど。
    他のことはいいので、まずはApplyPropertyValueに絞ってアドバイスお願いします。

    2011年4月4日 14:38
  • 先述の、TextRange.ApplyPropertyValue のサンプルコードをよくご覧ください。

    まず、ここで TextRange を得るために FlowDocument を作っていますが、その後 FlowDocument は出てきませんよね? RichTextBox.Selection の時も同様に、RichTextBox 自体は TextRange(TextSelection) を取得するためだけに必要です。

    次に、ApplyPropertyValue の第一引数に注目してください。私は「FontWeight プロパティを設定」と言いましたが、第一引数に「FontWeight そのもの」は渡していませんよね? この第一引数を検索して MSDN を確認してみてください。

    • 回答としてマーク d-kot 2011年4月5日 15:23
    2011年4月5日 3:06