2010-11-26 30 views
1

私の目的は、MS-Word.Wpfに似たエディタを作れるようにすることです。RichTextBoxは素晴らしいコントロールです。ScrollViewerの中に配置することで、 )しかし、私はページのようなMS-Wordが必要です.1つの効果的な方法はおそらく、richtextbox上の複数のページのルックアンドフィールを作成するようなscrollViewerにスタイルを適用することですが、それを行う方法はわかりません。 documentViewerを使用することです。固定ページ内で、ヘッダ(キャンバス)、ボディ(WpfRichTextBox)、フッター(キャンバス)を作成します。そして、複数のページを作成し、RichTextBoxのsizechangedイベントを購読することで、手動でページ付けを行っています。つまり、高さが変更されたときにページを別のページに移動します。あなたはこれを行う上でより良いアプローチを見ていますか?複数のリッチテキストボックスを使用するとパフォーマンスが低下しますか?複数のwpfリッチテキストボックスを使用したMS Wordのページ設定

答えて

1

@WpfProgrammerこれは私が言う良いアプローチです。 1000sのページがあるとすれば、間違いなくパフォーマンスの問題が発生します。この問題を回避するには、デマンドページングを行う必要があります。

仮想ページング:
1.あなたは意志がページを含むページ・テーブルを構築する必要があります。各ページには、ページのコントロール、イメージ、位置、ディメンション、およびスタイルに関する情報が含まれます。 [すべてのシリアライズ可能なデータ]

2. ページのすべてのデータをデシリアライズし、 RichTextBoxでページを作成する必要があります。仮想ページは ですが、 がレンダリングされる予定のプリキャッシュページはありません。 の例を挙げてください。もし私が第1ページにいたら。次に、 次の3つの連続したページを に順次デシリアライズし、 コレクションに追加します。次に、連続したページ の移動に対してこの プロシージャを繰り返します。 最も頻繁に使用されるコレクションを使用してロジックを追加しています。それは は十分に速くなります。 1000ページです。 汚れていない、または訪問していないものを倒すことができます ページ。これにより、パフォーマンスはわずかに低下する可能性があります。 パフォーマンスがそれほど遠い場合は、低いハードウェアにもっと気をつけてください。 次に、 クリーニングを検討する必要があります。

3.クリーニング - クリーニングは、 のLFUページを識別し、 を削除するプロセスです。これは、 のパフォーマンスがより顕著である場合に非常に役立ちます。

+0

仮想化アプローチのページに感謝します。私にとって、エディタあたりの最大ページ数は50を超えません。また、2〜3人のエディタが立ち上げられるかもしれませんが、仮想化は実際に全体のパフォーマンスを向上させると思います。私が見ている課題は、基本的なアルゴリズムがありますが、ページネーションです。あるリッチテキストボックスから別のリッチテキストボックスにブロックを移動し、削除操作中にコンテンツを流すことも難題です。また、このシナリオで仮想化を行うこともやりにくいです。MS WordのようなrichTextBoxページを簡単に表示する方法はありますか? – WpfProgrammer

+0

richTextBoxのサイズ変更イベントを聞いて、ブロックを1つのrtbから別のrtbにプッシュします。このプロセスはすべてのrtbで繰り返されます。削除中に、削除が発生したページでは、以降のrtbのブロックをすべてこのページを再調整します。 – WpfProgrammer

+0

1)「ブロックを1つのリッチテキストボックスから別のリッチテキストボックスに移動し、削除操作中にコンテンツを流すことも課題です」 - これはレイアウトです。そのようにする必要があります。 2)「MS WordのようなrichTextBoxのページを表示する方法はありませんか?」 - 私の考える限り、特別な方法はありません。 –

1

こんにちは。 richTextBoxの最小の高さ、幅をA4サイズに設定します(言います)。 RichTextBox Size Changedイベントを購読します。コンテンツが超過するとすぐにこのイベントが発生します。次に、前のページの最後のブロックを取り出し、次のページの最初のブロックにプッシュします(ページが存在しない場合は、新しいページを最初のブロックとして追加します)また、フォーカスを新しいページに変更する必要があります(最後のRTBでEnterキーを押すと、新しいページにフォーカスがあることが予想されるため)。いくつかのページ(たとえば2番目)のブロックを削除すると、ページ下部のブロックをすべてこのページに追加する必要があります。これにより、ページングロジックがブロックを再度押し下げて調整します。さらなる助けが必要な場合は、コードの一部を共有することができます。

関連する問題