Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果另一个toolstrip位于同一toolstrip面板上,将toolstrip向左移动一点将创建一个新行_C#_Winforms_Toolstrip - Fatal编程技术网

C# 如果另一个toolstrip位于同一toolstrip面板上,将toolstrip向左移动一点将创建一个新行

C# 如果另一个toolstrip位于同一toolstrip面板上,将toolstrip向左移动一点将创建一个新行,c#,winforms,toolstrip,C#,Winforms,Toolstrip,当我用同一个toolstrip面板中的另一个toolstrip将一个toolstrip拖到左边(可能只是为了让它在角落里)时,我正在拖动的那个toolstrip会跳到一个“新”行,就像我已经将它向下移动一样。这很难解释,所以这里有几个图表 图A:我将toolstrip移到左边,“不小心”向左走得太远(只有几十个像素,用户很容易做到) 图B:发生这种情况时,拖动的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);
}