Combine Shapes in Windows Presentation Foundation

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!

[advertisement] Axosoft OnTime 2008 is four developer tools in one: bug tracking, project wiki, feature management, and help desk. It manages your development process so developers can focus on coding. Installed or Hosted – Free Single-user license -- Free 30-day team trial.

2 Comments : 12.21.06

Feedbacks

 avatar
#1
DotNetKicks.com
12.21.2006 @ 1:00 PM
You've been kicked (a good thing) - Trackback from DotNetKicks.com
 avatar
#2
davidvogt
02.03.2007 @ 9:01 AM
Your article is very informative and helped me further. Thanks, David

Leave a Comment