ComponentModel Attribut für Propertie -Kategorien

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    ComponentModel Attribut für Propertie -Kategorien

    Guten Abend,

    ich würde gerne einige Eigenschaften eines selbst erstellten Steuerelements in einer Kategorie zusammen fassen. Finde allerdings die richtigen Attribute dafür nicht. Ich habe als Beispiel ein Bild angehängt in dem die Eigenschaften Height und Width so zusammen gefasst sind wie ich das gerne hätte.

    Kann mir jemand veraten mit welchen ComponentModel Attribut ich das realisieren kann?
    Bilder
    • tileSize.png

      1,56 kB, 440×62, 68 mal angesehen
    Es geht mir nich um die Eingenschaft TileSize, damit wollte ich nur deutlich machen was ich mit 'Kategorie' meine. Ich habe mehrere Eigenschaften die ich nun in einem ausklappbaren Container im Eigenschafts -Fenster des Designers unterbringen will.
    Es gibt ein CategoryAttribute, mit dem man Properties in gewissen vorgegebenen Kategorien einordnen kann.
    Das ist aber nicht, was in dem Bild oben passiert, wie ich sagte. Wie du hier im Quellcode der TileSize-Property sehen kannst, besitzt sie kein solches Attribut, welches du suchst:

    Stattdessen erkennt der Designer, dass TileSize vom Typ Size ist, welcher wiederum Width und Height zur Verfügung stellt, und zeigt diese separat an.
    Stattdessen erkennt der Designer, dass TileSize vom Typ Size ist

    Vielen Dank damit hast du mir sehr geholfen.
    Um dem Designer zu vermitellen wie er die Eigenschaften darstellen muss benötigt man eine TypeConverter -Klasse. Diese Erbt in meinem Fall von ExpandableObjectConverter Dadurch lässt sich die Kategorie zu und aufklappen.

    Die Converter Klasse
    Spoiler anzeigen

    C#-Quellcode

    1. class ColumnHeaderResizeConverter : ExpandableObjectConverter
    2. {
    3. public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    4. {
    5. if (destinationType == typeof(ColumnHeaderResizeStyleClass))
    6. return true;
    7. return base.CanConvertTo(context, destinationType);
    8. }
    9. public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    10. {
    11. if (destinationType == typeof(string) && value is ColumnHeaderResizeStyleClass) {
    12. ColumnHeaderResizeStyleClass resizeStyle = (ColumnHeaderResizeStyleClass)value;
    13. return string.Format("ColumnIndex: {0}, ColumnHeaderResizeStyle: {1}", resizeStyle.ColumnIndex, resizeStyle.ColumnHeaderResizeStyle);
    14. }
    15. return base.ConvertTo(context, culture, value, destinationType);
    16. }
    17. public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    18. {
    19. if (sourceType == typeof(string))
    20. return true;
    21. return base.CanConvertFrom(context, sourceType);
    22. }
    23. public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    24. {
    25. if (value is string) {
    26. string s = (string)value;
    27. if (s.Contains(":") && s.Contains(",")) {
    28. ColumnHeaderResizeStyleClass resizeStyle = new ColumnHeaderResizeStyleClass();
    29. string[] sValue = s.Split(',');
    30. string[] sBuffer = sValue[0].Split(':');
    31. int i;
    32. if (Int32.TryParse(sBuffer[0], out i))
    33. resizeStyle.ColumnIndex = i;
    34. sBuffer = sValue[1].Split(':');
    35. if (sBuffer[0] == ColumnHeaderAutoResizeStyle.ColumnContent.ToString())
    36. resizeStyle.ColumnHeaderResizeStyle = ColumnHeaderAutoResizeStyle.ColumnContent;
    37. else if (sBuffer[0] == ColumnHeaderAutoResizeStyle.HeaderSize.ToString())
    38. resizeStyle.ColumnHeaderResizeStyle = ColumnHeaderAutoResizeStyle.HeaderSize;
    39. else
    40. resizeStyle.ColumnHeaderResizeStyle = ColumnHeaderAutoResizeStyle.None;
    41. return resizeStyle;
    42. }
    43. }
    44. return base.ConvertFrom(context, culture, value);
    45. }
    46. }



    Im Anschluss wird noch eine Klasse benötigt die die Eigenschaften bereit hält, diese Klasse wird dann mit dem TypConverterAttribute versehen und als TypeConverter wird die Converter -Klasse übergeben.

    Die Eingenschafts -Klasse
    Spoiler anzeigen

    C#-Quellcode

    1. [TypeConverterAttribute(typeof(ColumnHeaderResizeConverter))]
    2. public class ColumnHeaderResizeStyleClass
    3. {
    4. [DefaultValueAttribute(0)]
    5. public int ColumnIndex
    6. {
    7. get { return iColumnIndex; }
    8. set { iColumnIndex = value; }
    9. }
    10. [Browsable(true), DefaultValueAttribute(ColumnHeaderAutoResizeStyle.ColumnContent)]
    11. public ColumnHeaderAutoResizeStyle ColumnHeaderResizeStyle
    12. {
    13. get { return columnHeaderResizeStyle; }
    14. set { columnHeaderResizeStyle = value; }
    15. }
    16. private int iColumnIndex;
    17. private ColumnHeaderAutoResizeStyle columnHeaderResizeStyle;
    18. }



    Für den Fall das es noch jemanden interesiert.
    Bilder
    • tileSize.png

      5,54 kB, 793×101, 62 mal angesehen