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

本文关键字:绘制 不正确 自定义 单击 | 更新日期: 2023-09-27 18:22:02

该形状绘制不正确或根本不正确-也就是说,如果我单击画布的左上角,它将绘制一个椭圆,但不会绘制其他类似的形状。代码在逻辑上正确吗?一切看起来都很好,但也许我错过了什么。

    /* 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构造函数具有用于传递半径而非直径的radiusXradiusY参数。

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

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