Обтекание текстом расширяет столбец, чтобы соответствовать тексту - PullRequest
4 голосов
/ 10 мая 2009

Я определил сетку просто:

<Grid Margin="0,5,0,0">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="50"></ColumnDefinition>
    <ColumnDefinition Width="50"></ColumnDefinition>
    <ColumnDefinition Width="48"></ColumnDefinition>
    <ColumnDefinition Width="Auto"></ColumnDefinition>
   </Grid.ColumnDefinitions>

Тогда я пытаюсь связать некоторый контент, подобный этому:

<TextBlock TextWrapping="Wrap" Grid.Column="3" Text="{Binding Text}">

Установите так, текст не будет переноситься. Это просто расширяет колонку, чтобы соответствовать тексту. Если в последнем столбце я установил фиксированную величину ширины, перенос будет работать как положено. Проблема в том, что если пользователь расширяет окно, столбец остается фиксированного размера. Как я могу получить размер столбца динамически с шириной сетки, но все еще обернуть текст в нем?

Ответы [ 5 ]

5 голосов
/ 01 июля 2011

Я обнаружил один неприятный случай, который может обойтись даже с Width="*", и это когда у вас есть IsSharedSizeScope= true.

<Border BorderBrush="Red" BorderThickness="1">
    <StackPanel Grid.IsSharedSizeScope="True">

        <Grid HorizontalAlignment="Stretch">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" SharedSizeGroup="G1"/>
                <ColumnDefinition Width="Auto" SharedSizeGroup="G2" />
                <ColumnDefinition Width="*"  SharedSizeGroup="G3" />
            </Grid.ColumnDefinitions>

            <TextBlock Text="Col0" Grid.Column="0" Margin="0,0,5,0"/>
            <TextBlock Text="Col1" Grid.Column="1" Margin="0,0,5,0"/>

            <TextBlock Text="A B C D E F G H I J K L M N O P Q R S T U V W X Y Z" TextWrapping="Wrap" Grid.Column="2"/> 
        </Grid>

    </StackPanel>                   

</Border>

Это не будет перенесено, но если вы измените Grid.IsSharedScopeSize на false, тогда это произойдет.

Решение еще не найдено, но это может быть еще одной причиной, по которой оно не будет работать.

5 голосов
/ 04 августа 2009

Ширина "*" будет равномерно разделять оставшееся пространство между столбцами, используя "*". Если у вас есть один столбец с Width="*", этот столбец получит все оставшееся пространство. Если у вас есть 2 столбца с Width="*", каждый получит половину оставшегося пространства.

Вот хорошая статья о размере сетки , которая включает в себя размер звезды.

1 голос
/ 04 сентября 2009

Попробуйте это:

<Grid Margin="0,5,0,0">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="50"></ColumnDefinition>
    <ColumnDefinition Width="50"></ColumnDefinition>
    <ColumnDefinition Width="48"></ColumnDefinition>
    <ColumnDefinition Name="ParentColumn" Width="Auto"></ColumnDefinition>
   </Grid.ColumnDefinitions>
   <TextBlock TextWrapping="Wrap" Grid.Column="3" Text="{Binding Text}"
      MaxWidth="{Binding ActualWidth, ElementName=ParentColumn}">
0 голосов
/ 28 октября 2010

Вы должны использовать Авто только в том случае, если хотите изменить размер столбца / строки в зависимости от содержимого указанного столбца / строки. Если вы хотите "назначить оставшуюся часть пространства", используйте "*". В вашем случае TextBlock должен знать, сколько места у него есть до точного измерения, чтобы он мог указать, куда переносить текст.

0 голосов
/ 10 мая 2009

Установите его ширину равной "*"

...