Последовательность обтекания плиток в FlowDocument - PullRequest
0 голосов
/ 04 июня 2019

Возможно ли, чтобы FlowDocument содержал последовательность листов фиксированного размера, которые обертываются?

Я пытался использовать Floater, но могу получить только следующий эффект.Обратите внимание, что плитки имеют фиксированный размер , за исключением плиток на правом краю (которые упали, а не упали на следующую строку): Tiles wrapping but being scrunched on the edge

<Window>
    <Window.Resources>
        <Style TargetType="Floater" BasedOn="{StaticResource {x:Type Floater}}">
            <Setter
                Property="HorizontalAlignment"
                Value="Left"/>
            <Setter
                Property="LineHeight"
                Value="1in"/>
            <Setter
                Property="Margin"
                Value="0"/>
            <Setter
                Property="Padding"
                Value="0"/>
            <Setter
                Property="Width"
                Value="1in"/>
        </Style>
    </Window.Resources>
    <FlowDocument>
        <Paragraph>
            <TextBlock>
                Hello, world!
            </TextBlock>
            <Floater>
                <BlockUIContainer>
                    <Grid
                        Width="1in"
                        Height="1in"
                        Background="Blue">
                        <TextBlock
                            Foreground="Red">
                            Tile
                        </TextBlock>
                    </Grid>
                </BlockUIContainer>
            </Floater>
            <Floater>
                ...
            </Floater>
            ...etc
        </Paragraph>
    </FlowDocument>
</Window>

1 Ответ

0 голосов
/ 04 июня 2019

Я нашел два возможных решения:

InlineUIContainer

InlineUIContainer само по себе, кажется, опускается на следующую строку по мере необходимости.Поэтому, когда вы используете их вместе:

<FlowDocument>
    <Paragraph >
        <InlineUIContainer>
            ...
        </InlineUIContainer>
        ...
    </Paragraph>
</FlowDocument>

... тогда вы получите что-то вроде этого: Tiles shown to be wrapping with InlineUIContainer

Если вы положите InlineUIContainer s внутри TextBlock внутри Paragraph (и установите TextBlock.TextWrapping="Wrap"), тогда плитки больше не будут равномерно распределяться по горизонтали, а будут складываться сбоку, как вы могли ожидать.И вы можете получить нулевой пробел между ними, убедившись, что между любыми закрывающими и открывающими тегами InlineUIContainer нет разрывов строк или других пробелов.Тогда это выглядит так: Tiles shown to be wrapping and stacked tightly

Figure

Figure, по-видимому, предназначено больше для позиционирования изображений, но путем установки его Margin иPadding до нуля и присвоения ему фиксированного Width и установки его HorizontalAnchor:

<Window>
    <Window.Resources>
        <Style TargetType="Figure">
            <Setter
                Property="HorizontalAnchor"
                Value="ColumnLeft"/>
            <Setter
                Property="Margin"
                Value="0"/>
            <Setter
                Property="Padding"
                Value="0"/>
            <Setter
                Property="Width"
                Value="1in"/>
        </Style>
    </Window.Resources>
    <FlowDocument>
        <Paragraph>
            <Figure>
                <BlockUIContainer>
                    ...
                </BlockUIContainer>
            </Figure>
            ...
        </Paragraph>
    </FlowDocument>
</Window>

... тогда вы получите что-то подобное в режиме прокрутки: Tiles shown to be wrapping with Figure

* 1040.s взаимодействуют с другими строками в Paragraph.Они могут привязываться только к одной стороне или к другой (в соответствии со свойством HorizontalAnchor), а не к потоке.

По этим причинам я думаю, что InlineUIContainer может быть лучшим решением.

...