C# 如果另一个toolstrip位于同一toolstrip面板上,将toolstrip向左移动一点将创建一个新行
当我用同一个toolstrip面板中的另一个toolstrip将一个toolstrip拖到左边(可能只是为了让它在角落里)时,我正在拖动的那个toolstrip会跳到一个“新”行,就像我已经将它向下移动一样。这很难解释,所以这里有几个图表 图A:我将toolstrip移到左边,“不小心”向左走得太远(只有几十个像素,用户很容易做到) 图B:发生这种情况时,拖动的toolstrip会下降一行 如何防止“创建”此新行?作为最后一种手段,我很乐意在任何情况下(例如:如果用户打算向下拖动以创建新行)都不创建新行C# 如果另一个toolstrip位于同一toolstrip面板上,将toolstrip向左移动一点将创建一个新行,c#,winforms,toolstrip,C#,Winforms,Toolstrip,当我用同一个toolstrip面板中的另一个toolstrip将一个toolstrip拖到左边(可能只是为了让它在角落里)时,我正在拖动的那个toolstrip会跳到一个“新”行,就像我已经将它向下移动一样。这很难解释,所以这里有几个图表 图A:我将toolstrip移到左边,“不小心”向左走得太远(只有几十个像素,用户很容易做到) 图B:发生这种情况时,拖动的toolstrip会下降一行 如何防止“创建”此新行?作为最后一种手段,我很乐意在任何情况下(例如:如果用户打算向下拖动以创建新行)都
我尝试过LayoutStyle,但没有任何效果。在OnMouseLeave上暂停布局,然后在MouseCenter/OnMouseUp/etc上重新启用它怎么样
public class ToolStripContainerFix : ToolStripContainer
{
public ToolStripContainerFix()
: base()
{
this.TopToolStripPanel.MouseLeave += TopToolStripPanel_MouseLeave;
this.TopToolStripPanel.MouseEnter += TopToolStripPanel_MouseEnter;
}
void TopToolStripPanel_MouseLeave(object sender, EventArgs e)
{
this.TopToolStripPanel.SuspendLayout();
}
void TopToolStripPanel_MouseEnter(object sender, EventArgs e)
{
this.TopToolStripPanel.ResumeLayout();
}
}
您需要修改它,以便它在窗体外部检查它,而不是控件本身。。。这样,您就可以在需要时创建新行 Winforms中的toolstrip类非常古怪。它们是在.NET2.0中发布的,Winforms团队很快就解散了。许多团队成员加入了WPF项目。因此,这些怪癖从未得到解决。您自己对此几乎无能为力,大多数toolstrip代码都被锁定,无法覆盖行为。还有很多,所以重写也不实用 可以防止行垂直增长。您可以通过在顶部toolstrip内容面板上设置MaximumSize属性来执行此操作:
public Form1() {
InitializeComponent();
toolStripContainer1.TopToolStripPanel.MaximumSize =
new Size(0, toolStrip1.Height);
}
但是当你玩这个游戏的时候,你会发现这会使toolstrip完全消失。这个问题没有明确的解决办法
请注意,这并非真正的问题,工具条的位置由用户选择,您不应以任何方式提供帮助。您可以指望用户以合乎逻辑的方式安排它们。可能有几种方法可以做到这一点。我尝试过一些,但没有一个是完美的。我想说,我发现的最简单的方法是像Hans提到的那样设置ToolStripPanel的最大大小,并且对ToolStrip进行子类化并覆盖
OnLocationChanged
(或者将事件处理程序分配给LocationChanged
,而不是子类化,但您必须为每个ToolStrip分配一个处理程序)。注意:这会导致鼠标在尝试向下拖动ToolStrip时来回跳跃,因为位置在更改后会重置,因此它基本上是向下移动,然后立即向上跳跃 还值得一提的是,这可能会让用户感到烦恼,特别是如果他们有意将ToolStrip放在新行中,因此我不建议这样做。但既然你问了,就在那里 更新完整的步骤和代码: 我创建了一个新的空白Windows窗体项目。我在解决方案中添加了一个新文件
ToolStripEx.cs
,其中包括:
为其他面板及其方向更新
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
s(带有您提到的cog图标)从工具箱拖到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);
}
}
}
注意:此代码阻止任何面板扩展其行(或列,如果它们的方向为方向.Vertical
),如果您希望侧面板能够扩展,请不要设置其最大尺寸,如果父方向==方向.Vertical
部分,请去掉
这应该是全部。我运行了这个,当移动它们时,ToolStripEx
s并没有消失
正如Hans所说,ToolStrip
类是非常古怪的,几乎所有问题的解决方案都不会是完美的,除非您从根本上开发自己的控件并考虑到自己的需要
如果出于某种原因需要扩展ToolStripContainer
类,请将其与新的ToolStripEx
类分开。我怀疑嵌套类导致您仍然使用常规的ToolStrip
而不是ToolStripEx
类
另一个更新-修复鼠标跳跃:
我在尝试摆脱鼠标光标问题时偶然发现了这一点。将其添加到ToolStripEx
类:
protected override void OnBeginDrag(EventArgs e)
{
//base.OnBeginDrag(e);
}
奇怪的是,这似乎大大降低了toolstrip被拖出面板的阻力。我没有“我没有深入了解这一点的原因,但ToolStrip似乎实现了自己的拖动行为,而没有使用基本的拖放功能,并且通过覆盖OnBeginDrag
ToolStrip然后专门使用其自定义行为,这使鼠标在拖动时表现得更好。Ha,刚刚尝试过。真奇怪。我已经看到了这一点,但我相信这是因为我垂直移动了一点鼠标。据我所知,如果鼠标完全水平移动,这对我来说并没有发生。谢谢,我也经历了其他一个工具栏在尝试这个过程中消失的经历。不幸的是,这个问题是一个问题,因为它让我的用户感到恼火,所以我将尝试其他两个答案。非常感谢。不幸的是,其他的错误会导致错误
protected override void OnBeginDrag(EventArgs e)
{
//base.OnBeginDrag(e);
}