9

WPF の FlowDocument を使用して、単純なもの (ページ ヘッダーとフッター) からより複雑なもの (脚注、雑誌スタイルのストーリー フロー)、さらに複雑なもの (重要な装置を備えた文学テキスト - 私の実際の要件の1つ)。

ただし、私が知る限り、私の唯一のオプションは次のとおりです。

A. FlowDocument を使用すると、レイアウトに対するすべての制御が失われます。

B. TextFormatter を使用してすべてをゼロから作成する。

A は私にとって選択肢ではなく、B は数十のメソッドを実装する必要があり、さらに重要なことに、FlowDocument とそれに関連付けられた Viewer の機能が失われます。

私の質問は:

レイアウトのニーズの 90% をカバーする FlowDocument の機能を活用し、残りの 10% を実装するために必要なコードのみを記述できる代替手段はありますか?

編集: FlowDocument のリフロー可能な側面は、私にとって非常に重要です。リフロー可能なコンテンツとレイアウトの正確な制御の両方を求めていることは理解していますが、これはやや矛盾しています。ただし、それが可能であることはわかっています.TextFormatterを使用して必要最小限の実装を作成しました.

EDIT 2:私が本当に望んでいるのは、カスタムクラスをレイアウトするための指示を与えることができるように、FlowDocumentの内部ページネーターへのフックであるようです。それを行う方法はありますか?

4

3 に答える 3

6

WPF のテキスト システムは、主に、脚注やヘッダーなどを含む複雑なドキュメントを作成するためではなく、UI で使用するテキストを操作するために設計されています。ただし、フレームワークは、カスタム機能を追加したい場合にできるように作成されています。

最初の問題: テキストとインラインの脚注など。WPF は、 をテキストに入れるための 2 つのクラスを提供UIElementします:InlineUIContainerBlockUIContainer. 脚注または同様の動作をするように特別に設計された独自のカスタム コントロールを作成し、それらの 2 つのクラスのいずれかに配置することを検討します。何を受け入れるかについての詳細情報が必要な場合は、MSDN でこの便利でダンディな関係図を見つけました (リンクはページの下部にあります)。

代替テキスト
(ソース: microsoft.com )

「雑誌的な話の流れ」というのが何を指しているのかよくわかりません。Block'FlowDocument' は、 から派生したクラス (上記のチャートで青色で示されているもの) を使用可能なスペースに自動的に配置し、FloaterおよびFigureinline 要素を使用して、オブジェクトの周りにテキストを 'フロー' にすることができます。ヘッダーとフッター機能にFigureandを使用することもできます。Floater

コード例を次に示します。

    <FlowDocumentScrollViewer>
        <FlowDocument>
            <Paragraph>
                5 green bottles standing on the wall,
                5 green bottles standing on the wall, 
                and if one green bottle was to accidentally fall,
                there would be 4 green bottles standing on the wall;
            </Paragraph>
            <Paragraph>
                4 green bottles standing on the wall,
                4 green bottles standing on the wall, 
                <Floater HorizontalAlignment="Left" Width="250">
                    <BlockUIContainer>
                        <Button>This button is in a Floater</Button>
                    </BlockUIContainer>
                </Floater> 
                and if one green bottle was to accidentally fall,
                there would be 3 green bottles standing on the wall;
            </Paragraph>
            <Paragraph>
                3 green bottles standing on the wall,
                3 green bottles standing on the wall, 
                and if one green bottle was to accidentally fall,
                there would be 2 green bottles standing on the wall;
            </Paragraph>

            <Paragraph>
                2 green bottles standing on the wall,
                2 green bottles standing on the wall,
                and if one green bottle was to accidentally fall,
                <InlineUIContainer>
                    <Button>This Button is inline</Button>
                </InlineUIContainer> 
                there would be 1 green bottle standing on the wall...
            </Paragraph>
        </FlowDocument>
    </FlowDocumentScrollViewer>

s を独自のカスタム コントロールに置き換えることができButtonます (例: インライン ボタンを脚注のタンに置き換えます)。

このコードは次のようになります。 DesignerView

それが役立つことを願っています!あなたが何をしようとしているのか正確にはわかりませんがFlowDocument、WPFで提供される大量のテキスト操作機器を引き続き使用して使用することができ、追加の機能/レイアウトオプションが必要な場合は、継承Blockまたは新しいクラスを作成しますInlineまたは何でも、.netがあなたのためにできるすべての仕事を利用するためにそこに余分なものを書きます. さらに情報が必要な場合は、MSDN で WPF のテキストに関する詳細を読むことができます。

FlowDocument の使い方に関する非常に長い記事

WPF で使用されるテキスト コンテンツ モデル (画像の取得元)

楽しんでください:)

于 2010-07-18T18:01:55.930 に答える
1

答えは実際には簡単です:FixedDocument

これで、FixedDocumentを使用すると、FlowDocumentの画面上の柔軟性が失われますが、ほぼすべてのサポートが得られ、DocumentViewerは固定ドキュメントの優れたビューアです。

また、固定ドキュメントをXPSに保存して、アプリの外部で表示することもできます。

このコードは、FLowDocumentを取得し、ヘッダー、フッター、およびマージンを含むFixedDocumentに変換する方法を示しています。脚注もサポートするようにこのコードを適応させることはそれほど難しいことではないと思います。

于 2010-07-21T09:49:16.127 に答える
0

We use Apache FOP, an open source XSL-FO implementation, to create these types of documents. It's actually written in Java but we use IKVM to run it on .NET. IKVM is an open source implementation of Java that runs on .NET. It works pretty nicely. FOP produces PDF, RTF, and several other formats.

The downside is you'll need to learn XSL-FO, but it's not difficult if you're used to old school HTML.

http://xmlgraphics.apache.org/fop/

http://www.ikvm.net/

http://www.ikvm.net/uses.html

http://www.w3schools.com/xslfo/default.asp

于 2010-07-23T03:05:14.867 に答える