Frage

Ich bin mit einer ToolStripDropDown Kontrolle des Drop-Down-Abschnitt eines benutzerdefinierten ComboBox artigen Steuerung zu implementieren. Um visuell ansprechend zu sein, ist ich zur Einführung eines MaximumSize auf der Dropdown und manuell die Breite der einzelnen ToolStripButton darin spezifiziert - das Ergebnis ist ein Pop-up, die die gleiche Breite wie die Steuerung ist, dass es mit einer Kappe auf der Höhe aktiviert von die Höhe des Drop-Down-Abschnitts.

Beispiel (vereinfacht):

ToolStripDropDown dropDown = new ToolStripDropDown();
dropDown.MaximumSize = new Size(200, 100);
dropDown.RenderMode = ToolStripRenderMode.System;
dropDown.AutoSize = true;

for (int i = 0; i < 50; i++) {
    ToolStripButton dropDownItem = (ToolStripButton)dropDown.Items.Add("Item " + i);
    dropDownItem.AutoSize = false;
    dropDownItem.Size = new Size(200, 20);
}

dropDown.Show(owningControl, new Point(0, owningControl.Height - 1));

Wie Sie sehen können, werden die Beschränkungen für die Größe des Pop-up aufgetragen werden, aber die Auf- / Ab-Scroll-Tasten nicht angezeigt werden und es scheint keine Möglichkeit zu geben, um sie erscheinen zu lassen. Es erscheint keine Methoden oder Eigenschaften innerhalb ToolStripDropDown zu sein in Bezug auf die Offset-Scrollen oder ein Mechanismus ein bestimmtes Element in Sicht (wie EnsureVisible() auf ListViewItem) blättern.

Wie also kann ich die Dropdown-Liste blättern bekommen? Jede Methode würde ausreichen, sei es eine Bildlaufleiste, Scroll-Tasten oder auch die Maus-Rad.

(übrigens habe ich viele Male versucht, ähnliche Kontrollen zu machen, mit einem Form für den Drop-Down-Teil - trotz Dutzende von Lösungen versuchen, das Pop-up, um zu verhindern Fokus zu stehlen oder Fokus zu gewinnen, wenn seine Kontrollen angeklickt werden, scheint dies eine tot zu sein Ende. ich habe auch mit ToolStripControlHost ausgeschlossen, deren gehostete Steuerelement aus der Form nach wie vor nimmt Fokus weg, dass es geöffnet wird.)

War es hilfreich?

Lösung

geknackt Schließlich diesen. Es fiel mir ein, dass ContextMenuStrip und ToolStripDropDownMenu der Lage sind, das Auto-Scrolling-Verhalten, die ihre Basisklasse, ToolStripDropDown, nicht bieten kann. Zunächst vermied ich diese alternativen Kontrollen, weil sie in der Regel einen großen Spielraum hinzuzufügen. Dies kann über ShowImageMargin und ShowCheckMargin entfernt werden. Auch nach bleibt dies eine kleine (ca. 5px) Marge zu tun. Dies kann durch Überschreiben der DefaultPadding Eigenschaft entfernt werden:

public class MyDropDown : ToolStripDropDownMenu {

    protected override Padding DefaultPadding {
        get { return Padding.Empty; }
    }

    public MyDropDown() {
        ShowImageMargin = ShowCheckMargin = false;
        RenderMode = ToolStripRenderMode.System;
        MaximumSize = new Size(200, 150);
    }
}

// adding items and calling Show() remains the same as in the question

Diese Ergebnisse in einem Popup-Fenster, die jede Art von Toolstrip Artikel enthalten kann, erzwingt MaximumSize, hat keinen Spielraum und, was am wichtigsten ist, nicht im Fokus stehlen und kann nicht den Fokus erhalten.

Andere Tipps

Das ist Ihr Erzfeind:

internal virtual bool RequiresScrollButtons
{
    get
    {
        return false;
    }
    set
    {
    }
}

Es ist intern, man kann es nicht außer Kraft setzen. Sie können Ihren Ansatz der Verwendung eines Formulars durch Fixieren des Fokus Stehlen Verhalten wiederbeleben. Fügen Sie diese in die Form-Klasse:

protected override bool ShowWithoutActivation
{
    get { return true; }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top