Come scorrere in una dimensione fissa ToolStripDropDown
-
27-09-2019 - |
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ì.)
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; }
}