Visibility.Collapsed和Visibility.Hidden之间的区别

327

Visibility.CollapsedVisibility.Hidden 在 WPF 中有什么区别?


4
隐藏和折叠之间是否有性能差异? 折叠的对象是否存在实例? - Bulli
@Bulli 是的,性能会有所差异,一个不可见的控件仍然会受到布局传递的影响,而折叠的控件则不会被布局。因此,例如,当一个大的网格的可见性为Invisible时,它可能会对性能产生负面影响。 - Marius Herzog
https://dev59.com/dlgQ5IYBdhLWcg3wxGvs - Michael Benjamin
4个回答

478
区别在于Visibility.Hidden隐藏控件,但保留其在布局中占用的空间。因此,它会渲染空格而不是控件。 Visibility.Collapsed不会呈现控件,也不保留空白。控件占用的空间被“折叠”,因此得名。
来自MSDN的确切文本:
Collapsed:不显示元素,并且不为其在布局中保留空间。
Hidden:不显示元素,但在布局中保留元素的空间。
Visible:显示元素。
参见:http://msdn.microsoft.com/en-us/library/system.windows.visibility.aspx

3
如果一个控件处于折叠状态,那么它的宽度和高度将会被设置为零。 - Sauron
31
从布局的角度来看,是的。当然它做的不仅仅是将宽度和高度设置为零。当可见性被折叠时,控件就不能获得焦点,你也无法使用TAB键导航到该控件等等,而如果它的高度和宽度为零,这些操作还是可以完成的。但是再一次强调,从布局的角度来看,你可以这么说。 - Razzie
3
我发现使用WebBrowser控件时,使用Hidden (然后Visible)会导致结果非常不一致。而使用Collapsed (然后Visible) 似乎效果更好。 - Ternary
折叠的控件仍然是“活动”的吗?我正在使用Web浏览器控件,但不想显示它,但我需要它来导航到不同的页面并执行操作。 - software is fun
@软件很有趣。你是在制作特洛伊木马或类似的东西吗? - The incredible Jan
显示剩余2条评论

70

可见性:隐藏 vs 折叠

考虑下面的代码,它只显示三个标签并将第二个Labelvisibility设置为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>

输出折叠:

Collapsed

现在将第二个标签(Label)可见性(visibility)改为隐藏(Hidden)

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

输出隐藏:

隐藏

就是这么简单。


谢谢。顺便说一句,我认为你应该将死星的可见性设置为折叠。这样你就赢得了这一天。 - undefined

8
即使这个帖子有点旧了,但对于那些仍在寻找区别的人来说:
除了Hidden占用布局(空间)而Collapsed则不占用外,还有另一个区别。
如果我们在“Collapsed”主控件中放置自定义控件,则下一次将其设置为Visible时,它将“加载”所有自定义控件。 它不会在窗口启动时预加载。
至于“Hidden”,它将在“窗口”启动时加载所有自定义控件和我们设置为隐藏的主控件。

4
我很确定这是错误的。尽管我将所有控件设置为折叠,但我的当前应用程序似乎仍然加载了所有内容。 - Tim Pohlmann
1
我遇到了来自Collapsed的问题。当使用Collapsed时,例如Interaction.Behaviors在可见性更改为Visible之前不会被加载。因此,如果您使用行为创建某种代理以从VM访问WPF控件,则在将控件设置为可见(或隐藏)之前,该代理将无法工作。 - user2126375
1
我也进行了基准测试,并发现折叠的DataGrid确实会加载数据! - E Mett

2
一句话概括:隐藏的控件仍然占用空间,但折叠的控件则不会。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接