Как прокрутить на панели инструментов с фиксированным размером

StackOverflow https://stackoverflow.com/questions/4051217

  •  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; }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top