これを行うには、おそらくいくつかの方法があります。いくつか試してみましたが、どれも完璧ではありません。私が見つけた最も簡単な方法は、ハンスが言及したように 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);
}
}
}
注:これにより、ToolStrip を下にドラッグしようとすると、場所が既に変更された後にリセットされるため、マウスが前後にジャンプするため、基本的に下に移動し、すぐに元に戻ります。
また、特に 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
しFill
、色などを設定します。
次にToolStripEx
、ツールボックスから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);
}
}
}
注Orientation
: このコードは、どのパネルも行 (またはofがある場合は列Orientation.Vertical
) を拡張できないようにします。サイド パネルを拡張できるようにする場合は、最大サイズを設定せず、else if parent.Orientation == Orientation.Vertical
セクションを削除してください。
それだけのはずです。これを実行したところ、移動しても両方のToolStripEx
s が消えませんでした。
Hans が言ったように、このToolStrip
クラスはかなり風変わりであり、ニーズを念頭に置いてゼロから独自のコントロールを開発しない限り、問題に対するほとんどの解決策は完璧ではありません。
何らかの理由でToolStripContainer
クラスを拡張する必要がある場合は、新しいクラスとは別にしてToolStripEx
ください。ToolStrip
ネストされたクラスが原因で、クラスではなく通常のクラスを引き続き使用していると思われますToolStripEx
。
もう 1 つの更新 - マウスのジャンプの修正:
マウス カーソルの問題を解決しようと実験していたときに、偶然これを見つけました。ToolStripEx
これをクラスに追加します。
protected override void OnBeginDrag(EventArgs e)
{
//base.OnBeginDrag(e);
}
奇妙なことに、パネルの外にドラッグされることに対するツールストリップの抵抗が大幅に減少するようです。これが機能する理由については詳しく調べていませんが、ToolStrip は基本的なドラッグ/ドロップ機能を使用せずに独自のドラッグ動作を実装しているようでOnBeginDragDrop
、ToolStrip をオーバーライドすることでカスタム動作を排他的に使用しているため、マウスをドラッグするときにマウスの動作がより適切になります。 .