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

Posted lindexi_gd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 某个界面或控件在界面找不到看不到可能的原因相关的知识,希望对你有一定的参考价值。

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

不在视觉树

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

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

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

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

可见性

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

没有被布局

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

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

被布局到不可见地方

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

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

被裁剪

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

渲染变换

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

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

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

样式丢失

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

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

渲染方法没有实现

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

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

如果有发现其他有趣的方法,还请告诉我

更多调试方法请看 dotnet 代码调试方法

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

以上是关于WPF 某个界面或控件在界面找不到看不到可能的原因的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何 WPF 控件可以处理在窗口中导航剪辑的菜单或用户界面?

idea中找不到maven projects的集中解决办法

找不到QT的头文件怎么办?

java中无法加载或找不到主类

WPF前台xaml中的控件名在后台拿不到,后台代码中显示“当前上下文不存在名称‘xxx’”

WPF捕获全局未处理异常