Autor Beitrag
vermis-one
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 25

Win XP
VB.NET/C# VS2008express, XNA3.0 CTP
BeitragVerfasst: Do 18.09.08 16:12 
Hallo zusammen.

Ich habe ein Typ erstellt, der zwei Color-Eigenschaften besitzt.
Diesen Typ habe ich in ein UserControl als Eigenschaft verwendet.
Im Designer wird der Wert der Eigenschaft als meinen Typ im Klartext angezeigt.

Meine Frage ist nun, wie kriege ich den Designer dazu meine Eigenschaft zu einbauen damit ich beide Farben einzeln ändern kann ?

Zum besseren Verständnis ein Beispiel:
Im Eigenschaftsfenster eines Forms findet sich unter anderem die Location. Ich kann jetzt die X/Y Werte entweder mit Semiokolon getrennt eingeben oder ich "klappe" es auf und gebe jeden Wert einzeln ein.

Ich habe auch noch ein Bild angehängt, wo man´s sehen kann, was ich meine.

Ehrlich gesagt hab ich keine blassen Schimmer unter welchen Stichworten man suchen könnte.
Aber möglich müsste es sein, da der Designer das bei Typen wie Point und Size ja auch macht.
Weiß jemand Rat ?

mfg


Moderiert von user profile iconChristian S.: Topic aus Sonstiges (.NET) verschoben am Do 18.09.2008 um 16:33
Einloggen, um Attachments anzusehen!
_________________
Vor dem Zweiten Weltkrieg war das Leben einfach, danach gab es Computer. Grace Hopper
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 18.09.08 16:30 
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:
ausblenden volle Höhe C#-Quelltext
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:
ausblenden volle Höhe C#-Quelltext
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".
vermis-one Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 25

Win XP
VB.NET/C# VS2008express, XNA3.0 CTP
BeitragVerfasst: Fr 19.09.08 08:50 
Guten Morgen

Das war genau das was ich gesucht habe. Danke.
Für meine Zwecke brauchte ich nur den zu konvertierenden Typ austauschen, damit es funktionierte. Den Rest hab ich erstmal komplett übernommen.

mfg

_________________
Vor dem Zweiten Weltkrieg war das Leben einfach, danach gab es Computer. Grace Hopper