C# 中的 Flyout 工具栏
C# 版本,实现了 CAD 应用程序中常见的 flyout 工具栏。
介绍
我之前在 C# 中寻找一种悬浮工具栏。我发现的唯一一篇文章是:“创建悬浮工具栏”。您可以在 这里 找到这篇文章。但是代码是用 C++ 编写的。所以我决定用 C# 编写我自己的版本。
原理
目标是在工具栏上不要有太多的按钮。如果您长时间点击一个按钮,就会出现一个工具栏。只需在工具栏上拖动光标,然后通过释放鼠标按钮来选择您选择的按钮。之后,如果您快速点击此按钮,就会执行相应的功能。
如何创建 CSFOToolbar
- 将文件 'CSFOToolbar.cs' 复制到您项目的目录中,并在解决方案中,使用“添加现有项目...”添加该文件。
- 首先构建解决方案。您将在 Visual Studio 的工具栏中看到一个新组件。
- 将一个
CSFOToolbar
组件拖到窗体或工具条容器中。 注意:CSFOToolbar
组件的行为类似于经典的 ToolStrip。 - 在
CSFOToolbar
组件中添加一些工具条按钮。 - 在主窗体上添加一个或多个经典的工具条。
- 将工具条按钮添加到那些工具条中。
- 为这些工具条按钮添加点击事件。 注意:每个按钮都必须预先定义一个点击事件,否则它将无法工作(该按钮无法被选中)。
- 在项目中添加
form_load
方法,并为要附加悬浮工具栏的每个按钮调用CSFOToolbar
的 'AddFlyout()
' 方法。通过这样做,经典的工具条将成为悬浮工具栏。
示例
private void Form1_Load(object sender, EventArgs e)
{
csfoToolBar1.AddFylout(newToolStripButton, toolStrip1, 0);
csfoToolBar1.AddFylout(helpToolStripButton, toolStrip2, 0);
}
'AddFlyout()
' 方法的参数是
- 第一个参数是
CSFOToolbar
中附加到工具条的按钮, - 第二个参数是要附加的工具条(它成为悬浮工具栏),
- 第三个参数指示悬浮工具栏中默认选中的按钮的索引(从 0 开始)。
注意:不要在 CSFOToolbar
中为附加了悬浮工具栏的按钮创建点击事件。
CSFOToolbar 的属性
每个带有悬浮工具栏的按钮都在右下角用一个红色三角形标记。
- 角颜色:三角形的颜色(默认:红色),
- 角大小:三角形的大小(以像素为单位)(默认:6),
- 延迟:悬浮工具栏出现之前的时间(以毫秒为单位)(默认:300 毫秒)。
- 方向:定义悬浮工具栏的方向。可能的值有
- 水平:悬浮工具栏始终水平显示(默认),
- 垂直:悬浮工具栏始终垂直显示,
- 相同:悬浮工具栏始终以其“主”工具栏相同的方向显示,
- 相反:悬浮工具栏始终以其“主”工具栏相反的方向显示。
- 限制:将悬浮工具栏的显示限制在窗体的区域(默认:false)。
兴趣点
- 如何使用反射将事件点击处理程序从一个工具条按钮转移到另一个工具条中的另一个按钮(方法:
ModifyComponentEventHandler(…)
和GetDelegate(…)
), - 如何使用窗体显示悬浮(或浮动)工具条(类
CSFOform
), - 如何管理来自一个控件(一个工具条按钮)的事件到另一个控件(悬浮工具条的窗体)中,
- 如何找到鼠标位置处的工具条按钮(方法:
FindButton(…)
), - 如何通过修改布局样式来修改工具条的方向(方法:
ReturnLayoutStyle(…)
), - 使用工具条渲染器的一个例子(类:
CSFOToolbarRenderer
), - 使用定时器的一个例子,
- 强制在工具条上显示工具提示的一个例子(在
CSFOForm
的c_MouseMove(…)
方法中),
环境
此类是在 Visual Studio 2005 下使用框架 2.0 开发的。
参考文献
- 创建悬浮工具栏:https://codeproject.org.cn/Articles/1517/Creating-Flyout-Toolbars
- 从事件订阅中获取委托:https://codeproject.org.cn/Articles/34990/Get-Delegate-from-Event-s-Subscription
历史
- 2013 年 5 月:第一个可用版本。