Каковы мои варианты размещения документов в WPF? - PullRequest
9 голосов
/ 30 июня 2010

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

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

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

B. Пишите все с нуля, используя TextFormatter.

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

Мой вопрос:

Есть ли какая-либо альтернатива, которая позволит мне использовать всю мощь FlowDocument, которая покрывает 90% моих потребностей в макете, и писать только код, необходимый для реализации остальных 10%?

РЕДАКТИРОВАТЬ: повторяемый аспект FlowDocument имеет решающее значение для меня. Я понимаю, что я запрашиваю как обновляемый контент, так и точный контроль над макетом, что несколько противоречиво. Тем не менее, я знаю, что это можно сделать - я написал простую реализацию с использованием TextFormatter, которая выполняет то, что я хочу, но я бы СКОЛЬКО использовал FlowDocument с каким-то расширением, чтобы избежать переопределения каждой функции.

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

Ответы [ 3 ]

6 голосов
/ 18 июля 2010

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

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

альтернативный текст http://i.msdn.microsoft.com/dynimg/IC66504.png

Я не совсем уверен, что вы подразумеваете под «потоком историй в стиле журнала». 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 (откуда я получил изображение)

Наслаждайся собой:)

1 голос
/ 21 июля 2010

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

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

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

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

0 голосов
/ 23 июля 2010

Мы используем 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

...