Unterschied zwischen Visibility.Collapsed und Visibility.Hidden

286

Was sind Unterschiede zwischen Visibility.Collapsedund Visibility.Hiddenin WPF?

Sauron
quelle
4
Gibt es eine Performance zwischen Hidden und Collapsed? Gibt es eine Instanz für das Objekt, die reduziert ist?
Bulli
@Bulli Ja, es gibt einen Leistungsunterschied. Ein unsichtbares Steuerelement unterliegt weiterhin dem Layout-Durchlauf, während ein reduziertes Steuerelement nicht Layout erstellt wird. So kann beispielsweise ein großes Raster die Leistung negativ beeinflussen, wenn seine Sichtbarkeit nicht sichtbar ist.
Marius Herzog

Antworten:

425

Der Unterschied besteht darin, dass Visibility.Hiddendas Steuerelement ausgeblendet wird, aber der Platz reserviert wird, den es im Layout einnimmt. Es wird also Leerzeichen anstelle des Steuerelements gerendert. Visibilty.Collapsednicht die Kontrolle machen und nicht das Leerzeichen reservieren. Der Platz, den das Steuerelement einnehmen würde, ist "reduziert", daher der Name.

Der genaue Text aus dem MSDN:

Reduziert : Zeigen Sie das Element nicht an und reservieren Sie im Layout keinen Platz dafür.

Versteckt : Zeigen Sie das Element nicht an, sondern reservieren Sie Platz für das Element im Layout.

Sichtbar : Zeigen Sie das Element an.

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

Razzie
quelle
2
Das bedeutet, dass die Breite und Höhe der Steuerung auf Null gesetzt wird, wenn sie reduziert wurde.
Sauron
27
Nun, in Bezug auf das Layout, ja. Es geht natürlich nicht nur darum, Breite und Höhe auf Null zu setzen. Wenn die Sichtbarkeit reduziert ist, kann das Steuerelement keinen Fokus haben. Sie können nicht mit der TAB-Taste usw. zum Steuerelement navigieren. Dies ist immer noch möglich, wenn es eine Höhe und Breite von Null hätte. Aber auch in Bezug auf das Layout könnte man das sagen.
Razzie
3
Ich habe festgestellt, dass die Verwendung von Hidden (und dann Visible) mit dem WebBrowser-Steuerelement zu sehr inkonsistenten Ergebnissen führt. Die Verwendung von Collapsed (dann Visible) scheint besser zu funktionieren.
Ternary
ist ein kollabiertes Steuerelement noch "aktiv". Ich benutze ein Webbrowser-Steuerelement, möchte es aber nicht anzeigen, aber ich brauche es, um auf verschiedenen Seiten zu navigieren und Dinge zu tun
Software macht Spaß
In Chrome mussten wir <div style = "display: none"> verwenden, damit das Leerzeichen verschwindet. "Reduziert" ist keine Sichtbarkeitsoption. "Collapse" ist ein Wert, aber der Platz war noch da.
Praxiteles
55

Sichtbarkeit: Versteckt gegen kollabiert

Betrachten Sie folgenden Code , der nur zeigt three Labelsund hat zweite Label visibilityals 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>

Ausgabe reduziert:

Zusammengebrochen

Ändern Sie nun die Sekunde Label visibilityin Hiddden.

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

Ausgabe ausgeblendet:

Versteckt

So einfach ist das.

Kylo Ren
quelle
9

Obwohl ein bisschen alter Thread, für diejenigen, die noch nach den Unterschieden suchen:

Abgesehen von dem Layout (Leerzeichen), das in Versteckt und nicht in Reduziert aufgenommen wurde, gibt es einen weiteren Unterschied.

Wenn dieses 'Reduzierte' Hauptsteuerelement benutzerdefinierte Steuerelemente enthält, werden beim nächsten Setzen auf Sichtbar alle benutzerdefinierten Steuerelemente "geladen". Es wird nicht vorgeladen, wenn das Fenster gestartet wird.

Was 'Versteckt' betrifft, werden alle benutzerdefinierten Steuerelemente + Hauptsteuerelemente geladen, die wir beim Starten des "Fensters" als ausgeblendet festlegen.

scsfdev
quelle
2
Ich bin mir ziemlich sicher, dass das falsch ist. Meine aktuelle Anwendung scheint alles zu laden, auch wenn ich alle meine Steuerelemente auf reduziert gesetzt habe.
Tim Pohlmann
1
Ich habe ein Problem mit Collapsed. Wenn reduziert, wird z. B. Interaktion verwendet. Verhaltensweisen werden erst geladen, wenn die Sichtbarkeit in Sichtbar geändert wird. Wenn Sie also eine Art Proxy erstellen, der Verhaltensweisen verwendet, um von der VM aus auf die WPF-Steuerung zuzugreifen, funktioniert dies erst, wenn die Steuerung auf Sichtbar (oder Versteckt) eingestellt ist
user2126375