Question

J'utilise un contrôle ToolStripDropDown pour mettre en œuvre la partie déroulante d'une coutume ComboBox comme le contrôle. Pour être visuellement attrayant, je suis imposant une MaximumSize sur le menu déroulant et en spécifiant manuellement la largeur de chaque ToolStripButton en son sein - le résultat est une fenêtre qui est la même largeur que le contrôle qui l'active, avec un plafond à la hauteur de la hauteur de la partie déroulante.

Exemple (simplifié):

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));

Comme vous pouvez le voir, les contraintes sur la taille de la fenêtre sont appliquées, mais le haut / bas boutons de défilement ne sont pas affichés et il semble y avoir aucun moyen de les faire apparaître. Il ne semble pas y avoir de méthodes ou propriétés dans ToolStripDropDown en ce qui concerne le défilement offset ou un mécanisme pour faire défiler un élément particulier dans la vue (comme EnsureVisible() sur ListViewItem).

Comment, alors, puis-je obtenir le menu déroulant pour défiler? Toute méthode serait suffisante, que ce soit une barre de défilement, boutons de défilement ou même la molette de la souris.

(Soit dit en passant, j'ai essayé plusieurs fois d'effectuer des contrôles similaires à l'aide d'un Form pour la partie déroulant - en dépit d'essayer des dizaines de solutions pour empêcher la fenêtre contextuelle de voler mise au point ou obtenir mise au point lorsque ses contrôles sont cliqués, cela semble être un mort fin. J'ai également exclu à l'aide ToolStripControlHost, dont le contrôle hébergé peut encore se concentrer loin de la forme qui l'a ouverte.)

Était-ce utile?

La solution

Enfin craqué celui-ci. Il me vint que ContextMenuStrip et ToolStripDropDownMenu sont capables du comportement de défilement automatique qui leur classe de base, ToolStripDropDown, ne peut pas fournir. Dans un premier temps, j'évité ces contrôles alternatifs car ils ajoutent généralement une large marge. Cela peut être éliminé par ShowImageMargin et ShowCheckMargin. Même après avoir fait cela, un petit (environ 5px) reste de marge. Cela peut être supprimé en remplaçant la propriété DefaultPadding:

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

Il en résulte une fenêtre pop-up qui peut contenir tout type d'élément ToolStrip, applique MaximumSize, n'a pas de marge et, surtout, ne vole pas attention et ne peut pas recevoir le focus.

Autres conseils

Ceci est votre ennemi juré:

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

Il est interne, vous ne pouvez pas l'ignorer. Vous pouvez relancer votre approche de l'aide d'un formulaire en fixant le comportement de vol de mise au point. Coller dans la classe de formulaire:

protected override bool ShowWithoutActivation
{
    get { return true; }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top