Eu tenho um formulário WPF simples com um Grid
declarado no formulário. Isso Grid
tem um monte de linhas:
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MinHeight="30" />
<RowDefinition Height="Auto" Name="rowToHide" />
<RowDefinition Height="Auto" MinHeight="30" />
</Grid.RowDefinitions>
A linha nomeada rowToHide
contém alguns campos de entrada e quero ocultar essa linha depois de detectar que não preciso desses campos. É bastante simples definir apenas Visibility = Hidden
para todos os itens na linha, mas a linha ainda ocupa espaço no Grid
. Tentei definir Height = 0
os itens, mas não pareceu funcionar.
Você pode pensar assim: você tem um formulário, nele há uma lista suspensa que diz "Tipo de pagamento" e, se a pessoa selecionar "Dinheiro", você deseja ocultar a linha que contém os detalhes do cartão. Não é uma opção iniciar o formulário com este oculto já.
Respostas:
Row não tem uma propriedade Visibility, então como outros disseram, você precisa definir a Height. Outra opção é usar um conversor, caso você precise dessa funcionalidade em várias visualizações:
E então, na visualização apropriada
<Grid.RowDefinition>
:fonte
BoolToGridLengthConverter
e adicionar umVisibleLength
-Property, para retornar(bool)value == true
. É assim que você também pode reutilizá-lo comAuto
qualquer valor fixo.A melhor e mais limpa solução para recolher linhas ou colunas é usar um DataTrigger para, no seu caso:
fonte
INotifyPropertyChanged
em seu código para que funcione quandoSomeBoolProperty
for alterado :).Você também pode fazer isso referenciando a Linha na Grade e alterando a Altura da própria linha.
XAML
VB.NET
Embora o recolhimento dos elementos dentro da grade também funcione, isso é um pouco mais simples se você tiver muitos itens na grade que não tenham um elemento envolvente que possa ser reduzido. Isso seria uma boa alternativa.
fonte
RowDefinition
, como<RowDefinition Height="*" /><!-- Height set in code behind -->
Para referência,
Visibility
é uma enumeração System.Windows.Visibility de três estados :Veja esta dica e outras dicas no tópico de dicas e truques do WPF .
fonte
Em vez de mexer na linha da grade, você pode definir a propriedade Visibility dos controles (campos na linha) como "Collapsed". Isso garantirá que os controles não ocupem nenhum espaço e se você tiver Grid Row Height = "Auto", a linha será ocultada, pois todos os controles na linha têm Visibility = "Collapsed".
Este método é melhor porque a Visibilidade dos controles pode ser associada a alguma propriedade com a ajuda de um Conversor.
fonte
Basta fazer isso:
rowToHide.Height = new GridLength(0);
se você usar,
visibility.Collapse
então, você terá que defini-lo para cada membro da linha.fonte
Defina a visibilidade do conteúdo da linha como em
Visibility.Collapsed
vez de Oculto. Isso fará com que o conteúdo pare de ocupar espaço e a linha encolherá de forma adequada.fonte
Tive uma ideia semelhante ao herdar RowDefinition (apenas por interesse)
Agora você pode usá-lo da seguinte forma:
e alternar com
fonte