Hi!
Ich kopier das jetzt mal aus einem alten Projekt von mir raus und versuche mich zu erinnern, was ich da gemacht habe. Kann also sein, dass nicht alles korrekt ist. Und "Jugendsünden" können auch noch drin sein
Im Projekt hatte ich Klasse "DataPoint", die fast dasselbe wie ein normaler Point war und entsprechend auch einen solchen Editor, wie Dein Screenshot ihn zeigt, haben sollte.
Erst einmal die DataPoint-Klasse:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| [TypeConverterAttribute(typeof(DataPointConverter))] public class DataPoint { private double x;
[NotifyParentProperty(true)] [RefreshProperties(RefreshProperties.Repaint)] public double X { get { return x; } set { x = value; } } private double y;
[NotifyParentProperty(true)] [RefreshProperties(RefreshProperties.Repaint)] public double Y { get { return y; } set { y = value; } }
public DataPoint(double X, double Y) { this.X = X; this.Y = Y; }
public DataPoint() { this.X = 0; this.Y = 0; }
public override string ToString() { return this.X.ToString() + "; " + this.Y.ToString(); } } |
Zu beachten ist das erste Attribut, welches auf eine Converter-Klasse für diesen DataPoint verweist. (Die anderen Attribute kann man sich als Komponenten-Entwickler sicherlich auch mal ansehen

)
Nun also diese Converter-Klasse. Die ist im wesentlichen dazu da, dass ein String der Form "3.14; 42" in einen korrekten DataPoint umgewandelt wird:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
| public class DataPointConverter : ExpandableObjectConverter {
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(DataPoint)) return true;
return base.CanConvertTo(context, destinationType); }
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(System.String) && value is DataPoint) { return ((DataPoint)value).ToString(); }
return base.ConvertTo(context, culture, value, destinationType); }
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(System.String)) return true;
return base.CanConvertFrom(context, sourceType); }
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value is string) { try{ string s = (string)value; string[] parts = s.Split(new char[] {';'}); DataPoint dp = new DataPoint(); dp.X = Double.Parse(parts[0].Trim()); dp.Y = Double.Parse(parts[1].Trim()); return dp; } catch { throw new ArgumentException("Cannot convert!"); } } return base.ConvertFrom(context, culture, value); }
public override bool GetCreateInstanceSupported(ITypeDescriptorContext context) { return true; }
public override object CreateInstance(ITypeDescriptorContext context, System.Collections.IDictionary propertyValues) { return new DataPoint((double)propertyValues["X"], (double)propertyValues["Y"]); } } |
Hier ist zu beachten, dass der Converter von
ExpandableObjectConverter abgelitten ist. Der Rest ist eigentlich ziemlich einfach. Du hast einmal die Konvertierung eines Strings in einen DataPoint (in der ConvertFrom-Methode) und die umgekehrte Richtung (ConvertTo-Methode), was aber nur ToString auruft. Und CreateInstance ist dazu da, dass aus einem Werte-Paar ein neuer DataPoint erzeugt werden kann.
So, das sollte eigentlich auf Deinen Fall recht einfach übertragbar sein, Du hast halt Farben anstatt Zahlen
Grüße
Christian
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".