Как прокрутить на панели инструментов с фиксированным размером
-
27-09-2019 - |
Вопрос
Я использую ToolStripDropDown
Контроль для реализации раскрывающейся части пользовательского коммунального управления. Для того, чтобы быть визуально привлекательным, я налагаю MaximumSize
на раскрывающемся списке и вручную указываю ширину каждого ToolStripButton
Внутри этого - результат - это всплывающее окно, что та же ширина, что и элемент управления, который его активирует, с крышкой на высоте высоты раскрывающейся части.
Пример (упрощенный):
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));
Как видите, ограничения на размере всплывающего окна применяются, однако, кнопки прокрутки вверх / вниз не отображаются, и, похоже, нет способа сделать их. Там, кажется, нет никаких методов или свойств внутри ToolStripDropDown
относительно смещения прокрутки или механизма для прокрутки конкретного элемента в виду (например, EnsureVisible()
на ListViewItem
).
Как, тогда я могу выпадать, чтобы прокрутить? Любой способ будет достаточным, будь то полоса прокрутки, кнопки прокрутки или даже колесо мыши.
(Кстати, я перепробовал много раз, чтобы сделать аналогичные элементы управления, используя Form
Для раскрывающейся части - несмотря на то, что пытаясь десятки решений, чтобы предотвратить всплывающее окно воровать сосредоточиться или получить фокус, когда его элементы управления щелчнее, это кажется тупиком. Я также исключен, используя ToolStripControlHost
, чей принимаемый контроль все еще может сосредоточиться вдали от формы, которая его открыла.)
Решение
Наконец взломал этот. Мне пришло в голову, что ContextMenuStrip
и ToolStripDropDownMenu
способны на поведение автоматического прокрутки, которое их базовый класс, ToolStripDropDown
, не может предоставить. Первоначально я избегал этих альтернативных элементов управления, потому что они обычно добавляют широкую маржу. Это можно удалить через ShowImageMargin
и ShowCheckMargin
. Отказ Даже после этого остается небольшая (около 5px) маржи. Это может быть удалено путем переопределения 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
Это приводит к всплывающему окну, которое может содержать любой тип элемента панели инструментов, для обеспечения применения MaximumSize
, не имеет запасных и, самое главное, не ворует фокус и не может получить фокус.
Другие советы
Это ваш nemesis:
internal virtual bool RequiresScrollButtons
{
get
{
return false;
}
set
{
}
}
Это внутреннее, вы не можете переопределить его. Вы можете возродить ваш подход к использованию формы, исправляя поведение воровства фокусировки. Вставьте это в класс формы:
protected override bool ShowWithoutActivation
{
get { return true; }
}