WPF FlowDocument - стиль абзацев в элементах списка - PullRequest
1 голос
/ 07 октября 2011

Я пытаюсь стилизовать FlowDocument, чтобы он вел себя так же, как при вводе текста в MS Word.Прямо сейчас я застрял с полями абзаца в списке элементов.Я заставил это выглядеть примерно так, как я хочу:

FlowDocument preview

, используя этот XAML:

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <FlowDocument.Resources>

        <Style TargetType="Paragraph">
            <Setter Property="Margin" Value="0,0,0,20" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Margin, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListItem}, AncestorLevel=1}}" Value="0">
                    <Setter Property="Margin" Value="5" />
                </DataTrigger>
            </Style.Triggers>
        </Style>

        <Style TargetType="{x:Type List}">
            <Setter Property="Margin" Value="5" />
        </Style>

    </FlowDocument.Resources>

    <List>
        <ListItem>
            <Paragraph>Bullet1</Paragraph>
        </ListItem>
        <ListItem>
            <Paragraph>Bullet2</Paragraph>
            <List>
                <ListItem>
                    <Paragraph>Bullet2.1</Paragraph>
                    <List>
                        <ListItem>
                            <Paragraph>Punkt 2.1.1</Paragraph>
                        </ListItem>
                    </List>
                </ListItem>
            </List>
        </ListItem>
    </List>

    <Paragraph>Regular paragraph 1</Paragraph>
    <Paragraph>Regular paragraph 2</Paragraph>

</FlowDocument>

Моя проблема сейчас в том, что мне также нужнобыть в состоянии преобразовать FlowDocument в RTF и заставить его хорошо выглядеть.При конвертации в RTF кажется, что триггеры стиля игнорируются.

Я использую этот метод для преобразования в RTF: Как преобразовать FlowDocument в rtf

Мой вопрос: есть ли другой способ установить различные поля для обычного абзацаа абзац, который является потомком списка?Мне нужно решить эту проблему, используя общие стили, а НЕ устанавливая атрибуты Style или Margin непосредственно в абзацах.

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

Я нашел способ сделать это сам. Вот обновленный раздел FlowDocument.Resources:

<Style TargetType="Paragraph">
    <Setter Property="Margin" Value="0,0,0,20" />
</Style>

<Style TargetType="ListItem">
    <Style.Resources>            
        <Style TargetType="Paragraph">
            <Setter Property="Margin"  Value="0,0,0,5" />
        </Style>
    </Style.Resources>
</Style>

<Style TargetType="{x:Type List}">
    <Setter Property="Margin" Value="5" />
</Style>

Это именно то, что я хотел сделать в первую очередь. Параграфы внутри ListItem теперь оформлены не так, как обычные абзацы в FlowDocument.

0 голосов
/ 11 октября 2011

FlowDocument - это «живой» документ.Вы можете взаимодействовать с ним.RTF нет, это формат файла статического представления.При сохранении textrange в rtf вы в основном получаете снимок внутреннего состояния элемента управления до того, как сработают триггеры.Тем не менее, вы можете попытаться определить новый класс ListParagraph, который выводит drom Paragraph, и применить стиль к вашему новому ListParagraph так же, как вы применили к Paragraph.Цена за это заключается в том, что вам нужно либо создать ListParagraphs по коду (вместо Paragraphs), либо заменить Paragraph на ListParagraph в памяти непосредственно перед экспортом в RTF.

...