Каковы мои опции для макета документа в WPF?

Используя FlowDocument WPF, я работал в ко многим ситуациям, где мне нужно больше управления расположением документа, от простых вещей (верхние колонтитулы страницы и нижние колонтитулы) к более сложному (сноски, поток истории стиля журнала) к еще более сложному (литературные тексты со справочным критическим материалом - одно из моих фактических требований).

Однако насколько я могу сказать, мои единственные опции:

A. Используйте FlowDocument и потеряйте весь контроль над расположением.

B. Запишите всему с нуля использование TextFormatter.

A не является опцией для меня, и B требует реализации десятки методов, и что еще более важно, потеря питания FlowDocument и его связанных Средств просмотра.

Мой вопрос:

Действительно ли там кто-либо альтернативен, который позволит мне усиливать питание FlowDocument, который покрывает 90% моих потребностей расположения, и только напишите код, необходимый для реализации других 10%?

Править: reflowable аспект FlowDocument крайне важен для меня. Я понимаю, что прошу и reflowable довольный и точное управление расположением, которые являются несколько противоречащими. Однако я знаю, что это может быть сделано - я записал использованию реализации скелета TextFormatter, который выполняет то, что я хочу, но я ОЧЕНЬ использовал бы FlowDocument с некоторым расширением, чтобы не повторно реализовывать каждую функцию.

РЕДАКТИРОВАНИЕ 2: кажется, что то, что я действительно после, является рычагом во внутренний paginator FlowDocument, так, чтобы я мог дать ему инструкции для разметки пользовательского класса. Там какой-либо путь состоит в том, чтобы сделать это?

9
задан yclevine 23 July 2010 в 03:23
поделиться

3 ответа

Текстовая система в WPF в первую очередь предназначена для игры с текстом для использования в пользовательских интерфейсах, а не для создания сложных документов со сносками, заголовками и т.п. Однако фреймворк был написан так, что если вы хотите добавить пользовательскую функциональность, вы можете это сделать.

Первая проблема: сноски и прочее, что находится в строке с текстом. WPF предоставляет 2 класса для размещения UIElementов в тексте: InlineUIContainer and BlockUIContainer. Я бы подумал о том, чтобы написать собственный пользовательский элемент управления, специально разработанный для поведения сноски или чего-то подобного, и поместить его в один из этих двух классов. Я нашел эту удобную диаграмму отношений на MSDN, если вам нужно больше информации о том, что что принимает (ссылки внизу страницы)

alt text
(источник: microsoft.com)

Я не совсем понимаю, что вы имеете в виду под "потоком статей в журнальном стиле". 'FlowDocument' автоматически расположит Block-производные классы (все, что выделено синим на приведенной выше схеме) в доступном пространстве, и вы можете заставить текст "обтекать" объекты, используя Floater и Figure встроенные элементы. Вы также можете использовать Figure и 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>

Вы можете заменить Buttonы своими собственными элементами управления (например, встроенной кнопкой со сноской)

Этот код делает это: DesignerView

Надеюсь, это поможет! Я не знаю, что именно вы пытаетесь сделать, но я думаю, что вы можете по-прежнему использовать FlowDocument и просто использовать большое количество средств работы с текстом, предоставляемых WPF, а если вам нужна дополнительная функциональность/опции компоновки, создайте новый класс, наследующий Block или Inline или любой другой, и напишите дополнительные вещи в нем, чтобы воспользоваться всеми преимуществами работы, которую .net может сделать для вас. Если вам нужно больше информации, вы можете прочитать больше о текстовых вещах в WPF на MSDN:

Очень длинная статья о том, как использовать FlowDocument

Модель текстового содержимого, используемая в WPF (откуда я взял изображение)

Наслаждайтесь собой :)

6
ответ дан 3 November 2019 в 04:40
поделиться

Ответ на самом деле прост: FixedDocument

Теперь с FixedDocument вы потеряете экранную гибкость FlowDocument, но получите поддержку практически для всего, а DocumentViewer - отличное средство просмотра для фиксированных документов.

Кроме того, вы можете сохранять фиксированные документы в XPS и просматривать их вне приложения.

Этот код показывает, как взять FLowDocument и преобразовать его в FixedDocument с верхними, нижними колонтитулами и полями. Я думаю, не должно быть слишком сложно адаптировать этот код для поддержки сносок.

1
ответ дан 3 November 2019 в 04:40
поделиться

Мы используем Apache FOP, реализацию XSL-FO с открытым исходным кодом, для создания таких типов документов. На самом деле он написан на Java, но мы используем IKVM для его запуска на .NET. IKVM - это реализация Java с открытым исходным кодом, которая работает на .NET. Она работает довольно хорошо. FOP создает PDF, RTF и несколько других форматов.

Недостатком является то, что вам придется изучить XSL-FO, но это несложно, если вы привыкли к старой школе HTML.

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

http://www.ikvm.net/

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

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

0
ответ дан 3 November 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: