Domanda

Sto usando un controllo ToolStripDropDown per implementare la parte a discesa di un costume ComboBox-come il controllo. Per essere attraente visivamente, sto imponendo una MaximumSize sulla discesa e specificando manualmente la larghezza di ogni ToolStripButton al suo interno - il risultato è un popup che è la stessa larghezza del controllo che lo attiva, con un tappo sull'altezza di l'altezza della porzione discesa.

Esempio (semplificato):

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

Come si può vedere, si applicano le limitazioni sulle dimensioni del popup, tuttavia la up / down pulsanti di scorrimento non vengono visualizzati e sembra che ci sia alcun modo per farli apparire. Non sembrano esserci metodi o proprietà all'interno ToolStripDropDown per quanto riguarda lo scorrimento offset o un meccanismo per far scorrere un particolare elemento in vista (come EnsureVisible() su ListViewItem).

Come, allora, posso ottenere la discesa a scorrimento? Qualsiasi metodo sarebbe sufficiente, sia esso una barra di scorrimento, pulsanti di scorrimento o il mouse ruota.

(Per inciso, ho provato molte volte a fare controlli simili utilizzando un Form per la parte a discesa - nonostante cercando decine di soluzioni per evitare che la comparsa di rubare messa a fuoco o guadagnando messa a fuoco quando i suoi controlli sono cliccato, questo sembra essere un morto fine. ho anche escluso utilizzando ToolStripControlHost, il cui controllo ospitato può ancora prendere attenzione lontano dalla forma che l'aprì.)

È stato utile?

Soluzione

Infine incrinato questo. Mi venne in mente che ContextMenuStrip e ToolStripDropDownMenu sono in grado di comportamento auto-scrolling che la loro classe di base, ToolStripDropDown, non può fornire. Inizialmente, ho evitato questi controlli alternativi, perché di solito aggiungono un ampio margine. Questo può essere rimosso tramite ShowImageMargin e ShowCheckMargin. Anche dopo aver fatto questo, un piccolo (circa 5px) resti di margine. Questo può essere rimosso sovrascrivendo la proprietà 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 risultato è una finestra pop-up che possono contenere qualsiasi tipo di oggetto ToolStrip, fa rispettare MaximumSize, non ha margini e, soprattutto, non rubare la messa a fuoco e non può ricevere l'attivazione.

Altri suggerimenti

Questa è la vostra nemesi:

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

Si è interno, non si può ignorare che. È possibile ravvivare il vostro approccio di utilizzare un modulo fissando il comportamento della sottrazione del fuoco. Incolla questo nella classe form:

protected override bool ShowWithoutActivation
{
    get { return true; }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top