Perbedaan antara Visibilitas.Collapsed dan Visibility.Hidden

287

Apa perbedaan antara Visibility.Collapseddan Visibility.Hiddendalam WPF?

Sauron
sumber
4
Apakah ada penyimpangan kinerja antara Tersembunyi dan Runtuh? Apakah ada contoh untuk objek yang runtuh?
Bulli
@Bulli Ya ada perbedaan kinerja, kontrol yang tidak terlihat masih akan dikenakan pass tata letak, sedangkan kontrol yang diciutkan tidak akan ditata. Jadi misalnya kisi besar dapat memengaruhi kinerja secara negatif saat Visibilitasnya Tidak Terlihat.
Marius Herzog

Jawaban:

426

Perbedaannya adalah bahwa Visibility.Hiddenmenyembunyikan kontrol, tetapi cadangan ruang yang ditempati dalam tata letak. Jadi itu membuat spasi bukan kontrol. Visibilty.Collapsedtidak membuat kontrol dan tidak memesan spasi putih. Ruang kontrol akan mengambil 'runtuh', maka namanya.

Teks persis dari MSDN:

Runtuh : Jangan tampilkan elemen, dan jangan menyimpan ruang untuk itu dalam tata letak.

Tersembunyi : Jangan tampilkan elemen, tetapi simpan ruang untuk elemen dalam tata letak.

Terlihat : Tampilkan elemen.

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

Razzie
sumber
2
Itu berarti lebar dan tinggi kontrol akan diatur ke nol jika di-collaps.
Sauron
27
Nah, dari segi tata letak, ya. Itu tentu saja lebih dari pengaturan lebar dan tinggi ke nol. Ketika Visibilitas diciutkan, kontrol tidak dapat fokus, Anda tidak dapat menavigasi ke kontrol menggunakan tombol TAB, dan sebagainya, yang semuanya masih bisa jika akan memiliki tinggi dan lebar nol. Tetapi sekali lagi, dalam hal tata letak, Anda bisa mengatakan itu.
Razzie
3
Saya telah menemukan bahwa menggunakan Tersembunyi (dan kemudian Terlihat) dengan kontrol WebBrowser memberi saya hasil yang sangat tidak konsisten. Menggunakan Collapsed (lalu Visible) tampaknya berfungsi lebih baik.
Ternary
adalah kontrol yang diciutkan masih "aktif". Saya menggunakan kontrol peramban web tetapi tidak ingin menampilkannya, tetapi saya memerlukannya untuk menavigasi halaman yang berbeda dan melakukan hal
perangkat lunak itu menyenangkan
Di Chrome, kami harus menggunakan <div style = "display: none"> untuk menghilangkan spasi. "Runtuh" ​​bukan opsi visibilitas. "Ciutkan" adalah nilai, tetapi ruang itu masih ada.
Praxiteles
55

Visibilitas: Tersembunyi Vs Runtuh

Pertimbangkan kode berikut yang hanya menunjukkan three Labelsdan memiliki yang kedua Label visibilitysebagai 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>

Output Runtuh:

Runtuh

Sekarang ubah yang kedua Label visibilitymenjadi Hiddden.

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

Output Tersembunyi:

Tersembunyi

Sesimpel itu.

Kylo Ren
sumber
9

Meski utas agak lama, bagi yang masih mencari perbedaan:

Selain dari tata letak (spasi) yang diambil dalam Tersembunyi dan tidak diambil dalam Runtuh, ada perbedaan lain.

Jika kami memiliki kontrol khusus di dalam kontrol utama 'Hancur' ini, saat berikutnya kami atur ke Visible, itu akan "memuat" semua kontrol khusus. Ini tidak akan dimuat sebelumnya ketika jendela dimulai.

Adapun 'Tersembunyi', itu akan memuat semua kontrol khusus + kontrol utama yang kami tetapkan sebagai tersembunyi ketika "jendela" dimulai.

scsfdev
sumber
2
Saya cukup yakin ini salah. Aplikasi saya saat ini tampaknya memuat semuanya bahkan jika saya mengatur semua Kontrol saya untuk runtuh.
Tim Pohlmann
1
Saya menghadapi masalah yang datang dari Collapsed. Ketika diciutkan digunakan misalnya Interaksi. Perilaku tidak dimuat sampai Visibilitas diubah menjadi Terlihat. Jadi jika Anda membuat beberapa jenis proxy yang menggunakan perilaku untuk mengakses kontrol WPF dari VM, ini tidak akan berfungsi sampai kontrol ditetapkan menjadi Terlihat (atau Tersembunyi)
user2126375