2013年2月22日金曜日

【WPF】RichTextBoxのテキスト取得


RichTextBoxで絶賛悩み中.
こんな質めんどくさいものは使いたくはないが
入力できて装飾もできるコントロールはこれだからなぁ.

まずRichTextBoxの構造が分からなかった.
普通のTextBoxみたいにそのままテキストを出し入れできるわけでなく,
コンテナみたいなかんじでいろいろな要素を中に持っている.
UIとしては綺麗にまとまっているが,中身はすさまじい.
MSDNでわかりやすい図があった.

http://msdn.microsoft.com/ja-jp/library/ee681613%28v=vs.95%29.aspxより転載

なるほど,RichTextBoxというのはBlockというものの集合体であり,
BlockというものはInlineというものの集合体なのか.

で,RichTextBoxというコントロールの中ではBlockは
Blockを継承したParagraphというクラスを用いる.

InlineBoldItalicなどといったクラスを用いると.

ここで,Blockは改行ごとに作られる.
例えば
aaaaaaaa
bbbbbbbbbb
ccccccc
というテキストを入力すれば,

aaaaaaaaというブロック,
bbbbbbbbbbというブロック,
cccccccというブロック

がRichTextBoxの下にあるということになる.


そしてブロックの構成要素であるInlineは
装飾を施したごとに作成される.
abcdefghijklmn
というブロックであれば,

abというインライン(ノーマル)
cdeというインライン(ボールド)
fgというインライン(ボールド+イタリック)
hijkというインライン(イタリック)
lmnというインライン(ノーマル)

となるようだ.
なるほど.



次にBlockやInlineのテキストを取得する方法.
これにはTextRangeというクラスを用いる.
Block系のクラスにもInline系のクラスにも
Textパラメータなぞなく,TextBlockなどでやってた取得方法が通用しない.


これでブロックのテキストが取得される.
インラインのテキストを取得する場合は↑ソースのblockをInlineとして考えればいい.

RichTextBoxのすべてのテキストを取得する場合は


さらに細かくなるが,すべてのInline要素を取得していくとしよう.
BlockからInline要素の取得は
Paragraph.Inlinesプロパティを使う
あとはBlockと同様の扱い方となる.

RichTextBoxの構造がネスト構造になっているおかげで
取得する方もネストして行かないといけない.


これで装飾ごとにRichTextBoxのテキストを取得できた.

0 件のコメント:

コメントを投稿