WPF中Border子元素TextBlock设置Visibility无效问题求助
问题分析与解决方案
嘿,我来帮你搞定这个问题!首先得明确:你贴的那段动态添加Border和TextBlock并隐藏旧元素的代码本身逻辑是没问题的——设置border.Visibility = Visibility.Hidden再加上border.Child.Visibility = Visibility.Hidden,理论上应该让Border和内部的TextBlock都消失。
问题根源
问题出在你自定义的TextBlock的OnRender事件上!
你可能以为控件不可见时OnRender不会触发,但WPF里如果你的TextBlock重写了OnRender方法,并且没有在方法内检查控件的可见状态,即使控件(或父容器)的Visibility设为Hidden/Collapsed,这个绘制事件依然会被执行,导致带图形效果的文本还是被画出来了。
解决办法
最有效的方式是在OnRender方法里先判断控件的可视状态,只有满足条件时才执行你的绘制逻辑:
protected override void OnRender(DrawingContext dc) { // 先判断控件是否处于可见状态(包含父容器的可见性) if (!IsVisible || Visibility != Visibility.Visible) { base.OnRender(dc); return; } // 这里放你原来的带图形效果的文本绘制代码 // ... }
这里用IsVisible属性会更靠谱,因为它会综合父控件的可见性来判断——如果父Border已经被设为Hidden,子TextBlock的IsVisible会自动变成false,这样就能直接跳过绘制逻辑了。
另外补充下:你试的ClipToBounds和设置Visibility为Collapsed(WPF里没有Invisible,是Collapsed)没用,本质就是因为OnRender被强制触发了,所以必须在绘制逻辑里加前置判断才行。
内容的提问来源于stack exchange,提问作者user2272143
相关产品推荐
相关产品推荐

