【问题标题】:Combining LineGeometry with EllipseGeometry (in code, not XAML)将 LineGeometry 与 EllipseGeometry 结合(在代码中,而不是 XAML)
【发布时间】:2013-05-07 11:32:55
【问题描述】:

我正在尝试使用 WPF 创建自定义形状。对于初学者,我只是想创建一条简单的线,每端都有一个圆圈(我知道有 LineCap,但这不是我想要的)。

我查看了一些教程,最简单的方法似乎是使用CombinedGeometry。但是我无法让它正常工作。这是我创建几何对象的代码:

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);

            // Freeze the geometry for performance benefits
            combined2.Freeze();

            return combined2;
        }
    }

但是,由于某种原因,这并没有划清界限。它画了两个圆圈,但不画线。显然我在这里遗漏了一些东西,有人可以指出什么吗? :)

以防万一,这是课程的其余部分:

#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
            )
    );

#endregion
#region CLR Properties

public double X1
{
    get { return (double)base.GetValue(X1Property); }
    set { base.SetValue(X1Property, value); }
}

public double Y1
{
    get { return (double)base.GetValue(Y1Property); }
    set { base.SetValue(Y1Property, value); }
}

public double X2
{
    get { return (double)base.GetValue(X2Property); }
    set { base.SetValue(X2Property, value); }
}

public double Y2
{
    get { return (double)base.GetValue(Y2Property); }
    set { base.SetValue(Y2Property, value); }
}

public Point StartPoint
{
    get { return (new Point(X1, Y1)); }
}

public Point EndPoint
{
    get { return (new Point(X2, Y2)); }
}

public double CapDiameter
{
    get { return (double)base.GetValue(CapDiameterProperty); }
    set { base.SetValue(CapDiameterProperty, value); }
}

#endregion

这是我用来测试它的XAML 代码:

<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>

【问题讨论】:

    标签: c# wpf geometry shape


    【解决方案1】:

    如果您尝试Union,您的LineGeometry 对象将会消失。来自 MSDN:

    GeometryCombineMode 属性指定两个几何图形将如何 被结合。请注意,CombinedGeometry 组合了由 两个几何,所以没有面积的几何(例如 LineGeometry) 组合时消失。

    你可以使用GeometryGroup:

    GeometryGroup combined = new GeometryGroup();
    combined.Children.Add(ellipse1);
    combined.Children.Add(ellipse2);
    combined.Children.Add(line);
    

    或者您可以先在椭圆对象上使用CombinedGeometry,然后使用GeometryGroup 将其与直线组合在一起。

    【讨论】:

    • 非常感谢!做到了。
    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2016-11-18
    • 1970-01-01
    相关资源
    最近更新 更多