Was ist diese Kontrolle?Gruppenbox oder nicht!
Frage
Ich bin nur neugierig auf das unten gezeigte Steuerelement, die gerade Linie mit der Beschriftung daneben.Ich habe versucht, ein ähnliches Steuerelement dafür zu finden, aber es gab weder eine Gruppenfeldeinstellung noch eine Gruppenfeldeinstellung. Stattdessen habe ich nur eine GroupBox mit einer Höhe von 2 erstellt, die es repliziert.
Aber gibt es eine tatsächliche Steuerung oder Einstellung, um dies zu tun?Und wie heißt die eigentliche Steuerung?
Lösung
Spy ++ sagt uns, dass es sich tatsächlich um zwei separate Steuerelemente für STATIC
(ähnlich einem Label
in WinForms).
-
Das erste ist einfach ein reguläres statisches Textsteuerelement mit der Aufschrift "Homepage".
-
Für den zweiten ist der
SS_ETCHEDHORZ
-Stil festgelegt lässt es als 3D-Linie zeichnen. Leider ist die Möglichkeit, diesen Stil festzulegen, in WinForms nicht verfügbar.Wie Sie in der Frage festgestellt haben, gibt es einige Hacks / Workarounds, mit denen wir ein ähnliches Erscheinungsbild erzielen können, z. B. das vertikale Komprimieren eines
GroupBox
-Steuerelements oder das Überschreiben derOnPaint
-Methode einesLabel
-Steuerelements und das Verwenden derControlPaint
-Klasse zum Zeichnen eines 3D Rand. Sie funktionieren, aber ich habe sie nie gemocht.Sie können den
SS_ETCHEDHORZ
-Stil jedoch selbst festlegen, sodass Sie die native Benutzeroberfläche genau replizieren können. Hier ist eine kleine Klasse, die genau das tut. Fügen Sie es Ihrem Projekt hinzu, kompilieren Sie es, und in Ihrer Toolbox sollte ein neues Steuerelement mit dem Namen "HorizontalRule" angezeigt werden. Verwenden Sie es wie jedes andere Steuerelement!public class HorizontalRule : Control { private const int FixedHeight = 2; private const int WS_CHILD = 0x40000000; private const int WS_VISIBLE = 0x10000000; private const int SS_ETCHEDHORZ = 0x00000010; private const int SS_ETCHEDVERT = 0x00000011; protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ClassName = "STATIC"; cp.Style = WS_CHILD | SS_ETCHEDHORZ; if (this.Visible) { cp.Style |= WS_VISIBLE; } return cp; } } protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) { height = FixedHeight; base.SetBoundsCore(x, y, width, height, specified); } }
Weitere Informationen und zusätzlichen Beispielcode finden Sie hier auf CodeProject .
Andere Tipps
Ich hatte vor ein paar Jahren das gleiche Problem und habe zu diesem Zweck nur eine Linie gezogen.
Tatsächlich habe ich sogar ein Festlinienbild mit einer ausreichend langen Breite verwendet, so dass es in allen Fällen verwendet werden kann, indem der erforderliche Teil (Breite) des Bildes angezeigt wird.
Diese Lösung hat seitdem für mich gut funktioniert.