2011-06-20 23 views
5

大量のリッチテキストをSQLデータベースに格納し、取得して表示する必要があります。リッチテキストを効率的に保存して表示する

1つのフォントは大丈夫ですが、フォントサイズ/太字/色が異なる必要があります。

今のところ、リッチテキストボックス(WPF)を表示するために使用しています。また、XamlWriter.Save/XamlReader.Parseを使用して、DBに格納する文字列にシリアル化しています。それはうまく動作しますが、RichTextBoxは基本的に使えないというテキストを表示するのがとても辛いです。

許容できるパフォーマンスですばやくこの方法を使用できますか?

私はGlyphRunオブジェクトを使って、各文字をビットマップとして描画し、宛先イメージなどに合わせてすべての配置要件を計算することを検討しています...しかし、単純な色付きのテキストでホイールを再作成することは、

EDIT: これまでのお返事ありがとうございました。申し訳ありません。

テキストはRichTextBoxからユーザーによって入力されますが、基本的には結果としてstringXamlWriter.Save(richTextBox.Document)がデータベースに保存されます。他のフィールド(double/intなど)もTextBoxからユーザによって入力されます。

ユーザーがデータベースに照会すると、上記の保存されたリッチテキストフィールドを含めて、データベース内のフィールドを使用して、色と書式が設定された読み取り専用リッチテキストページが生成されます。これらはFlowDocumentからSpan "[thisbook]"が何らかのデータベースエントリのIDを参照しているのと同様に、InlineUIContainerUIElementから派生したクラスをホストし、テキストでインライン化されたデータベースエントリを参照します。 MSDNによると、それはすべてTextBlockのテキストがあまりにも多いという。

このテキストレンダリングは本当に遅い部分ですが、その周りには方法がありません。私はその書式設定が必要です。それはWPF RichTextBoxがどのようにしているのかです:RichTextBoxに小さな単純なテキストを入力しても、タイピング、画面上に表示される文字の間に...今の

私はまだRichTextBox ESを使用しますが、私は(Paragraph/Section/Spanオブジェクト)メモリにレンダリングされたレイアウトの多くを維持し、私は少なくともを再描画するように注意しています変更/照会が行われたとき、またはデータベース・データの異なるビューがユーザーによって要求されたときに可能な書式付きテキストの量。

FormattedTextのために(それはまだ速くないのですが、それはOKですが、全体の構造(AvalonEditまたはFormattedTextまたはGlyphRun)を変更して、今それだけの価値は思えない、あまりにも多くの仕事、全体のシリアライゼーションXamlWriter.SaveとAPIとXamlReader.Parseは多くを簡素化し、 GlyphRun、フォーマットされたテキストをデータベースに保存するには、自分自身でファイル形式を用意する必要があります)。

OpenXML SDKを使用してMicrosoft Wordの.docxドキュメントを作成する可能性もありますが、Googleではレンダリングのパフォーマンスはあまり良くないと言います。InlineUIContainer内のテキストにUIElementを埋め込み、データベースに保存することが可能です(AvalonEditと同じ問題)。

+0

を? FixedDocumentを使用できますか? –

+1

どのくらいのテキストについて話していますか?私はFlowDocumentViewerの巨大なWPF FlowDocumentsを使って作業をしてきました。あなたはおそらくプロファイラを起動し、時間を費やしている場所を見てください。レンダリングテキスト* IS *はWPFにとって高価な操作ですが、奇妙なドキュメント構造やスタイル/色/フォント/ハイフネーションなどによってCPU計算レイアウトが壊れていないことを確認する必要があります。 – Armentage

答えて

1

RichTextBoxは非常にゆっくり(点在している)ので、投げ捨ててください。独自のテキストエディタを書く代わりにAvalonEditをチェックしてください。パフォーマンスは賢明です。RichTextBoxは赤ちゃんのようです。

それとも、読み取り専用、あなたがのTextBlockを試みることができるテキストが必要な場合 - それは簡単な書式設定をサポートします。テキストが最初の場所で発生したどのよう

<TextBlock> 
    <Run FontWeight="Bold">Hello</Run> 
    <Run Foreground="Green">World</Run> 
    <Run FontSize="24">!</Run> 
</TextBlock> 
+0

ありがとうございました。元の質問のEDITをご覧ください。 – SemMike

関連する問題