I'm Keyvan Nayyeri, a 25 years old Ph.D. student at
the Computer Science department of
the University of Texas at San Antonio.
I'm also
a Software Architect and Developer and previously held a B.Sc.
degree in Applied Mathematics.
This is my blog where I publish content about various topics specifically Programming Languages and Compilers, Software
Engineering and Programming.
Sometimes it's necessary to combine two shapes to get a new custom shape. Windows Presentation Foundation and XAML provide all means to do this easily.
Using <CombinedGeometry /> element you can combine two shapes in a path. It can combine two shapes via its child elements (<CombinedGeometry.Geometry1 /> and <CombinedGeometry.Geometry2). Each of these elements can get a geometry and their parent, <CombinedGeometry />, can combine them.
<CombinedGeometry /> has a GeometryCombineMode attribute to set the combine mode. It can get one of following values. To understand these modes apply these operations to two sets in mathematics!
Let's see some example.
Below is a XAML code that draws two ellipses and fills them with LightSkyBlue color and Black border. It uses Union mode to combine two shapes.
<Window x:Class="CombineShapes.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Combine Shapes in WPF" Height="330" Width="310"
>
<StackPanel>
<Path Fill="LightSkyBlue" Stroke="Black">
<Path.Data>
<CombinedGeometry GeometryCombineMode="Union">
<CombinedGeometry.Geometry1>
<EllipseGeometry Center="100,150" RadiusX="70" RadiusY="30" />
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<EllipseGeometry Center="200,150" RadiusX="70" RadiusY="30" />
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
</StackPanel>
</Window>

In second example Intersect combine mode is used.
<Window x:Class="CombineShapes.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Combine Shapes in WPF" Height="330" Width="310"
>
<StackPanel>
<Path Fill="LightSkyBlue" Stroke="Black">
<Path.Data>
<CombinedGeometry GeometryCombineMode="Intersect">
<CombinedGeometry.Geometry1>
<EllipseGeometry Center="100,150" RadiusX="70" RadiusY="30" />
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<EllipseGeometry Center="200,150" RadiusX="70" RadiusY="30" />
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
</StackPanel>
</Window>

Third code uses Xor mode to combine shapes.
<Window x:Class="CombineShapes.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Combine Shapes in WPF" Height="330" Width="310"
>
<StackPanel>
<Path Fill="LightSkyBlue" Stroke="Black">
<Path.Data>
<CombinedGeometry GeometryCombineMode="Xor">
<CombinedGeometry.Geometry1>
<EllipseGeometry Center="100,150" RadiusX="70" RadiusY="30" />
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<EllipseGeometry Center="200,150" RadiusX="70" RadiusY="30" />
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
</StackPanel>
</Window>

And finally last code and Exclude mode.
<Window x:Class="CombineShapes.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Combine Shapes in WPF" Height="330" Width="310"
>
<StackPanel>
<Path Fill="LightSkyBlue" Stroke="Black">
<Path.Data>
<CombinedGeometry GeometryCombineMode="Exclude">
<CombinedGeometry.Geometry1>
<EllipseGeometry Center="100,150" RadiusX="70" RadiusY="30" />
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<EllipseGeometry Center="200,150" RadiusX="70" RadiusY="30" />
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
</StackPanel>
</Window>

It's also possible to combine more than two shapes using a mathematical tip: when something is true for K it's possible to extend it for K+1 using mathematical induction!
DotNetKicks.com
Dec 21, 2006 1:00 PM
#
davidvogt
Feb 03, 2007 9:01 AM
#
Subho100
Feb 15, 2010 1:26 AM
#
Leave a Comment