ความแตกต่างระหว่างการมองเห็นยุบและการมองเห็นซ่อนอยู่


287

อะไรคือความแตกต่างระหว่างVisibility.CollapsedและVisibility.Hiddenใน WPF


4
มีประสิทธิภาพการทำงานที่แตกต่างกันระหว่างการซ่อนและการยุบ? มีตัวอย่างของวัตถุที่ถูกยุบหรือไม่?
Bulli

@Bulli ใช่มีความแตกต่างของประสิทธิภาพการควบคุมที่มองไม่เห็นจะยังคงอยู่ภายใต้รูปแบบการส่งผ่านในขณะที่การควบคุมการยุบจะไม่ถูกจัดวาง ตัวอย่างเช่นกริดขนาดใหญ่อาจส่งผลเสียต่อประสิทธิภาพเมื่อมองไม่เห็น
Marius Herzog

คำตอบ:


426

ความแตกต่างคือVisibility.Hiddenซ่อนตัวควบคุม แต่สงวนพื้นที่ที่ครอบครองในโครงร่าง ดังนั้นมันจึงแสดงช่องว่างแทนการควบคุม Visibilty.Collapsedไม่ทำให้การควบคุมและไม่จองช่องว่าง พื้นที่ที่ตัวควบคุมจะใช้คือ 'ยุบ' ดังนั้นชื่อ

ข้อความที่แน่นอนจาก MSDN:

ยุบ : อย่าแสดงองค์ประกอบและอย่าจองพื้นที่ไว้ในเลย์เอาต์

ซ่อน : อย่าแสดงองค์ประกอบ แต่สำรองพื้นที่สำหรับองค์ประกอบในโครงร่าง

มองเห็นได้ : แสดงองค์ประกอบ

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


2
นั่นหมายถึงความกว้างและความสูงของการควบคุมจะถูกตั้งค่าเป็นศูนย์ถ้ามันถูกยุบ
Sauron

27
ในแง่ของเลย์เอาต์ใช่ มันแน่นอนมากกว่าการตั้งค่าความกว้างและความสูงเป็นศูนย์ เมื่อการมองเห็นถูกยุบตัวควบคุมจะไม่สามารถโฟกัสได้คุณจะไม่สามารถนำทางไปยังตัวควบคุมได้โดยใช้ปุ่ม TAB และอื่น ๆ ซึ่งยังคงทำได้ถ้ามันจะมีความสูงและความกว้างเป็นศูนย์ แต่อีกครั้งในแง่ของการจัดวางคุณสามารถพูดได้ว่า
Razzie

3
ฉันพบว่าการใช้ Hidden (และ Visible) ด้วยการควบคุมเว็บเบราเซอร์ให้ผลลัพธ์ที่ไม่สอดคล้องกันมาก การใช้การยุบ (มองเห็นได้) ดูเหมือนว่าจะทำงานได้ดีขึ้น
Ternary

เป็นตัวควบคุมที่ยุบอยู่ที่ "ใช้งานอยู่" ฉันใช้การควบคุมเว็บเบราว์เซอร์ แต่ไม่ต้องการที่จะแสดงมัน แต่ฉันต้องการให้นำทางไปยังหน้าต่างๆและทำสิ่งต่าง ๆ
ซอฟต์แวร์มันสนุก

ใน Chrome เราต้องใช้ <div style = "display: none"> เพื่อให้ช่องว่างหายไป "ยุบ" ไม่ใช่ตัวเลือกการเปิดเผย "ยุบ" เป็นค่า แต่พื้นที่ยังคงอยู่ที่นั่น
Praxiteles

55

ทัศนวิสัย: Hidden Vs Collapsed

พิจารณารหัสซึ่งแสดงให้เห็นว่าต่อไปนี้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 visibilityHiddden

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

ซ่อนผลลัพธ์:

ซ่อนเร้น

ง่ายเหมือนที่


9

แม้ว่าจะเป็นด้ายเก่าสำหรับผู้ที่ยังคงมองหาความแตกต่าง:

นอกเหนือจากเลย์เอาต์ (ช่องว่าง) ที่ใช้ในซ่อนและไม่ได้อยู่ในยุบแล้วยังมีข้อแตกต่างอื่นอีก

หากเรามีตัวควบคุมแบบกำหนดเองภายในตัวควบคุมหลัก 'แบบยุบ' ในครั้งต่อไปที่เราตั้งค่าเป็นมองเห็นได้มันจะ "โหลด" ตัวควบคุมแบบกำหนดเองทั้งหมด มันจะไม่โหลดล่วงหน้าเมื่อหน้าต่างเริ่มต้นขึ้น

สำหรับ 'ซ่อน' มันจะโหลดการควบคุมที่กำหนดเองทั้งหมด + การควบคุมหลักที่เราตั้งเป็นซ่อนเมื่อเริ่ม "หน้าต่าง"


2
ฉันค่อนข้างมั่นใจว่านี่ผิด แอปพลิเคชันปัจจุบันของฉันดูเหมือนจะโหลดทุกอย่างแม้ว่าฉันจะตั้งค่าการควบคุมทั้งหมดของฉันให้ยุบ
Tim Pohlmann

1
ฉันกำลังประสบปัญหาจากการยุบ เมื่อใช้การยุบเช่นการโต้ตอบจะไม่มีการโหลดลักษณะการทำงานจนกว่าทัศนวิสัยจะเปลี่ยนเป็นมองเห็นได้ ดังนั้นหากคุณสร้างพร็อกซีบางประเภทโดยใช้พฤติกรรมในการเข้าถึงการควบคุม WPF จาก VM สิ่งนี้จะไม่ทำงานจนกว่าการตั้งค่าการควบคุมจะมองเห็นได้ (หรือซ่อน)
user2126375
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.