如果另一个工具条位于同一个工具条面板上,则将工具条向左移动一点会创建一个新行

2024-04-30

当我将一个工具条与同一个工具条面板中的另一个工具条拖动到左侧(可能只是为了将其放在角落)时,我正在拖动的工具条会跳到“新”行,就好像我已将其向下移动一样。解释起来相当棘手,所以这里有几个图表。

图 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);
        }           
    }
}

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,设置颜色等。

然后我拖了两个ToolStripExs(带有您提到的齿轮图标)从工具箱到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 专门使用其自定义行为,这使得鼠标在拖动时表现得更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果另一个工具条位于同一个工具条面板上,则将工具条向左移动一点会创建一个新行 的相关文章

  • C# 中直接从 URL 获取图像尺寸

    我正在尝试使用以下代码直接从网络上获取图片的尺寸 string image http www hephaestusproject com csharp3 png byte imageData new WebClient DownloadDa
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 使用 GCHandle 将大型结构数组从 C# unity 脚本传递到 C++ dll 在 C++ 函数执行后崩溃

    我想从 C unity 脚本将结构数组传递给 c 本机插件 我做了如下操作 我可以访问数据 但我的应用程序在执行 c 函数后崩溃 我不知道为什么 C side StructLayout LayoutKind Sequential publi
  • ASMX Web 服务,测试表单仅在本地计算机上适用于一种 WebMethod

    我有一个正在测试的 ASMX WebService 并且在大多数方法上我都可以使用测试表单进行测试 然而 我确实有一种方法 测试表上写着 The test form is only available for requests from t
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • 使用 catch all 字典属性将 json 序列化为对象

    我想使用 JSON net 反序列化为对象 但将未映射的属性放入字典属性中 是否可以 例如给定 json one 1 two 2 three 3 和 C 类 public class Mapped public int One get se
  • 重定向 std::cout

    我需要一个类 在其对象的生命周期内将一个 ostream 重定向到另一个 ostream 经过一番修补后 我想出了这个 include
  • 确定相关词的编程方式?

    使用网络服务或软件库 我希望能够识别与词根相关的单词 例如 座位 和 安全带 共享词根 座位 但 西雅图 不会被视为匹配 简单的字符串比较对于这类事情似乎是不可行的 除了定义我自己的字典之外 是否有任何库或 Web 服务不仅可以返回单词定义
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 如何在 SQLite 中检查数据库是否存在 C#

    我目前正在用 C 编写一个应用程序 并使用 sqlite 作为嵌入式数据库 我的应用程序在启动时创建一个新数据库 但如何让它检查数据库是否存在 如果它确实存在 我如何让它使用它 如果不存在如何创建一个新数据库 这是我到目前为止所拥有的 pr
  • 如何使用“路径”查询 XDocument?

    我想查询一个XDocument给定路径的对象 例如 path to element I want 但我不知道如何继续 您可以使用以下方法System Xml XPath Extensions http msdn microsoft com
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • 如何获取运行或段落的高度

    我找到了Run or Paragraph in FlowDocument现在我需要知道HEIGHT of it i e while navigator CompareTo flowDocViewer Document ContentEnd
  • 是否可以检测流是否已被客户端关闭?

    简要介绍一下情况 我有一项服务可以通过套接字接收信息并发送回复 连接不安全 我想设置另一个可以为这些连接提供 TLS 的服务 这个新服务将提供单个端口并根据提供的客户端证书分发连接 我不想使用 stunnel 有几个原因 其中之一是每个接收
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐