Подтвердить что ты не робот

TextBlock TextWrapping не обертывание

Когда я помещаю TextBlock внутри горизонтально выровненной StackPanel, он не обертывается. Я понимаю, что это связано с тем, что доступная ширина StackPanel - это PositiveInfinity, но есть ли какие-либо обходные пути?

Мой макет намного сложнее, чем этот образец, поэтому я не могу удалить StackPanel или Горизонтальная ориентация. Я просто попытался воспроизвести простейший возможный пример, демонстрирующий поведение.

    <StackPanel Orientation="Horizontal">
        <Rectangle Width="50" Height="50" Fill="Blue" VerticalAlignment="Top" />
        <Rectangle Width="50" Height="50" Fill="Red" VerticalAlignment="Top" />
        <TextBlock TextWrapping="Wrap"
                Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus leo lectus, viverra ut lobortis vel, mollis eget lectus. Suspendisse laoreet consequat ultrices. Curabitur ultricies, tortor feugiat porttitor faucibus, lorem eros pretium nisl, eu ullamcorper mauris tortor sit amet augue." />
    </StackPanel>

Обновление: Ширина TextBlock должна быть динамической. Мне нужно, чтобы он перетекал с окном по мере его изменения.

Обновление 2: Добавлен еще один элемент в StackPanel, потому что мне нужны дети, расположенные горизонтально.

Обновление 3 (решение): Заменили StackPanel с помощью DockPanel.

<DockPanel>
    <DockPanel DockPanel.Dock="Top">
        <Rectangle Width="50" Height="50" Fill="Blue" VerticalAlignment="Top" DockPanel.Dock="Left" />
        <Rectangle Width="50" Height="50" Fill="Red" VerticalAlignment="Top" DockPanel.Dock="Left" />
        <TextBlock TextWrapping="Wrap"
                Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus leo lectus, viverra ut lobortis vel, mollis eget lectus. Suspendisse laoreet consequat ultrices. Curabitur ultricies, tortor feugiat porttitor faucibus, lorem eros pretium nisl, eu ullamcorper mauris tortor sit amet augue." />
    </DockPanel>
</DockPanel>
4b9b3361

Ответ 1

Это потому, что вы используете горизонтальную ориентацию на StackPanel. Это означает, что StackPanel предоставляет полную ширину каждому дочернему элементу управления, а затем выкладывает их горизонтально - даже если это означает превышение его ограниченной/видимой ширины. Поскольку нет ничего, чтобы ограничить ширину TextBlock, он не обертывается.

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

Ответ 2

Вместо StackPanel вы можете использовать сетку (которая, как объясняется, не ограничивает ее содержимое.). Сетка позволяет гораздо больший контроль над компоновкой элементов, чем делает StackPanel, и если ваше изображение свернуто, то столбец "auto" будет иметь ширину 0.

<DockPanel>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Rectangle Width="50" Height="50" Fill="Blue" VerticalAlignment="Top" />
        <TextBlock TextWrapping="Wrap" Grid.Column="1"
            Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus leo lectus, viverra ut lobortis vel, mollis eget lectus. Suspendisse laoreet consequat ultrices. Curabitur ultricies, tortor feugiat porttitor faucibus, lorem eros pretium nisl, eu ullamcorper mauris tortor sit amet augue." />
    </Grid>

</DockPanel>

Ответ 3

У меня есть несколько решений для этой проблемы.

1) привязка родительской ширины к ширине текстового блока. (im в следующем случае я рассматривал usercontrol как родительский).

<UserControl x:Class="WpfApplication1.MyWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" Name="userctrl">   
    <DockPanel>
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" HorizontalAlignment="Left" >
            <TextBlock TextWrapping="Wrap" MaxWidth="{Binding ElementName=userctrl,Path=ActualWidth}"
                Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus leo lectus, viverra ut lobortis vel, mollis eget lectus. Suspendisse laoreet consequat ultrices. Curabitur ultricies, tortor feugiat porttitor faucibus, lorem eros pretium nisl, eu ullamcorper mauris tortor sit amet augue." />

        </StackPanel>       
    </DockPanel>
</UserControl>

2) другое решение использует Grid вместо stackpanel

<UserControl x:Class="WpfApplication1.MyWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" Name="userctrl">   
    <DockPanel>
        <Grid DockPanel.Dock="Top" HorizontalAlignment="Left" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBlock TextWrapping="Wrap" 
                Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus leo lectus, viverra ut lobortis vel, mollis eget lectus. Suspendisse laoreet consequat ultrices. Curabitur ultricies, tortor feugiat porttitor faucibus, lorem eros pretium nisl, eu ullamcorper mauris tortor sit amet augue." />
            <TextBlock TextWrapping="Wrap" Grid.Column="1" Margin="20 0 0 0"
                Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus leo lectus, viverra ut lobortis vel, mollis eget lectus. Suspendisse laoreet consequat ultrices. Curabitur ultricies, tortor feugiat porttitor faucibus, lorem eros pretium nisl, eu ullamcorper mauris tortor sit amet augue." />

        </Grid>       
    </DockPanel>
</UserControl>

Ответ 4

Если бы вы были похожи на меня и задавались вопросом, почему Textblock все еще не обертывался после определения Width.

Попробуйте добавить MaxWidth в Textblock с тем же значением, что и ширина,

Это останавливает управление при росте в Width после запуска приложения.

Надеюсь, это поможет!