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

Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top