wpf-纯色背景的控件变成半透明的原因及解决方案

这个bug哈哈哈哈我想了半天,还是很好笑。

一开始控件放得疏松,没有重叠,所以没发现问题。调整间距之后,控件存在大量的重叠情况,就出问题了。

我希望做成的效果如下图,即鼠标移动到ErhB9II(Styl)(6587)附近时,自动弹出控件,展示详细信息;而其下方的标签被遮挡:
在这里插入图片描述
结果左半圆正常,右半圆出现了“透明”的情况,如下图所示,下方的标签没有被遮挡,所以标签和控件中文字的辨识度就变差了。
在这里插入图片描述
首先必须确认背景色Background,有没有用透明色?Opacity是不是1?我这个自定义控件大概是这种格式:

<UserControl>
	<Grid>
		<Button/> <!--标签-->
		<Grid> <!--详细信息-->
			...
		</Grid>
	</Grid>
</UserControl>

其中Button就是ErhB9II(Styl)(6587)这种标签,下面的详细信息部分是跟标签一起,一早绘制好的,只是鼠标移入Button时,详细信息部分才会展示出来,移出时,详细信息部分隐藏。

检查完发现不是颜色的问题,于是我仔细对比了左右两个半圆,发现可能是绘制顺序的问题:我绘制的时候是从顶部开始,沿着顺时针方向绘制,一直回到顶部。而且绘制的时候就是简单的 canvas.Children.Add,那么在右半圆时,相当于把下一个标签绘制到了上一个标签的上面。

这不是纯色背景变透明的问题,而是绘制时覆盖的问题!!!背景仍然是纯色的!!!

所以我现在的解决方案是:使用一个Stack,对于右半圆,先将元素压栈,等到达左半圆时,先将右半圆的元素出栈,绘制结束后再绘制正常按顺序绘制左半圆的元素。以下省略函数和类定义。

// 初始化一个临时的空栈
Stack<Enzyme> tmpEnzymes = new Stack<Enzyme>();
foreach (Enzyme enzyme in enzymes) {
    double theta = ... // 计算角度
    if (theta <= Math.PI) // 右半圆
    {
        // 压栈
        tmpEnzymes.Push(enzyme);
    }
    else { // 左半圆 
        while (tmpEnzymes.Count > 0)
        {
            Enzyme enzyme1 = tmpEnzymes.Pop();
            Draw(enzyme1);
        }
        // 正常绘制左半圆
        Draw(enzyme);
    }
}

这样就成功绘制了。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值