C# 单击时自定义形状绘制不正确

C# 单击时自定义形状绘制不正确,c#,wpf,C#,Wpf,图形绘制不正确或根本不正确-也就是说,如果我朝画布左上角单击,它将绘制椭圆,但不会在其他任何地方。代码在逻辑上正确吗?一切似乎都很好,但也许我错过了什么 /* in mainwindow.xaml */ private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (btnNode.IsChecked == true) {

图形绘制不正确或根本不正确-也就是说,如果我朝画布左上角单击,它将绘制椭圆,但不会在其他任何地方。代码在逻辑上正确吗?一切似乎都很好,但也许我错过了什么

    /* in mainwindow.xaml */
    private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (btnNode.IsChecked == true)
        {
            CreateNode(e.GetPosition(Canvas));
        }

    }

    private void CreateNode(Point origin)
    {
        Node n = new Node("new_" + cmbStart.Items.Count, origin) { Fill = new SolidColorBrush(Colors.Tomato), Width = 60, Height = 60 };
        Canvas.Children.Add(n);

        Canvas.SetLeft(n, origin.X - n.Width/2);
        Canvas.SetTop(n, origin.Y - n.Height/2);
    }

     /* in Node class */

     private void Init(Point p)
     {
        X = p.X;
        Y = p.Y;            
     }

     public double Y
     {
        get { return (double)this.GetValue(YProperty); }
        set { this.SetValue(YProperty, value); }
     }

     public double X
     {
        get { return (double) this.GetValue(XProperty); }
        set { this.SetValue(XProperty, value); }
     }

     public static readonly DependencyProperty XProperty = DependencyProperty.Register("X", typeof(double), typeof(Node), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender));
     public static readonly DependencyProperty YProperty = DependencyProperty.Register("Y", typeof(double), typeof(Node), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender));

     protected override Geometry DefiningGeometry
     {
        get 
        {
            Console.WriteLine("rendering at: " + this.X + ", " + this.Y + "---Scale: " + Width);
            return new EllipseGeometry(new Point(this.X, this.Y), Width, Height);
        }
     }

EllipseGeometry
构造函数有
radiusX
radiusY
参数来传递半径,而不是直径

如果要在自定义控件的边界中绘制完整的椭圆,应使用
Width/2
Height/2
作为参数值:

protected override Geometry DefiningGeometry
{
    get 
    {
        return new EllipseGeometry(new Point(X, Y), Width / 2, Height / 2);
    }
}

不要同时设置椭圆曲线和Canvas.Left/Canvas.Top的中心点。设置一个或另一个。也不起作用。画布的左上角似乎有一个正方形,我在我的原始帖子中上传了一张图片。