2

Ich erstelle benutzerdefiniertes Steuerelement, das Form aus Liste (oder Array) von Punkten zeichnen wird. Ich habe grundlegende Zeichenfunktionen ausgeführt, aber jetzt habe ich Probleme mit der Entwurfszeitunterstützung in Visual Studio.Kann Punkt [] oder Liste <Point> zur Entwurfszeit nicht bearbeiten

Ich habe zwei Eigenschaften erstellt:

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

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

Wie unten Point auf dem Bildschirm zu sehen ist editierbar, aber Editor für Points funktioniert nicht. Für jede Eigenschaft ich Fehler Object does not match target type.

enter image description here

Wenn ich Point-MyPoint (benutzerdefinierte Klasse mit X, Y Eigenschaften) Editor funktioniert gut zu ändern, aber ich möchte nicht, nicht mehr benötigte Extraklasse erstellen, da Editor tut nicht funktionieren, wenn es sollte.

Meine Frage ist: Kann ich Array oder Liste von Punkt als öffentliche Eigenschaft verwenden und Design-Zeit-Unterstützung dafür haben?

+0

Das Problem könnte der Sammlungs-Editor sein, der "Punkt" für "pointf" verwirrt http://stackoverflow.com/questions/2597737/collectionedi tor-rending-object-does-not-match-target-type-for-system-drawin –

+0

@TimothyGroote danke für den Link – Misiu

Antwort

1

Sie können eine benutzerdefinierte Sammlung Editor CollectionEditor Ableitung erstellen und typeof(List<Point>) als Kollektionstyp, registrieren auch eine neue TypeConverterAttribute für 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; 
    } 
} 

Dann ist es genug es als Editor Ihrer List<Point> zu registrieren:

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

Danke. Das funktioniert gut. Ich habe ein Problem mit 'Designer.cs' Datei. Nach dem Hinzufügen von Punkten sind sie in 'Designer.cs' sichtbar als' this.shape1.Points.Add ((System.Drawing.Point) (resources.GetObject ("shape1.Points")))); 'Kann ich das ändern? , damit ich anstelle von Ressourcen Werte in Designer sehen kann? Muss ich irgendeine Art von Konverter dafür erstellen? – Misiu

+0

Nach dem Schließen des Dialogs (nach 'EditValue') setze den Konverter wieder auf' PointConverter'. Ich habe den Beitrag bearbeitet. –

+0

Fantastisch! Danke für die Hilfe. – Misiu

1

Wenn Sie einen Verweis auf PresentationCore und WindowsBase hinzufügen können, können Sie die 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; } 
} 

Hoffnung verwenden, die helfen können.

+0

Danke für den Vorschlag, ich werde diese Frage für einige Zeit offen lassen. Ihre Lösung ist eine Option, erfordert jedoch zwei Abhängigkeiten. Ich möchte sie so minimal wie möglich halten, also wird es vielleicht eine Option geben, stattdessen Punktpunkte zu verwenden, aber mit eingebauten Sammlungen – Misiu

+0

@Misiu, keine Sorge, es offen zu lassen, wäre ich neugierig, wenn es einen anderen Weg gibt beinhaltet auch keine benutzerdefinierte Klasse oder benutzerdefinierten Container. Aber aus Neugier, welche Version des .NET Frameworks zielen Sie? 'PresentationCore' und' WindowsBase' sind seit 3.0 Teil des .NET Frameworks, daher fügt das Hinzufügen einer Referenz zu ihnen keine Abhängigkeit hinzu, wie das Hinzufügen eines Verweises auf das 'XNA' Framework wäre ..? – txtechhelp