動的に追加されたToolStripItemsのToolStripPanelオーバーフロー動作を変更します
-
03-07-2019 - |
質問
新しいToolStripを動的に追加するWindows Forms ToolStripPanelがあります。各ToolStripには、動的に追加するToolStripItems(主にToolStripButtons)があります。
各ToolStripのすべてのToolStripItemsを表示できる限り、すべてのToolStripsを1行に収めたいと思います。 ToolStripに新しいToolStripItemを追加するとオーバーフローが発生する場合、行の最後にあるToolStripを新しい行にジャンプダウンさせたいのですが。オーバーフローボタンを確認したいのは、ToolStripにフォームの幅に収まらないほど多くのアイテムがある場合だけです。
ユーザーがToolStripを手動で移動しない限り、これをデフォルトの動作にしたい。ユーザーがToolStripを移動した場合、既存のオーバーフロー(ドロップダウンの選択肢があるオーバーフローボタンなど)の動作が発生するようにします。ユーザーがツールバーを自分で配置すれば、このデフォルトのWinformsオーバーフロー動作でユーザーは問題ないと思います。
ユーザーが物事を再配置した後に新しい動的ツールバーが追加された場合、下の行の最後のToolStripの右側に新しいツールバーを追加したいと思います。このツールバーには、ユーザーが手動で位置を変更するまで、更新されたオーバーフロー動作が必要です(たとえば、収まらない場合は新しい行を使用します)。
私はいくつかの研究を行いましたが、大きな成功を収めていません:
- これは、 ToolStripLayoutStyle が、そうではないようです。 (せいぜい、特定の行のすべてのToolStripにオーバーフローボタンが表示されると、新しい行が作成されます。)
- MSDNの記事" 方法:ToolStripを管理するWindowsフォームのオーバーフロー"オーバーフローボタンが発生した場合/いつのみをカバーするようです。
- LayoutCompleted ToolStripのイベントで、物事を微調整するために使用できる可能性があります。もっと簡単な方法があるはずです。
- カスタムのLayoutEngineを作成するは、組み込みのものが私がやりたいことに非常に近いので、これではやり過ぎのようです。
簡単な解決策がありませんか?
更新:まだ良い解決策を探しています。 LayoutCompletedルートが可能であるようです。ただし、問題は、複数回呼び出されることです。一度、ToolStripItemがオーバーフロー領域にあり、その直後はメイン領域にあると言われるため、オーバーフローしている場合に一度だけチェックするのは安全ではないようです。
解決 2
最終的に、私は良い簡単な解決策があるとは思わない。 このスレッドは、ToolStripsが動的なシナリオ向けに優先度として実際に設計されていないことを明確にします。
1つのユニークなアプローチは、ToolStripの MinimumSize は、すべてのボタンのサイズになります。私が説明したように、これはオーバーフローで動作し始めますが、これでもエッジケースに問題があります。
私が見つけた最良のアプローチは、可能な限りすべてを実行して、ツールバーのサイズを事前に把握してから、参加メソッド。事前に合理的な推測を行った場合、オーバーフロー領域になってしまうため、後でボタンを追加しても大丈夫でしょう。
他のヒント
1)ツールストリップにアイテムを追加します
2)ツールストリップの幅と最後の行に残っているスペースの量を比較します。 ToolStripPanelには、最後の行が何であり、その行にあるツールストリップが何であるかを示すRows []プロパティがあります。それらの幅を合計し、パネルの幅から減算します。
3)Joinメソッドを使用してパネルに新しいツールストリップを追加し、最後の行(収まる場合)または1つ上の行(収まらない場合)を指定します。