WPF 某个界面或控件在界面找不到看不到可能的原因

本文来告诉大家在 WPF 开发中,发现有某个按钮或某个控件,某个预期的界面,没有在窗口或者没有在界面里面看到或者找到可能的原因和调试的方法

不在视觉树

如果控件在界面看不到,首先需要通过视觉树了解控件是否还在视觉树上

一个不存在视觉树的控件,肯定不会在界面中显示.

调试某个控件元素是否在 WPF 界面的视觉树上,可以通过 VisualStudio 的实时可视化树功能进行调试

如果已进入后台断点,可以尝试通过此元素的 Parent 属性,一层层寻找,如果能找到顶层的窗口,那么证明显示到窗口里面,否则有一层是空,则证明此元素没有被显示在此窗口里面

可见性

如果控件本身的 Visibility 属性被设置为不可见,那么自然元素就不可见啦。在上一步的基础上,通过控件的属性面板,找到控件的 Visibility 属性,可以了解到控件是否因为此属性的原因而在界面不可见

没有被布局

没有被布局通常的原因就是给定的宽度或高度大小不对,例如实际的高度或实际的宽度为 0 或太小

简单的调试的方法就是在上面一步的基础上,如果控件在可视化树上,通过控件的属性面板,找到控件的尺寸。如果控件的尺寸大小,自然就是看不到此控件

被布局到不可见地方

如果控件对象有自己的宽度和高度,请看控件的 Margin 属性,是否被布局到看不见的地方,例如 Left 的值是 10000 超级大的一个数值。或者是放在 Canvas 容器里面,但是 Canvas 的 Left 附加属性被设置一个超级大的值等

如果控件的坐标符合预期,那继续找一层,控件的容器,看控件所在的容器的坐标以及宽度高度是否符合预期

被遮挡

如果某个 WPF 的控件在界面看不见,同时此控件已布局到正确的地方,也设置了可见性,也有宽度和高度。那么请在视觉树上,寻找是否有其他的控件盖住了此控件

例如有两层的控件,其中上面一层的控件的背景是不透明的,刚好盖在第二层控件上。自然第二层控件就看不见

被裁剪

控件所在的容器,如果设置了 Clip 属性或者 ClipToBounds 等属性,容器可以裁剪元素。此时可以通过尝试修改容器,干掉所有的裁剪属性以及后台代码里面设置的裁剪属性等,看控件是否能显示出来,如果能,那么就是裁剪的原因

渲染变换

在 WPF 中,提供了 RenderTransform 属性作为渲染变换,此时渲染变换,如给定缩放变换的缩放值是 0 或者给定的平移超过界面范围,那自然就会让控件不可见

尝试调试,获取控件对应的 RenderTransform 属性的值,判断此值是否符合预期

或者干掉控件的所有的 RenderTransform 属性,无论是 XAML 设置的,还是后台代码设置的。如果干掉之后,能在界面看到控件,那么证明是因为变换写错了,而让控件看不到

样式丢失

在 WPF 里面,控件是可以使用样式的,而样式是可以有全局样式和指定样式。如果有诡异的全局样式,或者指定的样式里面没有正确使用,那自然会影响到控件本身。可以尝试在控件的属性里面,获取样式,判断控件的样式是否符合预期

额外的,可以通过设置控件的样式为空,判断是否是全局样式的影响

渲染方法没有实现

如果是自己定义的底层控件,在 OnRender 等方法没有实现正确,例如在 OnRender 方法里面,没有正确写入渲染指令,那么自然在界面里面看不到自定义的控件

调试的方法是在 OnRender 方法,在第一句话里面,随意画一个带颜色的矩形,通过判断矩形是否在界面显示,了解是否因为渲染方法没有实现正确而让控件不可见。