Возможно, есть несколько способов сделать это. Я экспериментировал с несколькими, но ни один из них не идеален. Я бы сказал, что наименее сложный способ, который я нашел, - установить максимальный размер ToolStripPanel, как упомянутый Ганс, а также подклассифицировать ToolStrip и переопределить OnLocationChanged
(или назначить обработчик события LocationChanged
, а не подклассифицировать, но вам придется назначить обработчик для каждого ToolStrip).
public class ToolStripEx : ToolStrip
{
protected override void OnLocationChanged(EventArgs e)
{
if (this.Location.Y >= this.Parent.MaximumSize.Height)
{
this.Location = new Point(this.Location.X, 0);
}
else
{
base.OnLocationChanged(e);
}
}
}
Примечание: Это заставляет мышь прыгать вперед и назад при попытке перетащить ToolStrip вниз, из-за того, что Место сброса после она уже изменилась, поэтому он по существу движется вниз, а затем сразу же прыгает обратно.
Также стоит упомянуть, что это может раздражать пользователя, особенно если они намеренно пытаются поместить ToolStrip в новую строку, поэтому я бы не рекомендовал это делать. Но так как вы спросили, вот оно.
Обновление с полным шагом и кодом:
Я создал проект новой пустой Windows Forms. Я добавил новый файл ToolStripEx.cs
к решению, и это то, что находится внутри:
Обновлен для других панелей и их Orientation
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public class ToolStripEx : ToolStrip
{
protected override void OnLocationChanged(EventArgs e)
{
if (this.Parent is ToolStripPanel)
{
ToolStripPanel parent = this.Parent as ToolStripPanel;
if (parent.Orientation == Orientation.Horizontal)
{
if (this.Location.Y != 0)
{
this.Location = new Point(this.Location.X, 0);
return;
}
}
else if (parent.Orientation == Orientation.Vertical)
{
if (this.Location.X != 0)
{
this.Location = new Point(0, this.Location.Y);
return;
}
}
}
base.OnLocationChanged(e);
}
}
}
Тогда я построил решение так ToolStripEx
класса отображаются в панели инструментов.
Тогда я положил очередную ToolStripContainer
на форму из панели инструментов, установите Dock
в Fill
, установить цвета и т.д.
Затем я перетащил два ToolStripEx
с (с значок шестеренки вы упомянули) из панели элементов TopToolStripPanel
. Я устанавливал их цвета и визуализаторы и еще много чего.
Это то, что Form1.cs
выглядит следующим образом:
Обновлено установить другие максимальные размеры
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.toolStripContainer1.TopToolStripPanel.MaximumSize = new Size(0, toolStripEx1.Height);
this.toolStripContainer1.LeftToolStripPanel.MaximumSize = new Size(toolStripEx1.Height, 0);
this.toolStripContainer1.BottomToolStripPanel.MaximumSize = new Size(0, toolStripEx1.Height);
this.toolStripContainer1.RightToolStripPanel.MaximumSize = new Size(toolStripEx1.Height, 0);
}
}
}
Примечание Этот код предотвращает любой из панелей от расширения их строки (или столбцы, если они имеют Orientation
из Orientation.Vertical
) Если вы хотите боковую панель els, чтобы иметь возможность расширения, не устанавливать максимальный размер и избавиться от раздела else if parent.Orientation == Orientation.Vertical
.
Это должно быть все, что нужно. Я побежал, и оба из ToolStripEx
s не исчезли, перемещая их.
Как и Ганс, класс ToolStrip
довольно изворотливый, и практически любое решение вашей проблемы не будет идеальным, если вы не разработаете собственные средства управления с нуля с учетом ваших потребностей.
Если по какой-либо причине вам необходимо расширить класс ToolStripContainer
, сохраните его отдельно от нового класса ToolStripEx
. Я подозреваю, что наличие вложенных классов заставляло вас по-прежнему использовать обычный ToolStrip
, а не класс ToolStripEx
.
Другое обновление - исправление мыши прыгает: Обнаружено это случайно при экспериментировании, чтобы избавиться от проблемы с курсором мыши. Добавьте к этому ToolStripEx
класс:
protected override void OnBeginDrag(EventArgs e)
{
//base.OnBeginDrag(e);
}
Как ни странно, что, кажется, сократить значительно на сопротивления ToolStrip к тащат за пределы панели.Я не вникаю в то, почему это работает, но похоже, что ToolStrip реализует свое собственное поведение перетаскивания без использования основных функций перетаскивания и переопределения OnBeginDragDrop
. ToolStrip затем использует свое настраиваемое поведение исключительно, что делает мышью намного приятнее при перетаскивании это
Ха, просто попробовал. Как очень странно. –
Я видел это, но считаю, что это связано с тем, что я передвинул мышь вертикально. Насколько я могу судить, если мышь перемещается мертвой горизонталью, это не произошло для меня. –