2

我有一个 Windows 窗体 ToolStripPanel,我会动态地向它添加新的 ToolStrips。每个 ToolStrip 都有我动态添加到其中的 ToolStripItems(主要是 ToolStripButtons)。

只要您可以看到每个 ToolStrip 中的所有 ToolStripItem,我希望所有 ToolStrip 都放在一行上。如果将新 ToolStripItem 添加到 ToolStrip 导致发生溢出,我希望行尾的 ToolStrip 跳到新行。我唯一希望看到溢出按钮的情况是 ToolStrip 有太多项目以致无法适应表单的宽度。

我希望这是默认行为,除非用户手动移动 ToolStrip。如果用户移动 ToolStrip,那么我希望发生现有的溢出(例如,带有下拉选项的溢出按钮)行为。如果用户自己定位工具栏,我假设用户会接受这种默认的 Winforms 溢出行为。

如果在用户重新定位事物后添加了新的动态工具栏,我希望将新工具栏添加到底行最后一个 ToolStrip 的右侧。在用户手动重新定位它之前,该工具栏应该具有更新的溢出行为(例如,如果无法容纳,则使用新行)。

我做了一些研究但没有取得很大成功:

我错过了一个简单的解决方案吗?

更新:仍在寻找一个好的解决方案。似乎 LayoutCompleted 路线是可能的。但它的问题是它被多次调用。有一次它说 ToolStripItem 位于溢出区域,然后立即位于 Main 区域,因此仅检查一次是否溢出似乎并不安全。

4

2 回答 2

2

1)将项目添加到工具条

2) 将工具条的宽度与最后一行剩余的空间量进行比较。ToolStripPanel 有一个 Rows[] 属性,它将告诉您最后一行是什么以及该行上有哪些工具条。将它们的宽度相加,然后从面板的宽度中减去它们。

3) 使用 Join 方法将新工具条添加到面板,指定最后一行(如果合适)或高一行(如果不合适)。

于 2009-04-12T02:59:03.930 回答
0

最后,我认为没有一个很好的简单解决方案。该线程清楚地表明,ToolStrips 并不是真正为动态场景而设计的。

一种独特的方法是将 ToolStrip 的MinimumSize设置为所有按钮的大小。就像我描述的那样,这将开始与溢出一起工作,但即使这样也有边缘情况的问题。

我发现的最佳方法是尽一切可能提前了解工具栏的大小,然后使用Join方法将其放置在 ToolStripPanel 上。如果您提前做出合理的猜测,那么稍后添加更多按钮可能没问题,因为它们最终会出现在溢出区域中。

于 2009-03-04T15:30:35.117 回答