Динамическая высота определения строки - PullRequest
2 голосов
/ 30 июля 2009

У меня есть простой элемент управления xaml со следующим определением Grid Row:

<Grid.RowDefinitions>
            <RowDefinition Height="15*" />
            <RowDefinition Height="60*" />
            <RowDefinition Height="20*" />
            <RowDefinition Height="20*" />
            <RowDefinition Height="15*" />
</Grid.RowDefinitions>

Строки 1-3 содержат текстовый блок, в котором может быть текст, а может и нет. В коде позади я хочу минимизировать RowDefinition, если нет текста. По сути, в моем коде есть следующее:

if(textblock.Text != ""){
   grid.RowDefinitions[elementRow].Height = new GridLength(20, GridUnitType.Star);
}
else{
   grid.RowDefinitions[elementRow].Height = new GridLength(0, GridUnitType.Star);
}

Я хочу, чтобы строки 0 и 4 остались такими, как они определены в xaml. К сожалению, это не работает, даже если в текстовом блоке в строке 2 ничего не отображается.

Я что-то не так делаю.

Любая помощь приветствуется,

Джеймс

Ответы [ 3 ]

9 голосов
/ 30 июля 2009

Это не ответ на ваш вопрос, просто некоторая информация.

* в поле Высота (или ширина столбцов) означает, что ширина строки (или столбца) Высота = "*" (или Ширина = "*") займет оставшуюся часть пространства. Так что если у вас есть сетка с 4 строками в сетке с высотой = "100", если вы сделаете это:

<Grid.RowDefinitions>
            <RowDefinition Height="10" />
            <RowDefinition Height="10" />
            <RowDefinition Height="10" />
            <RowDefinition Height="*" />
</Grid.RowDefinitions>

Ширина строки Height = "*" составит 70 DIU (независимых от устройства единиц).

Добавление числа перед звездочкой (Высота = "2 *") работает только в том случае, если звездочкой используется более одной строки, число перед звездочкой указывает, сколько места займет эта конкретная строка (2 * = дважды столько же, 3 * в три раза больше, так далее ...). I. E.:

<Grid.RowDefinitions>
            <RowDefinition Height="10" />
            <RowDefinition Height="10" />
            <RowDefinition Height="2*" /> <!-- this row will be twice as tall as the one below -->
            <RowDefinition Height="*" />
</Grid.RowDefinitions>

Здесь 3-й ряд будет иметь высоту 54 DIU (в два раза больше, чем 4-й ряд, который имеет высоту приблизительно 26 DIU), обе высоты составляют сумму 80, которая является остальной частью пространства сетки (10 + 10 + 26 + 54 = 100, высота сетки).

Кстати, я согласен с ответом Чарли.

9 голосов
/ 30 июля 2009

Не используйте звездную запись, используйте Авто для ваших RowDefinitions. Если TextBlock.Text пуст, установите Visibility для TextBlock в Visibility.Collapsed. Строка сетки будет автоматически уменьшена до нуля.

0 голосов
/ 30 июля 2009

Вы можете поместить свои элементы в UniformGrid с Columns = "1" и сделать видимость TextBox свернутой, когда получите пустой текст.

 <UniformGrid Columns="1">
    <TextBlock Text="AAAA" Visibility="Collapsed" Grid.Row="0"/>
    <TextBlock Text="BBBBB" Grid.Row="1"/>
    <TextBlock Text="CCCCC" Grid.Row="2"/>
    <TextBlock Text="DDDDD" Grid.Row="3"/>
    <TextBlock Text="EEEE" Grid.Row="4"/>
</UniformGrid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...