这个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);
}
}
这样就成功绘制了。