我发现在画布中偶然添加了许多重叠形状:
GeometryGroup gg = new GeometryGroup();
EllipseGeometry e1 = new EllipseGeometry(new Point(10, 10), 20, 20);
EllipseGeometry e2 = new EllipseGeometry(new Point(10, 10), 20, 20);
//EllipseGeometry e3 = new EllipseGeometry(new Point(10, 10), 20, 20);
gg.Children.Add(e1);
gg.Children.Add(e2);
//gg.Children.Add(e3);
Path p = new Path();
p.Data = gg;
p.Fill = Brushes.Red;
MyCanvas.Children.Add(p);
“清除”以前的所有形状。如果您运行这些代码,您将看不到任何内容,但如果您取消注释某些行,则会出现一个圆圈。有人能解释这种奇怪的行为吗?
答案 0 :(得分:2)
您需要相应地设置几何组的FillRule
。它的值必须为NonZero
。目前,您将每个形状精确地绘制在彼此之上,导致该区域为白色且具有偶数个形状,因为EvenOdd
是默认填充规则:
alt text http://i.msdn.microsoft.com/ms595394.ref_mil_fillrule_stars(en-us,VS.90).png
(图片来自http://msdn.microsoft.com/en-us/library/system.windows.media.geometrygroup.fillrule.aspx)
GeometryGroup gg = new GeometryGroup();
gg.FillRule = FillRule.Nonzero;
EllipseGeometry e1 = new EllipseGeometry(new Point(10, 10), 20, 20);
EllipseGeometry e2 = new EllipseGeometry(new Point(10, 10), 20, 20);
gg.Children.Add(e1);
gg.Children.Add(e2);
Path p = new Path();
p.Data = gg;
p.Fill = Brushes.Red;
答案 1 :(得分:1)
这是因为您的省略号完全重叠。 GeometryGroup的默认FillRule是EvenOdd,这意味着如果从点到外部的线穿过奇数个边框,则在该形状内部会考虑一个点。这有点像形状的XOR规则。在您的情况下,形状内的点将始终穿过偶数个边框(e1和e2,或者根本没有):因此,几何体内部不会考虑任何点,也不会填充任何点。非正式地,e2在e1中创建了一个消耗整个e1的“漏洞”。请参阅GeometryGroup page on MSDN上的插图。
如果您将FillRule更改为NonZero,您将看到更像“联合”的效果,这可能是您想要实现的效果。