可能有几种方法可以做到这一点。我尝试过一些,但没有一个是完美的。我想说的是,我发现的最简单的方法是像 Hans 提到的那样设置 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);
}
}
}
Note:由于位置被重置,这会导致鼠标在尝试向下拖动 ToolStrip 时来回跳跃after它已经改变了,所以它本质上是向下移动,然后立即跳回来。
还值得一提的是,这可能会给用户带来烦恼,特别是如果他们故意尝试将 ToolStrip 放在新行中,所以我真的不建议这样做。但既然你问了,那就是了。
更新完整的步骤和代码:
我创建了一个新的空白 Windows 窗体项目。我添加了一个新文件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
to Fill
,设置颜色等。
然后我拖了两个ToolStripEx
s(带有您提到的齿轮图标)从工具箱到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);
}
}
}
Note:此代码可防止任何面板扩展其行(或列,如果它们有Orientation
of Orientation.Vertical
)如果您希望侧面板能够扩展,请不要设置其最大尺寸并去掉else if parent.Orientation == Orientation.Vertical
部分。
这应该就是全部了。我运行了这个,并且两个ToolStripEx
移动它们时 s 并没有消失。
正如汉斯所说,ToolStrip
类非常古怪,除非您从头开始开发自己的控件并考虑到您的需求,否则几乎任何问题的解决方案都不会是完美的。
如果由于某种原因您需要延长期限ToolStripContainer
类,将其与新类分开ToolStripEx
班级。我怀疑嵌套类会导致您仍在使用常规的ToolStrip
而不是ToolStripEx
class.
另一个更新 - 修复鼠标跳跃:我在尝试解决鼠标光标问题时偶然发现了这一点。将其添加到ToolStripEx
class:
protected override void OnBeginDrag(EventArgs e)
{
//base.OnBeginDrag(e);
}
奇怪的是,这似乎大大降低了工具条对被拖到面板外的阻力。我还没有深入研究为什么会这样,但似乎 ToolStrip 实现了自己的拖动行为,而不使用基本的拖/放功能并通过覆盖OnBeginDragDrop
然后,ToolStrip 专门使用其自定义行为,这使得鼠标在拖动时表现得更好。