加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如果另一个工具条位于同一个工具条面板上,那么移动工具条

发布时间:2020-12-15 05:38:11 所属栏目:百科 来源:网络整理
导读:当我在同一个工具条面板中使用另一个工具条向左拖动工具条(也许只是为了让它在角落里)时,我拖动的那个跳到一个“新”行,好像我把它向下移动了一样.解释起来相当棘手,所以这里有几个图表. 图A:我将工具条向左移动,并且“意外地”向左移动太远(只有几十个像素
当我在同一个工具条面板中使用另一个工具条向左拖动工具条(也许只是为了让它在角落里)时,我拖动的那个跳到一个“新”行,好像我把它向下移动了一样.解释起来相当棘手,所以这里有几个图表.

图A:我将工具条向左移动,并且“意外地”向左移动太远(只有几十个像素,用户可以轻松做到).

图B:发生这种情况,拖动的工具条会连续下降.

如何防止这个新行被“创建”?作为最后的手段,我很乐意防止在任何情况下创建新行(例如:如果用户打算将其向下拖动以创建新行).

我尝试过LayoutStyle无济于事.

解决方法

可能有几种方法可以做到这一点.我已经尝试了一些,但没有一个是完美的.我会说我找到的最简单的方法是设置像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);
        }           
    }
}

注意:这会导致鼠标在尝试向下拖动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,设置颜色等.

然后我将两个ToolStripExs(带有你提到的cog图标)从Toolbox拖到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 of Orientation.Vertical的列)如果您希望侧面板能够展开,请不要设置它们的最大尺寸并去掉它们否则如果parent.Orientation == Orientation.Vertical section.

应该就是它的全部内容.我跑了这个,当它们四处移动时,两个ToolStripEx都没有消失.

就像Hans说的那样,ToolStrip类非常古怪,除非你根据自己的需要从头开始开发自己的控件,否则几乎任何解决问题的方法都不会是完美的.

如果由于某种原因需要扩展ToolStripContainer类,请将其与新的ToolStripEx类分开.我怀疑嵌套类导致您仍然使用常规ToolStrip而不是ToolStripEx类.

另一个更新 – 修复鼠标跳转:
我在试验摆脱鼠标光标问题时偶然发现了这一点.将其添加到ToolStripEx类:

protected override void OnBeginDrag(EventArgs e)
{
    //base.OnBeginDrag(e);
}

奇怪的是,这似乎大大削减了工具条对被拖出面板之外的阻力.我没有理解为什么这样做,但似乎ToolStrip实现了自己的拖动行为而没有使用基本的拖放功能,并且通过重写OnBeginDragDrop,ToolStrip然后专门使用它的自定义行为,这使鼠标在拖动时表现得更好它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读