2012-03-25 4 views
4

Ich möchte eine AutoSize-Eigenschaft in einem benutzerdefinierten Steuerelement (nicht User Control) implementieren, so dass es wie andere standardmäßige .NET WinForms-Steuerelemente verhält, die AutoSize (ala CheckBox) im Entwurfsmodus implementieren.Wie kann ich eine AutoSize-Eigenschaft für ein benutzerdefiniertes Steuerelement implementieren?

Ich habe die Eigenschaft eingerichtet, aber es ist die Art, wie sich die Steuerung im Entwurfsmodus verhält, die mich stört. es kann immer noch in der Größe geändert werden, was nicht sinnvoll ist, weil die visuelle Größenänderung nicht in den AutoSize und Size-Eigenschaften, die ich implementiert habe, widergespiegelt wird.

Standard-.NET-Steuerelemente erlauben keine Größenänderung (oder sogar Größenänderungskennzeichen anzeigen) im Entwurfsmodus, wenn AutoSize wahr ist. Ich möchte, dass sich meine Kontrolle auf die gleiche Weise verhält.

bearbeiten: Ich habe es arbeiten, um die SetBoundsCore() überschreiben verwenden, aber es nicht visuell beschränken ein Resize wenn Autosize auf true gesetzt ist, es hat genau die gleiche Wirkung; die Funktionalität ist gleichwertig, aber es fühlt sich unnatürlich an.

protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) 
{ 
    if (!this.auto_size) 
     this.size = new Size(width, height); 
    base.SetBoundsCore(x, y, this.size.Width, this.size.Height, specified); 
} 

Irgendwelche Ideen, dies auf die übliche Weise zu tun?

+0

Welche UI-Bibliothek verwenden Sie? Winforms? WPF? ASP.NET? Etwas anderes? – svick

+0

Winforms, bearbeitet in =] – mina

+0

hast du versucht, ein sizechanged-Event hinzuzufügen und deine Resize-Logik dort zu platzieren? – Oztaco

Antwort

0

Rufen Sie in dem Konstruktor Ihres Steuerelements SetAutoSizeMode (AutoSizeMode.GrowAndShrink) auf.

0

Überschreiben SizeFromClientSize() Methode. In dieser Methode müssen Sie die erforderliche Größe für Ihre Kontrolle berechnen und zurückgeben.

3

Hier ist mein Rezept für die AutoSize-Steuerung.

Erstellen Sie eine Methode GetAutoSize(), um die erforderliche Größe des Steuerelements gemäß Ihrer spezifischen Implementierung zu berechnen. Vielleicht ist es die Größe des darin enthaltenen Textes oder die Gesamthöhe der Steuerelemente für die aktuelle Breite, was auch immer.

Erstellen Sie eine Methode ResizeForAutoSize(), um zu erzwingen, dass das Steuerelement nach einer Änderung seines Status seine Größe ändert. Wenn das Steuerelement beispielsweise für den darin enthaltenen Text skaliert ist, sollte das Steuerelement beim Ändern des Textes in der Größe geändert werden. Rufen Sie diese Methode einfach auf, wenn sich der Text ändert.

Überschreiben Sie GetPreferredSize(), um denjenigen zu informieren, der (wie ein FlowLayoutPanel zum Beispiel) wissen möchte, welche Größe wir bevorzugen.

Setzen Sie SetBoundsCore() außer Kraft, um unsere Größenregel auf die gleiche Weise zu erzwingen, wie eine AutoSize-Beschriftung nicht skaliert werden kann.

Siehe Beispiel hier.

/// <summary> 
/// Method that forces the control to resize itself when in AutoSize following 
/// a change in its state that affect the size. 
/// </summary> 
private void ResizeForAutoSize() 
{ 
    if(this.AutoSize) 
     this.SetBoundsCore(this.Left, this.Top, this.Width, this.Height, 
        BoundsSpecified.Size); 
} 

/// <summary> 
/// Calculate the required size of the control if in AutoSize. 
/// </summary> 
/// <returns>Size.</returns> 
private Size GetAutoSize() 
{ 
    // Do your specific calculation here... 
    Size size = new Size(100, 20); 

    return size; 
} 

/// <summary> 
/// Retrieves the size of a rectangular area into which 
/// a control can be fitted. 
/// </summary> 
public override Size GetPreferredSize(Size proposedSize) 
{ 
    return GetAutoSize(); 
} 

/// <summary> 
/// Performs the work of setting the specified bounds of this control. 
/// </summary> 
protected override void SetBoundsCore(int x, int y, int width, int height, 
     BoundsSpecified specified) 
{ 
    // Only when the size is affected... 
    if(this.AutoSize && (specified & BoundsSpecified.Size) != 0) 
    { 
     Size size = GetAutoSize(); 

     width = size.Width; 
     height = size.Height; 
    } 

    base.SetBoundsCore(x, y, width, height, specified); 
} 
Verwandte Themen