Diferencia entre Visibilidad contraída y Visibilidad oculta

287

¿Cuáles son las diferencias entre Visibility.Collapsedy Visibility.Hiddenen WPF?

Sauron
fuente
44
¿Hay un rendimiento diferente entre oculto y colapsado? ¿Hay una instancia para el objeto que está colapsado?
Bulli
@Bulli Sí, hay una diferencia de rendimiento, un control invisible seguirá estando sujeto al pase de diseño, mientras que un control contraído no se distribuirá. Entonces, por ejemplo, una cuadrícula grande puede afectar negativamente el rendimiento cuando su visibilidad es invisible.
Marius Herzog

Respuestas:

426

La diferencia es que Visibility.Hiddenoculta el control, pero reserva el espacio que ocupa en el diseño. Entonces representa espacios en blanco en lugar del control. Visibilty.Collapsedno representa el control y no reserva el espacio en blanco. El espacio que tomaría el control está 'colapsado', de ahí el nombre.

El texto exacto del MSDN:

Contraído : no muestre el elemento y no le reserve espacio en el diseño.

Oculto : no muestra el elemento, pero reserva espacio para el elemento en el diseño.

Visible : muestra el elemento.

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

Razzie
fuente
2
Eso significa que el ancho y la altura del control se establecerán en cero si estaba contraído.
Sauron
27
Bueno, en términos de diseño, sí. Por supuesto, hace más que establecer el ancho y la altura en cero. Cuando se colapsa la visibilidad, el control no puede tener el foco, no puede navegar al control usando la tecla TAB, etcétera, todo lo cual aún puede tener una altura y un ancho de cero. Pero de nuevo, en términos de diseño, se podría decir eso.
Razzie
3
Descubrí que usar Oculto (y luego Visible) con el control WebBrowser me da resultados muy inconsistentes. Usar Contraído (luego Visible) parece funcionar mejor.
Ternario
es un control colapsado aún "activo". Estoy usando un control de navegador web pero no quiero mostrarlo, sin embargo, lo necesito para navegar por diferentes páginas y hacer cosas
software es divertido el
En Chrome, tuvimos que usar <div style = "display: none"> para que desapareciera el espacio en blanco. "Contraído" no es una opción de visibilidad. "Colapso" es un valor, pero el espacio todavía estaba allí.
Praxiteles
55

Visibilidad: Oculto vs. Contraído

Considere seguir el código que solo muestra three Labelsy tiene el 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>

Salida contraída:

Colapsado

Ahora cambia el segundo Label visibilitya Hiddden.

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

Salida oculta:

Oculto

Tan sencillo como eso.

Kylo Ren
fuente
9

Aunque es un hilo un poco viejo, para aquellos que aún buscan las diferencias:

Aparte del diseño (espacio) tomado en Oculto y no tomado en Contraído, hay otra diferencia.

Si tenemos controles personalizados dentro de este control principal 'Contraído', la próxima vez que lo configuremos en Visible, "cargará" todos los controles personalizados. No se cargará previamente cuando se inicie la ventana.

En cuanto a 'Oculto', cargará todos los controles personalizados + control principal que configuramos como ocultos cuando se inicia la "ventana".

scsfdev
fuente
2
Estoy bastante seguro de que esto está mal. Mi aplicación actual parece cargar todo, incluso si configuro todos mis controles para colapsar.
Tim Pohlmann
1
Estoy enfrentando un problema que viene de colapsado Cuando se usa contraído, por ejemplo, Interacción. Los comportamientos no se cargan hasta que Visibilidad se cambie a Visible. Por lo tanto, si crea algún tipo de proxy utilizando comportamientos para acceder al control WPF desde VM, esto no funcionará hasta que el control esté configurado como Visible (u Oculto)
user2126375