Попытка добавить панель инструментов на панель инструментов параллельно с существующей панелью инструментов

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

Вопрос

Я использую .net 2.0 с Visual Studio 2005, и я пытаюсь добавить две разные панели инструментов в верхнюю часть формы таким образом, чтобы они отображались рядом.Я хочу, чтобы это было похоже на Word 2003, где вы можете добавить несколько панелей инструментов в одну строку и заставить их отображаться в соответствии друг с другом, а не выделять строку для каждой панели инструментов.

Итак, я добавил ToolStripPanel и прикрепил ее к верхней части формы (я не использовал ToolStripContainer, потому что мне не нужны все дополнительные панели;Мне просто нужен тот, что вверху).Я добавил обе полосы инструментов и установил для их свойств растягивания значение False.Я могу заставить их отображаться в окне конструктора бок о бок, но во время выполнения ToolStripPanel разделяет toolstripps и предоставляет каждой toolstrip отдельную строку.Как бы в довершение ко всему, когда я прекращаю отладку и возвращаюсь обратно к дизайнеру, я обнаруживаю, что дизайнер также перемещает панели инструментов в их собственную строку!Я делаю здесь что-то не так?

Я весь день гуглил и нашел некоторую информацию об объекте ToolStripPanelRow, но я не вижу простого способа добавить к нему toolstripps (т.е.в нем нет ToolStripPanelRow.Controls.Добавить метод или что-то в этом роде), все, что у него есть, - это свойство Controls(), которое возвращает массив объектов управления, и мне не очень повезло с попытками добавить элементы в этот массив.Я также нашел некоторую документацию по ToolStripPanel.Метод Join, который, похоже, должен выполнять свою работу, поэтому я перепробовал все 3 перегрузки, но они работают не так, как рекламируется.Независимо от того, что я делаю или какие опции я пробую, он всегда добавляет новую панель инструментов в верхнюю часть панели в своей собственной строке и опускает все остальное вниз.

В интересах полного раскрытия информации я должен предупредить вас, что у меня есть ToolStripPanel и одна из toolstripps, добавленных в форму базового класса, и я пытаюсь добавить другую toolstrip в форму подкласса, которая наследуется от формы базового класса.ToolStripPanel и ToolStrip в форме базового класса объявлены как "Защищенный друг", так что это должно работать.Как я уже упоминал, окно конструктора формы подкласса позволит мне сделать это (по крайней мере, на какое-то время).

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

Это было полезно?

Решение

Я создал пользовательскую ToolStripPanel, чтобы я мог перегрузить LayoutEngine;

using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Layout;

namespace CustomGUI
{
  class CustomToolStripPanel : ToolStripPanel
  {
    private LayoutEngine _layoutEngine;

    public override LayoutEngine LayoutEngine
    {
      get
      {
        if (_layoutEngine == null) _layoutEngine = new CustomLayoutEngine();
        return _layoutEngine;
      }
    }

    public override Size GetPreferredSize(Size proposedSize)
    {
      Size size = base.GetPreferredSize(proposedSize);

      foreach(Control control in Controls)
      {
        int newHeight = control.Height + control.Margin.Vertical + Padding.Vertical;
        if (newHeight > size.Height) size.Height = newHeight;
      }

      return size;
    }
  }
}

Затем пользовательская программа LayoutEngine раскладывает полосы инструментов;

using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Layout;

namespace CustomGUI
{
  class CustomLayoutEngine : LayoutEngine
  {
    public override bool Layout(object container, LayoutEventArgs layoutEventArgs)
    {
      Control parent = container as Control;

      Rectangle parentDisplayRectangle = parent.DisplayRectangle;

      Control [] source = new Control[parent.Controls.Count];
      parent.Controls.CopyTo(source, 0);

      Point nextControlLocation = parentDisplayRectangle.Location;

      foreach (Control c in source)
      {
        if (!c.Visible) continue;

        nextControlLocation.Offset(c.Margin.Left, c.Margin.Top);
        c.Location = nextControlLocation;

        if (c.AutoSize)
        {
          c.Size = c.GetPreferredSize(parentDisplayRectangle.Size);
        }

        nextControlLocation.Y = parentDisplayRectangle.Y;
        nextControlLocation.X += c.Width + c.Margin.Right + parent.Padding.Horizontal;
      }

      return false;
    }
  }
}

Одна вещь, которая заняла некоторое время, заключается в том, что изменение местоположения / размера одного элемента ToolStrip приведет к повторному запуску макета с переупорядочением элементов управления.Поэтому я беру копию элементов управления перед циклом компоновки.И вы по какой-то причине не можете использовать AddRange(...) для добавления элементов на пользовательскую панель - нужно добавлять (...) их по одному за раз.

надеюсь, это поможет (это основано на Пример MSDN LayoutEngine, исправлено для панелей ToolStripPanels)

Wyzfen

Другие советы

Система.Windows.Формы.FlowLayoutPanel может выполнить эту работу.

Просто поместите в него элементы управления ToolStrip в правильном порядке.

Я думаю, в вашем случае вам может сойти с рук простая установка LayoutStyle в вашей ToolStrip на toolstripplayoutstyle.HorizontalStackWithOverflow вместо того, чтобы использовать ваш собственный пользовательский LayoutEngine.

Я спросил у другой вопрос в аналогичной теме о том, как обрабатывать макет с динамическими элементами, чтобы лучше контролировать переполнение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top