Используя FlowDocument WPF, я работал в ко многим ситуациям, где мне нужно больше управления расположением документа, от простых вещей (верхние колонтитулы страницы и нижние колонтитулы) к более сложному (сноски, поток истории стиля журнала) к еще более сложному (литературные тексты со справочным критическим материалом - одно из моих фактических требований).
Однако насколько я могу сказать, мои единственные опции:
A. Используйте FlowDocument и потеряйте весь контроль над расположением.
B. Запишите всему с нуля использование TextFormatter.
A не является опцией для меня, и B требует реализации десятки методов, и что еще более важно, потеря питания FlowDocument и его связанных Средств просмотра.
Мой вопрос:
Действительно ли там кто-либо альтернативен, который позволит мне усиливать питание FlowDocument, который покрывает 90% моих потребностей расположения, и только напишите код, необходимый для реализации других 10%?
Править: reflowable аспект FlowDocument крайне важен для меня. Я понимаю, что прошу и reflowable довольный и точное управление расположением, которые являются несколько противоречащими. Однако я знаю, что это может быть сделано - я записал использованию реализации скелета TextFormatter, который выполняет то, что я хочу, но я ОЧЕНЬ использовал бы FlowDocument с некоторым расширением, чтобы не повторно реализовывать каждую функцию.
РЕДАКТИРОВАНИЕ 2: кажется, что то, что я действительно после, является рычагом во внутренний paginator FlowDocument, так, чтобы я мог дать ему инструкции для разметки пользовательского класса. Там какой-либо путь состоит в том, чтобы сделать это?
Текстовая система в WPF в первую очередь предназначена для игры с текстом для использования в пользовательских интерфейсах, а не для создания сложных документов со сносками, заголовками и т.п. Однако фреймворк был написан так, что если вы хотите добавить пользовательскую функциональность, вы можете это сделать.
Первая проблема: сноски и прочее, что находится в строке с текстом. WPF предоставляет 2 класса для размещения UIElement
ов в тексте: InlineUIContainer
and BlockUIContainer
. Я бы подумал о том, чтобы написать собственный пользовательский элемент управления, специально разработанный для поведения сноски или чего-то подобного, и поместить его в один из этих двух классов. Я нашел эту удобную диаграмму отношений на MSDN, если вам нужно больше информации о том, что что принимает (ссылки внизу страницы)
(источник: 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
ы своими собственными элементами управления (например, встроенной кнопкой со сноской)
Надеюсь, это поможет! Я не знаю, что именно вы пытаетесь сделать, но я думаю, что вы можете по-прежнему использовать FlowDocument
и просто использовать большое количество средств работы с текстом, предоставляемых WPF, а если вам нужна дополнительная функциональность/опции компоновки, создайте новый класс, наследующий Block
или Inline
или любой другой, и напишите дополнительные вещи в нем, чтобы воспользоваться всеми преимуществами работы, которую .net может сделать для вас.
Если вам нужно больше информации, вы можете прочитать больше о текстовых вещах в WPF на MSDN:
Очень длинная статья о том, как использовать FlowDocument
Модель текстового содержимого, используемая в WPF (откуда я взял изображение)
Наслаждайтесь собой :)
Ответ на самом деле прост: FixedDocument
Теперь с FixedDocument вы потеряете экранную гибкость FlowDocument, но получите поддержку практически для всего, а DocumentViewer - отличное средство просмотра для фиксированных документов.
Кроме того, вы можете сохранять фиксированные документы в XPS и просматривать их вне приложения.
Этот код показывает, как взять FLowDocument и преобразовать его в FixedDocument с верхними, нижними колонтитулами и полями. Я думаю, не должно быть слишком сложно адаптировать этот код для поддержки сносок.
Мы используем Apache FOP, реализацию XSL-FO с открытым исходным кодом, для создания таких типов документов. На самом деле он написан на Java, но мы используем IKVM для его запуска на .NET. IKVM - это реализация Java с открытым исходным кодом, которая работает на .NET. Она работает довольно хорошо. FOP создает PDF, RTF и несколько других форматов.
Недостатком является то, что вам придется изучить XSL-FO, но это несложно, если вы привыкли к старой школе HTML.