为动态添加的ToolStripItem更改ToolStripPanel溢出行为

时间:2009-03-03 00:56:58

标签: .net winforms toolstrip toolstrippanel

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

我希望所有ToolStrips都适合一行,只要您可以在每个ToolStrip中看到所有ToolStripItem。如果向ToolStrip添加新的ToolStripItem会导致溢出,我希望行末的ToolStrip跳转到新行。我唯一希望看到溢出按钮的情况是,如果ToolStrip有很多项目,它们无法适应表单的宽度。

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

如果在用户重新定位之后添加了新的动态工具栏,我希望将新工具栏添加到底行的最后一个ToolStrip的右侧。此工具栏应具有更新的溢出行为(例如,如果您不适合,请使用新行),直到用户手动重新定位它。

我做了一些没有太大成功的研究:

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

更新:仍在寻找一个好的解决方案。似乎LayoutCompleted路线是可能的。它的问题是它被多次调用。有一次它说ToolStripItem位于溢出区域,并且紧接着在Main区域之后,所以如果它在溢出时只检查一次是不安全的。

2 个答案:

答案 0 :(得分:2)

1)将项目添加到工具栏

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

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

答案 1 :(得分:0)

最后,我认为没有一个好的简单解决方案。 This thread清楚地表明ToolStrips并非真正为动态场景设计优先级。

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

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