Różnica między widocznością. Zwinięty a widocznością. Ukryty

287

Jakie są różnice między WPF Visibility.Collapsedi pomiędzy nimi Visibility.Hidden?

Sauron
źródło
4
Czy istnieje Wydajność różniąca się między Ukrytym a Zwiniętym? Czy istnieje instancja dla obiektu, który jest zwinięty?
Bulli,
@Bulli Tak, istnieje różnica w wydajności, niewidzialna kontrolka nadal będzie podlegać przebiegowi układania, podczas gdy zwinięta kontrolka nie będzie układana. Na przykład duża siatka może negatywnie wpływać na wydajność, gdy jej widoczność jest niewidoczna.
Marius Herzog,

Odpowiedzi:

426

Różnica polega na tym, że Visibility.Hiddenukrywa kontrolę, ale rezerwuje miejsce, które zajmuje w układzie. Dlatego renderuje białe znaki zamiast kontroli. Visibilty.Collapsednie renderuje kontroli i nie rezerwuje białych znaków. Przestrzeń, którą miałaby kontrola, jest „zapadnięta”, stąd nazwa.

Dokładny tekst z MSDN:

Zwinięty : nie wyświetla elementu i nie rezerwuje dla niego miejsca w układzie.

Ukryty : nie wyświetla elementu, ale rezerwuje miejsce dla elementu w układzie.

Widoczny : wyświetla element.

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

Razzie
źródło
2
Oznacza to, że szerokość i wysokość formantu zostanie ustawiona na zero, jeśli był on zwinięty.
Sauron
27
Cóż, jeśli chodzi o układ, tak. To oczywiście więcej niż ustawianie szerokości i wysokości na zero. Kiedy widoczność jest zwinięta, formant nie może się skupić, nie można nawigować do kontrolki za pomocą klawisza TAB itp. Wszystkie z nich nadal mogą, jeśli miałaby wysokość i szerokość zero. Ale znowu, jeśli chodzi o układ, można to powiedzieć.
Razzie
3
Przekonałem się, że użycie Ukrytego (a następnie Widocznego) z kontrolką WebBrowser daje mi bardzo niespójne wyniki. Korzystanie ze zwiniętego (wówczas widocznego) wydaje się działać lepiej.
Ternary
jest zwiniętym sterowaniem, które nadal jest „aktywne”. Korzystam z kontrolki przeglądarki internetowej, ale nie chcę jej pokazywać, ale potrzebuję jej do poruszania się po różnych stronach i robienia różnych rzeczy
oprogramowanie jest fajne
W Chrome musieliśmy użyć <div style = "display: none">, aby spacja zniknęła. „Zwinięty” nie jest opcją widoczności. „Zwiń” to wartość, ale przestrzeń wciąż tam była.
Praxiteles
55

Widoczność: Ukryte Vs zwinięte

Rozważ następujący kod, który pokazuje three Labelsi ma drugi Label visibilityjako 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>

Wyjście zwinięte:

Upadł

Teraz zmień sekundę Label visibilityna Hiddden.

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

Wyjście ukryte:

Ukryty

Tak proste jak to.

Kylo Ren
źródło
9

Mimo że nieco stary wątek, dla tych, którzy wciąż szukają różnic:

Poza układem (przestrzenią) wykonanym w trybie Ukryty, a nie wykonanym w Zwiniętym, jest jeszcze jedna różnica.

Jeśli mamy niestandardowe elementy sterujące w tym głównym układzie zwiniętym, następnym razem, gdy ustawimy go na Widoczny, „załaduje” wszystkie niestandardowe elementy sterujące. Nie zostanie wstępnie załadowane po uruchomieniu okna.

Jeśli chodzi o „Ukryty”, załaduje on wszystkie niestandardowe elementy sterujące + główny element sterujący, który ustawiliśmy jako ukryty po uruchomieniu „okna”.

scsfdev
źródło
2
Jestem prawie pewien, że to źle. Wygląda na to, że moja bieżąca aplikacja ładuje wszystko, nawet jeśli wszystkie moje formanty są zwinięte.
Tim Pohlmann
1
Mam do czynienia z problemem związanym z zawaleniem. Gdy zwinięte jest używane, np. Interakcja. Zachowania nie są ładowane, dopóki Widoczność nie zostanie zmieniona na Widoczna. Tak więc, jeśli utworzysz jakiś serwer proxy za pomocą zachowań, aby uzyskać dostęp do kontroli WPF z VM, to nie zadziała, dopóki kontrola nie zostanie ustawiona jako Widoczna (lub Ukryta)
user2126375