WPF FlowDocument - listitems中的样式段落

时间:2011-10-07 06:03:57

标签: wpf margin listitem paragraph

我正在尝试设置FlowDocument的样式,使其行为与在MS Word中输入文本时的行为相同。现在,我在listitem中遇到段落边距。我让它看起来就像我想要的那样:

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: How to convert FlowDocument to rtf

我的问题是: 有没有其他方法可以为常规段落设置不同的页边距,并为listitem的子句设置段落?我需要使用常规样式来解决这个问题,而不是直接在段落上设置样式或边距属性。

2 个答案:

答案 0 :(得分:2)

我发现自己有办法做到这一点。 这是更新的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中的常规段落不同。

答案 1 :(得分:0)

FlowDocument是一个“实时”文档。你可以与它互动。 RTF不是,它是静态表示文件格式。 将文本范围保存到rtf时,您基本上会在触发器发生之前获得控件内部状态的快照。 也就是说,你可以尝试定义一个新的类ListParagraph来派生drom Paragraph并将样式应用到你的新ListParagraph,就像你应用于Paragraph一样。 这样做的代价是你需要在导出到RTF之前通过代码(而不是Paragraphs)创建ListParagraphs或者用内存中的ListParagraph替换Paragraph。