Entwickler-Ecke

Basistechnologien - DefaultValue von Font Property setzen


mariog86 - Do 23.08.07 14:36
Titel: DefaultValue von Font Property setzen
Hallo

Ich habe ein Property vom Typ Font, welches ich mit dem Standartwert SystemFont.DefaultFont initialisiere. Nun möchte ich dem mit dem DefaultValueAttribute einen Standartwert für den Designer zuweisen. Allerdings kann ich damit ja nur einen Hardgecodeten string zuweisen. Das Problem ist aber das der SystemFont.DefaultFont je nach Systemeinstellung des Users ein anderer sein kann, ausserdem kann ich das FontPropertie Font.GdiCharSet mit dem Hardgecodeten String nicht festlegen. Allerdings ist dieses Property wenn man eine neues Font-Objekt erzeugt standartmässig auf 1 in SystemFont.DefaultFont jedoch auf 0 gesetzt. Es ist also so nicht möglich einen DefaultWert zu definierten der SystemFont.DefaultFont entspricht.
Das Font Property der Control-Klasse hat aber auch einen Stanndartwert gesetzt, also muss das irgendwie möglich sein.
Wie kann ich also das gleiche Verhalten erreichen wie z.B. bei der Control-Klasse?


Christian S. - Do 23.08.07 15:52

Hm. Ich habe noch nicht damit gearbeitet, aber Du solltest Dich mal in das Thema "TypeDescriptor", "ICustomTypeDescriptor" und evt. auch "AttributeProviderAttribute" einlesen.


Kha - Do 23.08.07 17:34

TypeDescriptors sind ziemlich mächtige Viecher, was wie so oft mit Komplexität einhergeht. Für Interessierte gab es vor nicht allzu langer Zeit dazu einen Artikel im MSDN-Mag, für alle anderen würde ich aber einen anderen Weg vorschlagen ;) .
user profile iconmariog86 hat folgendes geschrieben:
Das Font Property der Control-Klasse hat aber auch einen Stanndartwert gesetzt, also muss das irgendwie möglich sein.
Dann schau doch im Reflector nach, wie es Control macht :zwinker: .

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:
Font font2;

    [AmbientValue(null)]
    public Font Font2
    {
      get
      {
        return font2 ?? DefaultFont;
      }
      set
      {
        if (value != font2) {
          if (font2 != null)
            font2.Dispose();
          font2 = value;
        }
      }
    }

    public void ResetFont2()
    {
      font2 = null;
    }

    bool ShouldSerializeFont2()
    {
      return font2 != null;
    }


PS: Das wären dann 4 € in unsere Standart-Kaffeekasse.


mariog86 - Fr 24.08.07 08:11

Guten morgen allerseits.

Vielen Dank für die schnellen Antworten.

@ Khabarakh: Deine Lösung hat super funktioniert, allerdings musst du mir noch erklären, wie du schauen kannst wie es das Control macht, wenn ich mir das mit Go To Definition anschauen möchte, sehe ich jeweils nur die Header und nur die sichtbaren.


Kha - Fr 24.08.07 10:38

Die Antwort ist bereits in meinem letzten Beitrag versteckt ;) : Suche bei Google REFLECTOR.

[OT]Hut ab für Herrn Roeder. Dass die Suche nun schon bei diesem einzigen Stichwort funktioniert... [/OT]


mariog86 - Fr 24.08.07 13:09

Wusste gar nicht dass man private Member und sogar Code wieder aus den dll's herausholen kann. Wirklich ein tolles Tool dieser Refelctor.
Danke für den Tipp.