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

前端 未结 2 1291
有刺的猬
有刺的猬 2021-01-20 00:40

I\'m creating custom control that will draw shape from list (or array) of points. I have basic drawing functionality done, but now I\'m struggling with design-time support i

相关标签:
2条回答
  • 2021-01-20 01:19

    If you can add a reference to PresentationCore and WindowsBase, you can utilize the 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; }
    }
    

    Hope that can help.

    0 讨论(0)
  • 2021-01-20 01:27

    You can create a custom collection editor deriving CollectionEditor and set typeof(List<Point>) as collection type, also register a new TypeConverterAttribute for Point:

    // 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;
        }
    }
    

    Then it's enough to register it as editor of your 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; }
    }
    
    0 讨论(0)
提交回复
热议问题