关于WPF Control.Visibility 的一些体会

    技术2026-01-16  9

    WPF里枚举变量Visibility 有三个值:Visible, CollapsedHidden。其中CollapsedWPF新引进的,其作用是不仅隐去Control,同时也会移除Control所占据的空间。这个属性在你需要隐藏某个控件的同时又让界面看起来统一齐整时非常有效。

     

    一般来说,使用HiddenCollapsed隐藏控件都是可行的。但是在实际的开发过程中,我发现两者还是有不少区别的,尤其在某些特定的环境里。如果使用过程中不注意,可能会造成不可预见的后果。

     

    我开发过一个程序,主界面的Xaml布局大概如下:

     

    在后台代码中,AB会相互切换,隐去A显示B或显示B隐去A。如果隐去的时候设置的枚举值是Collapsed,我发现在切换的过程中,AB的界面显示会有问题,具体表现为其长度超出了原先设想的限制范围。跟踪的时候发现Windows的重载函数MeasureOverrideArrangeOverride被调用,而且其参数就已经有问题了。分析认为,如果一个控件被设置成Collapsed,重新显示的时候,Render Engine就会重新计算AB里控件的位置和大小,造成不可预知的结果。如果设成Hidden,因为控件所占的位置没有被移除,重新显示的时候就不需要计算这些数值,也就可以避免以上不良后果。

     

    另外一个问题涉及到508(高亮对比,针对色盲人士)。如果控件设置成了Collapsed,多次设置高对比度后,该控件没法正常显示,其位置为黑色,重启程序方能解决。设置成hidden就不会有这个问题。

     

    最新回复(0)