Панель инструментов С# не стыкуется с полосой меню

У меня есть меню, которое я создаю с помощью конструктора форм. Затем я хочу программно добавить панель инструментов в полосе меню. Причина в том, что эта панель инструментов представляет собой набор инструментов, которые я добавляю в качестве плагина к основному приложению. Таким образом, когда плагин загружается, я создаю панель инструментов.

Когда я вручную добавляю панель инструментов в форму с помощью конструктора форм, панель инструментов правильно располагается под полосой меню. Однако, когда я добавляю его программно, он привязывается к самой верхней части формы над полосой меню. Вот код, который я использую для программного добавления панели инструментов:

stereoBar = new ToolStrip();
stereoBar.Anchor = (AnchorStyles)(AnchorStyles.Top | AnchorStyles.Left);
//y location is set to 22, the width of the menustrip
stereoBar.Location = new System.Drawing.Point(0, 22);
stereoBar.Dock = DockStyle.Top;
stereoBar.Name = "StereoToolbar";
stereoBar.Text = "Stereo Plugin Toolbar";
stereoBar.ShowItemToolTips = true;
stereoBar.GripMargin = new Padding(2);
Controls.Add(stereoBar);

Есть ли что-то простое, что мне здесь не хватает?

Заранее спасибо!


person Carlo M.    schedule 12.03.2014    source источник
comment
Может быть, вам нужно добавить их в свою полосу меню вместо элементов управления?   -  person Hamlet Hakobyan    schedule 12.03.2014
comment
Это действительно довольно странное поведение, и его также легко воспроизвести, одна вещь, которую я нашел действительно странной, заключается в том, что сгенерированный код дизайнера, похоже, вообще не включает никаких настроек DockStyle   -  person DrCopyPaste    schedule 12.03.2014
comment
Порядок элементов управления в коллекции Controls имеет значение. Вам нужно будет добавить stereoBar.BringToFront();, чтобы закрепить его под полосой меню.   -  person Hans Passant    schedule 12.03.2014
comment
@ HansPassant BringToFront() работает хорошо, спасибо, что указали на это! @DrCopyPaste Я согласен с вами, я просмотрел сгенерированный код дизайнера, чтобы попытаться выяснить, происходит ли что-то другое. Единственное, что я отметил (на что вы указали ниже), это то, что в коде дизайнера последнее, что нужно добавить, — это полоса меню относительно всех других элементов управления, создаваемых автоматически!   -  person Carlo M.    schedule 12.03.2014


Ответы (1)


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

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

Я думаю, что есть три выхода из дилеммы:

Первый подход

Как заметил Ганс Пассант, самый простой способ привести вещи в правильный порядок — это просто вызвать

stereoBar.BringToFront();

сразу после того, как вы добавили его в элементы управления форм.

Второй подход

Чтобы обойти это, вы также можете add the menu strip programmatically and do this after you added the tool strip.

Третий подход

Другим выходом может быть добавление в форму еще одного контейнера (например, панели или группового поля) с помощью конструктора, который также пристыковывается к верхней части и просто функционирует как заполнитель, куда вы добавляете свою полосу инструментов (чтобы вы не добавляли в форму прямо больше)

person DrCopyPaste    schedule 12.03.2014
comment
Спасибо за ваш ответ, вы предоставили хорошие альтернативные решения. Метод BringToFront() решает проблему! - person Carlo M.; 12.03.2014