Изменить поведение переполнения ToolStripPanel для динамически добавляемых ToolStripItems - PullRequest
2 голосов
/ 03 марта 2009

У меня есть панель инструментов Windows Forms ToolStripPanel, в которую я динамически добавляю новые ToolStrips. Каждый ToolStrip имеет ToolStripItems, которые я динамически добавляю к нему (в основном ToolStripButtons).

Я бы хотел, чтобы все ToolStrips помещались в одну строку, если вы можете видеть все ToolStripItems в каждой ToolStrip. Если добавление нового ToolStripItem в ToolStrip вызывает переполнение, я бы хотел, чтобы ToolStrip в конце строки перепрыгивал на новую строку. Единственный раз, когда я хотел бы видеть кнопку переполнения, это если ToolStrip имеет так много элементов, что они не помещаются по ширине формы.

Я хочу, чтобы это было поведение по умолчанию, если пользователь не перемещает ToolStrip вручную. Если пользователь перемещает ToolStrip, то я хочу, чтобы существующее поведение переполнения (например, кнопка переполнения с выпадающим выбором) происходило. Я предполагаю, что пользователь будет в порядке с этим поведением переполнения Winforms по умолчанию, если они сами размещают панель инструментов.

Если новая динамическая панель инструментов добавляется после того, как пользователь перемещает объекты, я бы хотел, чтобы новая панель инструментов была добавлена ​​справа от последней ToolStrip в нижнем ряду. Эта панель инструментов должна иметь обновленное поведение при переполнении (например, использовать новую строку, если вы не можете уместить), пока пользователь не переместит ее вручную.

Я провел некоторые исследования без большого успеха:

  • Похоже, что изменение простого ToolStripLayoutStyle должно быть простым делом, но, похоже, это не так. (В лучшем случае новые строки создаются, когда кнопка переполнения отображается на всех всплывающих подсказках в данной строке).
  • Статья MSDN " Как: управлять переполнением ToolStrip в Windows Forms ", по-видимому, охватывает только если / когда появляется кнопка переполнения.
  • В ToolStrip есть событие LayoutCompleted , которое, по-видимому, можно использовать для настройки, кажется, что должен быть более простой способ.
  • Создание собственного LayoutEngine кажется излишним, поскольку встроенный очень близок к тому, что я хочу сделать.

Мне не хватает простого решения?

ОБНОВЛЕНИЕ: Все еще ищите хорошее решение. Похоже, маршрут LayoutCompleted возможен. Однако проблема в том, что он вызывается несколько раз. Однажды он говорит, что ToolStripItem находится в области переполнения, а сразу после этого - в области Main, так что не кажется безопасным просто один раз проверить, находится ли он в переполнении.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2009

1) Добавьте элементы в набор инструментов

2) Сравните ширину полосы инструментов с количеством свободного места в последнем ряду. ToolStripPanel имеет свойство Rows [], которое сообщит вам, что является последней строкой и какие полоски инструментов находятся в этой строке. Сложите их ширину и вычтите их из ширины панели.

3) Добавьте новую панель инструментов на панель с помощью метода Join, указав либо последнюю строку (если она подходит), либо на одну строку выше (если она не подходит).

0 голосов
/ 04 марта 2009

В конце концов, я не думаю, что есть хорошее простое решение. Этот поток дает понять, что ToolStrips на самом деле не были предназначены для динамических сценариев в качестве приоритета.

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

Лучший подход, который я нашел, состоит в том, чтобы сделать все возможное, чтобы заранее понять, какой должен быть размер панели инструментов, а затем расположить его на ToolStripPanel, используя метод Join . Если вы заранее сделаете разумное предположение, тогда, вероятно, будет хорошо, если вы добавите больше кнопок позже, поскольку они окажутся в области переполнения.

...