Pergunta
Eu tenho um controle XAML simples com a seguinte definição de grade Row:
<Grid.RowDefinitions>
<RowDefinition Height="15*" />
<RowDefinition Height="60*" />
<RowDefinition Height="20*" />
<RowDefinition Height="20*" />
<RowDefinition Height="15*" />
</Grid.RowDefinitions>
As linhas 1-3 cada segurar um bloco de texto que pode ou não pode ter texto nele. No código por trás Eu quero minimizar o RowDefinition se não houver texto. Essencialmente eu tenho o seguinte no meu código por trás:
if(textblock.Text != ""){
grid.RowDefinitions[elementRow].Height = new GridLength(20, GridUnitType.Star);
}
else{
grid.RowDefinitions[elementRow].Height = new GridLength(0, GridUnitType.Star);
}
Eu quero linhas 0 e 4 para ficar como eles são definidos no XAML. Infelizmente isso não funciona mesmo que não haja texto no bloco de texto na linha 2 nada é exibido.
Estou fazendo algo errado.
Qualquer ajuda é apreciada,
James
Solução
Não use a notação estrela, usar Auto para seus RowDefinitions. Se o TextBlock.Text está vazia, defina a visibilidade do TextBlock para Visibility.Collapsed. A linha de grade, então, automaticamente encolher para nada.
Outras dicas
Esta não é a resposta à sua pergunta, apenas algumas informações.
A * na altura (ou largura para colunas) significa que a linha (ou coluna) Largura Altura = "*" (ou Largura = "*") vai ocupar o resto do espaço. Então se você tem uma grade com 4 linhas em uma grade com height = "100", se você fizer isso:
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="10" />
<RowDefinition Height="10" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
A largura de linha Altura = "*" será de 70 UDE (unidades independentes do dispositivo).
Adicionar um número antes do asterisco (Height = "2 *") só funciona se houver mais de uma linha usando o asterisco, o número antes de o asterisco indica o quanto mais espaço vai demorar linha específica (2 * = duas vezes tanto, 3 * três vezes mais, assim por diante ...). 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>
Aqui, a 3ª fila terá uma altura de 54 UDE (duas vezes mais que a linha 4, que tem uma altura de 26 UDE aprox.), Ambas as alturas soma 80, que é o resto do espaço da grade (10 + 10 + 26 + 54 = 100, a altura da grelha).
BTW, eu concordo com a resposta de Charlie.
Você pode colocar seus itens dentro de um UniformGrid com colunas = "1" e fazer o TextBox Visibilidade para desmoronou quando você começa texto emptry.
<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>