I am trying to create a custom form using WPF. For starters, I was just trying to create a simple line that has a circle at each end (I know there are LineCaps, but that's not what I'm looking for).
I have learned some lessons and the easiest way to do this seems to be using CombinedGeometry . However, I cannot get it to work correctly. Here is my code that creates the geometry object:
protected override Geometry DefiningGeometry { get { Point ellipseCenter1 = new Point(X1 - this.CapDiameter / 2, Y1 - this.CapDiameter / 2); Point ellipseCenter2 = new Point(X2 - this.CapDiameter / 2, Y2 - this.CapDiameter / 2); var ellipse1 = new EllipseGeometry(ellipseCenter1, CapDiameter, CapDiameter); var ellipse2 = new EllipseGeometry(ellipseCenter2, CapDiameter, CapDiameter); var line = new LineGeometry(this.StartPoint, this.EndPoint); var combined1 = new CombinedGeometry(GeometryCombineMode.Union, ellipse1, line); var combined2 = new CombinedGeometry(GeometryCombineMode.Union, combined1, ellipse2);
However, for some reason this does not output a string. He draws both circles, but not a line. Obviously I missed something, can someone please indicate what? :)
Just in case, this is important, here is the rest of the class:
#region Dependency Properties public static readonly DependencyProperty X1Property = DependencyProperty.Register( "X1", typeof(double), typeof(CappedLine), new FrameworkPropertyMetadata( 0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure ) ); public static readonly DependencyProperty Y1Property = DependencyProperty.Register( "Y1", typeof(double), typeof(CappedLine), new FrameworkPropertyMetadata( 0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure ) ); public static readonly DependencyProperty X2Property = DependencyProperty.Register( "X2", typeof(double), typeof(CappedLine), new FrameworkPropertyMetadata( 0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure ) ); public static readonly DependencyProperty Y2Property = DependencyProperty.Register( "Y2", typeof(double), typeof(CappedLine), new FrameworkPropertyMetadata( 0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure ) ); public static readonly DependencyProperty CapDiameterProperty = DependencyProperty.Register( "CapDiameter", typeof(double), typeof(CappedLine), new FrameworkPropertyMetadata( 0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure ) );
And here is the XAML code that I used to verify it:
<Window x:Class="HG.WPF.Shapes.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:shapes="clr-namespace:Tomers.WPF.Shapes" Title="WPF Custom Shapes" Height="300" Width="300" ResizeMode="NoResize"> <Canvas Background="Black"> <shapes:CappedLine X1="30" Y1="30" X2="200" Y2="200" CapDiameter="5" Fill="White" Stroke="White" StrokeThickness="2"></shapes:CappedLine> </Canvas> </Window>