Diferença entre Visibility.Collapsed e Visibility.Hidden

287

Quais são as diferenças entre Visibility.Collapsede Visibility.Hiddenno WPF?

Sauron
fonte
4
Existe um desempenho diferente entre oculto e recolhido? Existe uma instância para o objeto que está recolhido?
Bulli
@Bulli Sim, há uma diferença de desempenho, um controle invisível ainda estará sujeito ao passo de layout, enquanto um controle recolhido não será layout. Por exemplo, uma grade grande pode afetar negativamente o desempenho quando sua visibilidade é invisível.
Marius Herzog

Respostas:

426

A diferença é que Visibility.Hiddenoculta o controle, mas reserva o espaço que ocupa no layout. Por isso, torna o espaço em branco em vez do controle. Visibilty.Collapsednão processa o controle e não reserva o espaço em branco. O espaço que o controle ocuparia é "recolhido", daí o nome.

O texto exato do MSDN:

Recolhido : não exiba o elemento e não reserve espaço para ele no layout.

Oculto : não exiba o elemento, mas reserve espaço para o elemento no layout.

Visível : exibe o elemento.

Consulte: http://msdn.microsoft.com/en-us/library/system.windows.visibility.aspx

Razzie
fonte
2
Isso significa que a largura e a altura do controle serão definidas como zero se estiverem recolhidas.
2055 Sauron
27
Bem, em termos de layout, sim. Obviamente, é mais do que definir largura e altura como zero. Quando o Visibility é recolhido, o controle não pode ter foco, você não pode navegar para o controle usando a tecla TAB, etc., tudo o que ainda é possível se tivesse altura e largura zero. Mas, novamente, em termos de layout, você poderia dizer isso.
Razzie
3
Descobri que usar Oculto (e depois Visível) com o controle WebBrowser me dá resultados muito inconsistentes. Usar Recolhido (depois Visível) parece funcionar melhor.
Ternary
é um controle recolhido ainda "ativo". Eu estou usando um controle de navegador web, mas não quer mostrá-lo no entanto eu preciso dele para navegar o páginas diferentes e fazer coisas
software é divertido
No Chrome, tivemos que usar <div style = "display: none"> para que o espaço em branco desaparecesse. "Recolhido" não é uma opção de visibilidade. "Recolher" é um valor, mas o espaço ainda estava lá.
Praxiteles
55

Visibilidade: oculto versus recolhido

Considere o seguinte código, que apenas mostra three Labelse tem o segundo Label visibilitycomo Collapsed:

 <StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Center">
    <StackPanel.Resources>
        <Style TargetType="Label">
            <Setter Property="Height" Value="30" />
            <Setter Property="Margin" Value="0"/>
            <Setter Property="BorderBrush" Value="Black"/>
            <Setter Property="BorderThickness" Value="1" />
        </Style>
    </StackPanel.Resources>
    <Label Width="50" Content="First"/>
    <Label Width="50" Content="Second" Visibility="Collapsed"/>
    <Label Width="50" Content="Third"/>
</StackPanel>

Saída recolhida:

Desabou

Agora mude o segundo Label visibilitypara Hiddden.

<Label Width="50" Content="Second" Visibility="Hidden"/>

Saída oculta:

Escondido

Tão simples como isso.

Kylo Ren
fonte
9

Mesmo que seja um pouco antigo, para quem ainda procura as diferenças:

Além do layout (espaço) ocupado em Oculto e não ocupado em Recolhido, há outra diferença.

Se tivermos controles personalizados dentro desse controle principal 'Recolhido', na próxima vez que o definirmos como Visível, ele "carregará" todos os controles personalizados. Não será pré-carregado quando a janela for iniciada.

Quanto a 'Hidden', ele carregará todos os controles personalizados + controle principal que definimos como ocultos quando a "janela" é iniciada.

scsfdev
fonte
2
Eu tenho certeza que isso está errado. Meu aplicativo atual parece carregar tudo, mesmo se eu definir todos os meus controles como recolhidos.
21816 Tim Pohlmann
1
Estou enfrentando um problema vindo do recolhido. Quando recolhido é usado, por exemplo, Interaction.Behaviors não são carregados até que Visibility seja alterado para Visible. Assim, se você cria algum tipo de procuração usando comportamentos para controle de acesso WPF a partir de VM, isto não vai funcionar até que o controle está definido para ser visível (ou oculto)
user2126375