トップ回答者
RichTextBoxの文字列選択

質問
-
いつもお世話になります。
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;
とすれば、文字列全体の色を変更することはできます。ただこれだと文字列全体を変更してしまって、選択範囲に限ることができません。
選択範囲のみを抜き出すのには、どうしたらよいでしょう?
アドバイスお願いします。
回答
-
先述の、TextRange.ApplyPropertyValue のサンプルコードをよくご覧ください。
まず、ここで TextRange を得るために FlowDocument を作っていますが、その後 FlowDocument は出てきませんよね? RichTextBox.Selection の時も同様に、RichTextBox 自体は TextRange(TextSelection) を取得するためだけに必要です。
次に、ApplyPropertyValue の第一引数に注目してください。私は「FontWeight プロパティを設定」と言いましたが、第一引数に「FontWeight そのもの」は渡していませんよね? この第一引数を検索して MSDN を確認してみてください。
- 回答としてマーク d-kot 2011年4月5日 15:23
すべての返信
-
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を使うことができるのでしょうか?
重ねてですみませんがアドバイスいただければと。 -
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 プロパティでも話は変わりません。
-
Hongliangさん、コメントありがとうございます。
ぜんぜん理解が違っていたみたいです…。RichTextBox.SelectionプロパティはTextSelection オブジェクトで、これは TextRange クラスの派生クラスですから、TextSelection は TextRange と同様に扱えます。
ということですが、これは、TextSelection textselection = new TextSelection(ここになに?, ここはなに?);
って書けるということでしょうか?選択範囲の一部だけを使う予定はないです。
「代入の代わりに、ApplyPropertyValue を使う」の意味を理解できませんでした。代入とは、どこの場所でしょう?
MSDNのTextRange.ApplyPropertyValue メソッド (System.Windows.Documents)のページのサンプルコードは、FlowDocumentについてのもので、うまく応用できませんでした。
もうすこしヒントをお願いします。 -
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 の呼び出し部分だけ注目してください。
-
Hongliangさん、コメントありがとうございます。
TextRange textrange = RichTextBox1.Selection;
textrange.ApplyPropertyValue(TextElement.FontSizeProperty, FontWeights.Bold);
というのが、フォントの場合のようで、これに倣うと、
TextRange textrange = RichTextBox1.Selection;
textrange.ApplyPropertyValue(TextElement.FontColor, FontColor.Red);
とかになるのかなと思うのですが、そのような命令は見当たりませんでした。 -
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に絞ってアドバイスお願いします。 -
先述の、TextRange.ApplyPropertyValue のサンプルコードをよくご覧ください。
まず、ここで TextRange を得るために FlowDocument を作っていますが、その後 FlowDocument は出てきませんよね? RichTextBox.Selection の時も同様に、RichTextBox 自体は TextRange(TextSelection) を取得するためだけに必要です。
次に、ApplyPropertyValue の第一引数に注目してください。私は「FontWeight プロパティを設定」と言いましたが、第一引数に「FontWeight そのもの」は渡していませんよね? この第一引数を検索して MSDN を確認してみてください。
- 回答としてマーク d-kot 2011年4月5日 15:23