Nasıl yapılır: Bileşik Şeklin Dolgusunu Denetleme
veya bir özelliğinin, bileşik şeklin belirli bir noktanın geometrinin parçası olup olmadığını belirlemek FillRuleGeometryGroup için kullandığı bir PathGeometry "kural" belirtir. için iki olası değer FillRule vardır: EvenOdd ve Nonzero . Aşağıdaki bölümlerde bu iki kuralın nasıl kullanımı açıklanmaktadır.
Evenodd: Bu kural, bir noktanın dolgu bölgesinde olup olmadığını belirlemek için bu noktadan sonsuza herhangi bir yönde bir ray çizerek ve rayın kesiştirilen şekil içindeki yol segmentlerinin sayısını sayarak belirler. Bu sayı tek ise noktanın içindedir; olsa bile, nokta dışındadır.
Örneğin, aşağıdaki XAML, olarak ayarlanmış bir dizi concentric halkadan (hedef) bir bileşik şekil FillRuleEvenOdd oluşturur.
<Path Stroke="Black" StrokeThickness="1" Fill="#CCCCFF">
<Path.Data>
<GeometryGroup FillRule="EvenOdd">
<EllipseGeometry RadiusX="50" RadiusY="50" Center="75,75" />
<EllipseGeometry RadiusX="70" RadiusY="70" Center="75,75" />
<EllipseGeometry RadiusX="100" RadiusY="100" Center="75,75" />
<EllipseGeometry RadiusX="120" RadiusY="120" Center="75,75" />
</GeometryGroup>
</Path.Data>
</Path>
Aşağıdaki çizimde, önceki örnekte oluşturulan şekil gösterilmiştir.

Önceki çizimde, orta ve üçüncü halkanın dolu olmadığını fark edin. Bunun nedeni, bu iki halkanın herhangi bir noktasından çekilen bir rayın çift sayıda segmentten geçerek geçerek çalışmasıdır. Aşağıdaki çizime bakın:

Sıfır: Bu kural, bir noktanın herhangi bir yönde bu noktadan sonsuza bir ray çizerek ve ardından şeklin bir parçasının grafide kesiştir olduğu yerleri inceleerek bir noktanın yolun dolgu bölgesinde olup olmadığını belirler. Sıfır sayısıyla başlayarak, bir Segment grafiyi soldan sağa her kesiştir her sefer bir tane ekleyin ve bir yol segmenti raydan her sağdan sola her çapraz geçişinde bir tane çıkarır. Geçişleri sayma sonrasında sonuç sıfır ise nokta yolun dışında olur. Aksi takdirde, içindedir.
<Path Stroke="Black" StrokeThickness="1" Fill="#CCCCFF">
<Path.Data>
<GeometryGroup FillRule="NonZero">
<EllipseGeometry RadiusX="50" RadiusY="50" Center="75,75" />
<EllipseGeometry RadiusX="70" RadiusY="70" Center="75,75" />
<EllipseGeometry RadiusX="100" RadiusY="100" Center="75,75" />
<EllipseGeometry RadiusX="120" RadiusY="120" Center="75,75" />
</GeometryGroup>
</Path.Data>
</Path>
Önceki örneği kullanarak, bir değeri Nonzero sonucu olarak aşağıdaki çizimi FillRule verir:

Gördüğünüz gibi tüm halkalar doldurulur. Bunun nedeni tüm segmentlerin aynı yönde çalışması ve bu nedenle herhangi bir noktadan çekilen bir rayın bir veya daha fazla segmenti geçmesi ve geçişlerin toplamının sıfıra eşit olmasıdır. Örneğin, aşağıdaki çizimde kırmızı oklar segmentlerin çizilen yönünü, beyaz ok ise en içteki halkadaki bir noktadan çalışan rastgele bir grafiti temsil eder. Sıfır değeriyle başlayarak, rayın kesiştirilen her segment için bir değeri eklenir çünkü segment rayı soldan sağa doğru çaprazlar.

Kuralın davranışını daha iyi göstermek Nonzero için farklı yönlerde çalışan kesimler ile daha karmaşık bir şekil gereklidir. Aşağıdaki XAML kodu, önceki örnekle benzer bir şekil oluşturur ancak daha sonra tam olarak kapalı ve içmser daireler yerine dört bir concentric arc oluşturan bir ile PathGeometryEllipseGeometry oluşturulur.
<Path Stroke="Black" StrokeThickness="1" Fill="#CCCCFF">
<Path.Data>
<GeometryGroup FillRule="NonZero">
<PathGeometry>
<PathGeometry.Figures>
<!-- Inner Ring -->
<PathFigure StartPoint="10,120">
<PathFigure.Segments>
<PathSegmentCollection>
<ArcSegment Size="50,50" IsLargeArc="True" SweepDirection="CounterClockwise" Point="25,120" />
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
<!-- Second Ring -->
<PathFigure StartPoint="10,100">
<PathFigure.Segments>
<PathSegmentCollection>
<ArcSegment Size="70,70" IsLargeArc="True" SweepDirection="CounterClockwise" Point="25,100" />
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
<!-- Third Ring (Not part of path) -->
<PathFigure StartPoint="10,70">
<PathFigure.Segments>
<PathSegmentCollection>
<ArcSegment Size="100,100" IsLargeArc="True" SweepDirection="CounterClockwise" Point="25,70" />
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
<!-- Outer Ring -->
<PathFigure StartPoint="10,300">
<PathFigure.Segments>
<ArcSegment Size="130,130" IsLargeArc="True" SweepDirection="Clockwise" Point="25,300" />
</PathFigure.Segments>
</PathFigure>
</PathGeometry.Figures>
</PathGeometry>
</GeometryGroup>
</Path.Data>
</Path>
Aşağıdaki çizimde, önceki örnekte oluşturulan şekil gösterilmiştir.

Ortadan gelen üçüncü yay dolmadı. Aşağıdaki çizimde bunun neden olduğu gösterilmiştir. Çizimde kırmızı oklar, kesimlerin çizilen yönü temsil ediyor. İki beyaz ok, "doldurulmadı" bölgedeki bir noktadan dışarı doğru hareket eden iki rastgele ışığı temsil eder. Çizimde de görülebilecek gibi, yolundaki segmentleri geçen bir raydan gelen değerlerin toplamı sıfırdır. Yukarıda tanımlandığı gibi sıfır toplamı, noktanın geometrinin (dolgu parçası değil) parçası olmadığını, negatif değer dahil sıfır olan bir toplamın geometrinin bir parçası olduğu anlamına gelir.

Not
amacıyla, tüm FillRule şekiller kapalı olarak kabul edilir. Segmentte boşluk varsa kapatmak için hayali bir çizgi çizin. Yukarıdaki örnekte halkalarda küçük boşluklar vardır. Bu durumda, farklı bir sonuç vermek için boşlukta çalışan bir sıyrı, başka bir yönde çalışan bir sıyrı bekliyor olabilir. Aşağıda, bu boşluklardan birinin ve kapatan "hayali segmentin" (uygulamak amacıyla çizilen segment) büyütülmüş FillRule bir çizimi verilmiştir.
