无法在设计时编辑 Point[] 或 List<Point>

Can't edit Point[] or List<Point> at design time

我正在创建将从点列表(或数组)绘制形状的自定义控件。 我已经完成了基本的绘图功能,但现在我正在为 Visual Studio.

中的设计时支持而苦苦挣扎

我创建了两个属性:

private Point _point;
public Point Point
{
    get { return _point; }
    set { _point = value; }
}

private Point[] _points;
public Point[] Points
{
    get { return _points; }
    set { _points = value; }
}

如下面的屏幕所示,Point 是可编辑的,但 Points 的编辑器不工作。对于每个 属性 我得到错误 Object does not match target type.

如果我将 Point 更改为 MyPoint(具有 X、Y 属性的自定义 class)编辑器工作正常,但我不想创建不需要的额外 class 因为编辑器在应该工作的时候不工作。

我的问题是:我可以将数组或点列表用作 public 属性 并为其提供设计时支持吗?

如果您可以添加对 PresentationCoreWindowsBase 的引用,则可以利用 System.Windows.Media.PointCollection

private System.Windows.Media.PointCollection _points = new System.Windows.Media.PointCollection();
public System.Windows.Media.PointCollection Points
{
    get { return _points; }
    set { _points = value; }
}

希望能帮到你。

您可以创建一个派生 CollectionEditor 的自定义集合编辑器并将 typeof(List<Point>) 设置为集合类型,同时为 Point 注册一个新的 TypeConverterAttribute:

// Add reference to System.Design
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.ComponentModel.Design;

public class MyPointCollectionEditor : CollectionEditor
{
    public MyPointCollectionEditor() : base(typeof(List<Point>)) { }
    public override object EditValue(ITypeDescriptorContext context,
        IServiceProvider provider, object value)
    {
        TypeDescriptor.AddAttributes(typeof(Point), 
            new Attribute[] { new TypeConverterAttribute() });
        var result = base.EditValue(context, provider, value);
        TypeDescriptor.AddAttributes(typeof(Point), 
            new Attribute[] { new TypeConverterAttribute(typeof(PointConverter)) });
        return result;
    }
}

然后将其注册为您的 List<Point>:

的编辑器就足够了
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;

public class MyClass : Component
{
    public MyClass() { Points = new List<Point>(); }

    [Editor(typeof(MyPointCollectionEditor), typeof(UITypeEditor))]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public List<Point> Points { get; private set; }
}