Différence entre Visibility.Collapsed et Visibility.Hidden

287

Quelles sont les différences entre Visibility.Collapsedet Visibility.Hiddendans WPF?

Sauron
la source
4
Existe-t-il une différence de performance entre Hidden et Collapsed? Existe-t-il une instance de l'objet qui s'est effondré?
Bulli
@Bulli Oui, il y a une différence de performances, un contrôle invisible sera toujours soumis à la passe de mise en page, tandis qu'un contrôle réduit ne sera pas mis en page. Ainsi, par exemple, une grande grille peut affecter négativement les performances lorsque sa visibilité est invisible.
Marius Herzog

Réponses:

426

La différence est que cela Visibility.Hiddenmasque le contrôle, mais réserve l'espace qu'il occupe dans la disposition. Il rend donc les espaces au lieu du contrôle. Visibilty.Collapsedne rend pas le contrôle et ne réserve pas d'espace. L'espace que le contrôle prendrait est «effondré», d'où le nom.

Le texte exact du MSDN:

Réduit : n'affiche pas l'élément et ne lui réserve pas d'espace dans la présentation.

Masqué : n'affiche pas l'élément, mais réserve de l'espace pour l'élément dans la disposition.

Visible : affichez l'élément.

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

Razzie
la source
2
Cela signifie que la largeur et la hauteur du contrôle seront définies à zéro si elles étaient réduites.
Sauron
27
Eh bien, en termes de mise en page, oui. Bien sûr, il ne suffit pas de mettre la largeur et la hauteur à zéro. Lorsque la visibilité est réduite, le contrôle ne peut pas avoir le focus, vous ne pouvez pas accéder au contrôle à l'aide de la touche TAB, etc., ce qui est toujours possible s'il a une hauteur et une largeur de zéro. Mais encore une fois, en termes de mise en page, on pourrait dire cela.
Razzie
3
J'ai trouvé que l'utilisation de Hidden (puis de Visible) avec le contrôle WebBrowser me donne des résultats très incohérents. Utiliser Réduit (puis Visible) semble mieux fonctionner.
Ternary
est un contrôle réduit encore "actif". J'utilise un contrôle de navigateur Web, mais je ne veux pas l'afficher, mais j'en ai besoin pour naviguer sur différentes pages et faire des choses
logiciel est amusant
Dans Chrome, nous avons dû utiliser <div style = "display: none"> pour faire disparaître l'espace blanc. "Réduit" n'est pas une option de visibilité. "Collapse" est une valeur, mais l'espace était toujours là.
Praxiteles
55

Visibilité: Hidden Vs Collapsed

Envisagez de suivre le code qui affiche uniquement three Labelset a la seconde Label visibilitycomme 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>

Sortie réduite:

S'est effondré

Changez maintenant le second Label visibilityen Hiddden.

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

Sortie cachée:

Caché

Aussi simple que cela.

Kylo Ren
la source
9

Même si un fil un peu ancien, pour ceux qui recherchent toujours les différences:

Mis à part la disposition (espace) prise en caché et non prise en repli, il y a une autre différence.

Si nous avons des contrôles personnalisés à l'intérieur de ce contrôle principal «Réduit», la prochaine fois que nous le définirons sur Visible, il «chargera» tous les contrôles personnalisés. Il ne se pré-chargera pas au démarrage de la fenêtre.

Quant à 'Hidden', il chargera tous les contrôles personnalisés + le contrôle principal que nous définissons comme caché lorsque la "fenêtre" est lancée.

scsfdev
la source
2
Je suis sûr que c'est faux. Mon application actuelle semble tout charger même si j'ai défini tous mes contrôles sur effondré.
Tim Pohlmann
1
Je fais face à un problème provenant de Collapsed. Lorsque réduit est utilisé, par exemple Interaction. Les comportements ne sont pas chargés jusqu'à ce que Visibilité soit changé en Visible. Ainsi, si vous créez une sorte de proxy en utilisant des comportements pour accéder au contrôle WPF à partir de la machine virtuelle, cela ne fonctionnera pas tant que le contrôle n'est pas défini comme Visible (ou
Masqué