Разница между Visibility.Collapsed и Visibility.Hidden

287

Каковы различия между Visibility.Collapsedи Visibility.Hiddenв WPF?

Саурон
источник
4
Есть ли эффект производительности между Hidden и Collapsed? Есть ли экземпляр объекта, который свернут?
Bulli
@Bulli Да, есть разница в производительности, невидимый элемент управления все равно будет подвергаться этапу макета, тогда как свернутый элемент управления не будет размещен. Так, например, большая сетка может негативно повлиять на производительность, когда ее видимость невидима.
Мариус Херцог

Ответы:

426

Разница в том, что Visibility.Hiddenскрывает элемент управления, но резервирует пространство, занимаемое в макете. Таким образом, он отображает пробелы вместо элемента управления. Visibilty.Collapsedне отображает элемент управления и не резервирует пробел. Пространство, которое займет элемент управления, «свернуто», отсюда и название.

Точный текст из MSDN:

Свернуто : Не отображать элемент и не резервировать место для него в макете.

Скрытый : не отображать элемент, но зарезервировать место для элемента в макете.

Видимый : Показать элемент.

Смотрите: http://msdn.microsoft.com/en-us/library/system.windows.visibility.aspx

Razzie
источник
2
Это означает, что ширина и высота элемента управления будут установлены на ноль, если они были свернуты.
Саурон
27
Ну, с точки зрения верстки, да. Это, конечно, больше, чем установка ширины и высоты на ноль. Когда видимость свернута, элемент управления не может иметь фокус, вы не можете перейти к элементу управления, используя клавишу TAB и так далее, и все это можно сделать, если его высота и ширина будут равны нулю. Но опять же, с точки зрения макета, вы могли бы сказать это.
Раззи
3
Я обнаружил, что использование Hidden (и затем Visible) с элементом управления WebBrowser дает мне очень противоречивые результаты. Использование Collapsed (тогда Visible), кажется, работает лучше.
Тройной
свернутый элемент управления все еще "активен". Я использую управление через веб-браузер, но не хочу его показывать, но мне нужно, чтобы он перемещался по разным страницам и занимался чем-то другим
ПО - это весело
В Chrome нам пришлось использовать <div style = "display: none">, чтобы пропустить пропуски. «Свернутый» не является параметром видимости. «Свернуть» - это ценность, но пространство все еще там.
Praxiteles
55

Видимость: скрыто против свернуто

Рассмотрим следующий код, который только показывает three Labelsи имеет второй Label visibilityкак 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>

Выход свернулся:

рухнул

Теперь измените второй Label visibilityна Hiddden.

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

Выход скрыт:

скрытый

Так просто, как, что.

Кило Рен
источник
9

Даже если немного старая тема, для тех, кто все еще ищет различия:

Помимо макета (пространства), взятого в Hidden и не взятого в Collapsed, есть еще одно отличие.

Если у нас есть собственные элементы управления внутри этого основного элемента управления «Свернутый», в следующий раз, когда мы установим для него значение Visible, он будет «загружать» все пользовательские элементы управления. Он не будет предварительно загружаться при запуске окна.

Что касается «Скрытого», он загрузит все пользовательские элементы управления + основной элемент управления, который мы установили как скрытый при запуске «окна».

scsfdev
источник
2
Я уверен, что это неправильно. Мое текущее приложение, кажется, загружает все, даже если я установил все свои элементы управления свернутыми.
Тим Полманн
1
Я столкнулся с проблемой, исходящей от Collapsed. Когда используется свернутый, например, Interaction.Behaviors не загружаются, пока видимость не будет изменена на Visible. Таким образом, если вы создаете какой-то прокси-сервер с использованием поведений для доступа к элементу управления WPF из ВМ, это не будет работать, пока для
элемента