Как прокрутить инструмент ToolStripDropDown фиксированного размера - PullRequest
2 голосов
/ 29 октября 2010

Я использую ToolStripDropDown элемент управления для реализации выпадающей части пользовательского элемента управления, подобного ComboBox.Чтобы быть визуально привлекательным, я налагаю 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, чей размещенный элемент управления может по-прежнему отвлекать внимание от формы, котораяоткрыл его.)

Ответы [ 2 ]

2 голосов
/ 29 октября 2010

Наконец взломали этот.Мне пришло в голову, что 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

Это приводит к появлению всплывающего окна, которое может содержать любой тип элемента ToolStrip, принудительного применения MaximumSize, без полей и, что наиболее важно, делаетне красть фокус и не может получить фокус.

1 голос
/ 29 октября 2010

Это ваш заклятый враг:

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

Это внутреннее, вы не можете переопределить его. Вы можете восстановить свой подход к использованию формы, исправив поведение кражи фокуса. Вставьте это в класс формы:

protected override bool ShowWithoutActivation
{
    get { return true; }
}
...