Попытка добавить ToolStrip в ToolStripPanel параллельно с существующей ToolStrip - PullRequest
5 голосов
/ 31 декабря 2008

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 22 января 2009

Я создал пользовательскую панель инструментов 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 выкладывает ToolStrips;

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

2 голосов
/ 26 октября 2009

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

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

1 голос
/ 03 марта 2009

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

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

...