UserControl AutoSize Eigenschaft

UserControl AutoSize Eigenschaft

Im folgenden Artikel möchte ich euch erklären, wie ihr eigene Windows.Forms Controls so anpassen könnt, dass diese die AutoSize Eigenschaft unterstützen. Diese Eigenschaft sorgt dafür, dass das Control die Größe automatisch an den Inhalt anpasst.
Ein Beispiel Control, welches diese Eigenschaft standardmäßig verwendet, wäre z.B. das Label.

AutoSize Eigenschaft

Um die Eigenschaft überhaupt in den Eigenschaften in der Designer Ansicht zur Verfügung zu haben, müsst ihr beachten, dass das Attribute [Browsable(true)] gesetzt ist. Dieses Attribute gibt an, ob eine Eigenschaft im PropertyGrid angezeigt wird.

Falls ihr wie gewöhnlich als Basisklasse UserControl nutzt, ist das bereits der Fall. Das veranschaulicht der folgende Screenshot.


Solltet ihr jedoch als Basisklasse Control nutzen, müsst ihr die Eigenschaft selbst als Sichtbar markieren. Da die Eigenschaft standardmäßig nicht angezeigt wird. Schaut euch dazu folgenden Screenshot an.


ControlDesigner Klasse erzeugen

Um das Verhalten des Designers anzupassen, müsst ihr für euer Control eine eigene ControlDesigner Klasse definieren.
Erzeugt also eine neue Klasse, die ihr wie euer Control und als Zusatz ControlDesigner nennt.
Fügt eine Referenz zu System.Design hinzu und leitet eure Klasse von ControlDesigner ab. Danach müsst ihr nur noch die Eigenschaft AutoResizeHandles auf true setzen. Das bewirkt, dass der Designer die Resize Handles in der Designer Ansicht nur noch anzeigt, wenn die Eigenschaft AutoSize nicht gesetzt ist.

Der Code müsste also in etwas wie folgt aussehen.
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
class MyControlDesigner : ControlDesigner
{
    public MyControlDesigner()
    {
        AutoResizeHandles = true;
    }
}

ControlDesigner Klasse verwenden

Als nächstes müsst ihr die soeben erstellte Klasse nur noch bei eurem Control angeben. Das macht ihr über das Attribute DesignerAttribute.
Dadurch veranlasst ihr den Designer, die von euch erstellte Klasse zu verwenden. Dort könnt ihr jegliches Verhalten anpassen.
Es wäre dort auch möglich, Smart Tags einzubinden oder die Darstellung anzupassen. Ihr könntet also auch einen Rand zeichnen, wie es das Panel Control in der Designer Ansicht macht. Schaut euch einfach fertige Designer Klassen an, um das Verhalten besser zu verstehen.

Damit mein Control standardmäßig AutoSize gesetzt hat, habe ich die Eigenschaften im Constuctor bereits gesetzt.
[DesignerAttribute(typeof(MyControlDesigner))]
public partial class MyControl : UserControl
{
    public MyControl()
    {
        InitializeComponent();

        AutoSize = true;
        SetAutoSizeMode(AutoSizeMode.GrowAndShrink);
    }
}

Von nun an könnt ihr das Control nur noch in der Größe verändern, wenn AutoSize = false gesetzt ist.



AutoSize erzwingen

Ab und an ist es hingegen auch Sinnvoll, dass euer Control die AutoSize Eigenschaft erzwingt. Dazu könnt ihr im ControlDesigner die Eigenschaft SelectionRules überschreiben. Diese gibt an, was genau im Designer für das Control möglich ist. Um keine Veränderung der Größe zuzulassen, könnt ihr also wie folgt die Eigenschaft überschreiben.

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
class MyControlDesigner : ControlDesigner
{
    public MyControlDesigner()
    {
    }

    public override SelectionRules SelectionRules
    {
        get { return SelectionRules.Moveable | SelectionRules.Locked | SelectionRules.Visible; }
    }
}

Nun kann das Control nicht mehr in der Größe verändert werden, unabhängig von der AutoSize Eigenschaft.
Ihr solltet diese auch im Property Grid ausblenden, da es keinen Sinn mehr ergibt, diese zu setzen. Zusätzlich wäre es auch Sinnvoll den AutoSizeMode auszublenden.

[DesignerAttribute(typeof(MyControlDesigner))]
public partial class MyControl : UserControl
{
    public MyControl()
    {
        InitializeComponent();
    }

    [Browsable(false)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public override bool AutoSize
    {
        get { return base.AutoSize; }
        set { base.AutoSize = value; }
    }

    [Browsable(false)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public new AutoSizeMode AutoSizeMode
    {
        get { return base.AutoSizeMode; }
        set { base.AutoSizeMode = value; }
    }
}

Probiert einfach ein wenig aus. Die Klasse ControlDesigner bietet hier noch allerhand weitere Möglichkeiten.

Viel Spaß beim entwerfen eigener Controls.
Um einen Kommentar zu hinterlassen, ist eine Anmeldung erforderlich.