ToolStripPanel.Join で非常に奇妙な問題が発生しました。Google と SO で検索して、何が間違っているのかについての手がかりを探していますが、わかりません。基本的に、ToolStripPanel.Join を使用すると、追加した最初の ToolStrip は ToolStripPanel にまったく表示されませんが、結合する他のすべての ToolStrip は表示されます。詳細に入る前に、私は C# と VS 2010 と .NET 4 を使用していて、いくつかのコンテキストのために、ToolStripPanel の内部にあるユーザー コントロールで ToolStripPanel を使用しようとしていると最初に言わせてください。これらのユーザー コントロールを他のフォームで再利用できるように作成したカスタム dll。
以前は ToolStripContainer を使用していましたが、ToolStripContainer のトップ パネルだけが本当に必要だったので、ToolStripPanel を使用するように切り替えることにしました。ToolStripContainer を使用する意味がわかりませんでした。ツールボックスに ToolStripPanel コントロールが見つからなかったので、自分で Designer.cs ファイルに追加することにしました。これが私がそれをした方法です:
private ToolStripPanel tsPanel;
<--Other code here-->
private void InitializeComponent()
{
this.tsPanel = new System.Windows.Forms.ToolStripPanel();
<--Other code here-->
//
// tsPanel
//
this.tsPanel.Dock = System.Windows.Forms.DockStyle.Top;
this.tsPanel.Location = new System.Drawing.Point(0, 0);
this.tsPanel.Margin = new System.Windows.Forms.Padding(3);
this.tsPanel.Name = "tsPanel";
this.tsPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.tsPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.tsPanel.Size = new System.Drawing.Size(1000, 0);
<--Other code here-->
//
// MFDesigner
//
this.BackColor = System.Drawing.Color.Gainsboro;
<--Add other controls to UC Controls collection-->
this.Controls.Add(this.tsPanel);
this.ForeColor = System.Drawing.Color.Black;
this.Name = "MFDesigner";
this.Size = new System.Drawing.Size(1000, 670);
this.Load += new System.EventHandler(this.MultiFormatDesignerControl_Load);
this.Resize += new System.EventHandler(this.MFDesigner_Resize);
this.pnlToolbox.ResumeLayout(false);
this.pnlProperties.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
次に、ユーザー コントロールのコンストラクターで、次のようにします。
public MFDesigner()
{
InitializeComponent();
<--Other code here-->
ToolStripButton[] openSaveButtonArr = new ToolStripButton[]{
//The createToolStripButton method creates toolstrip buttons using some simple
//parameters.
createToolStripButton("Open", Images.CmdOpen, new EventHandler(this.OnOpen), "Open saved file"),
createToolStripButton("Save", Images.CmdSave, new EventHandler(this.OnSaveToDisk), "Save to disk")
};
ToolStrip openSaveToolStrip = new ToolStrip(openSaveButtonArr);
tspanel.Join(openSaveToolStrip);
<--Other code here-->
}
ツール ストリップを作成してコードで toolstrippanel に追加しているため、ユーザー コントロールのデザイナーでどのように表示されるかわかりません。そのため、dll をビルドし、dll からのユーザー コントロールを使用する別のプロジェクトの別のフォームに移動します。フォームが開いたときにツールストリップはありません。それは単に表示されません。ただし、ここで奇妙なことがあります。パネルにツールストリップを 1 つだけ追加すると、2 つ目のツールストリップが表示されます。
public MFDesigner()
{
InitializeComponent();
<--Other code here-->
ToolStripButton[] openSaveButtonArr = new ToolStripButton[]{
//The createToolStripButton method creates toolstrip buttons using some simple
//parameters.
createToolStripButton("Open", Images.CmdOpen, new EventHandler(this.OnOpen), "Open saved file"),
createToolStripButton("Save", Images.CmdSave, new EventHandler(this.OnSaveToDisk), "Save to disk")
};
ToolStrip openSaveToolStrip = new ToolStrip(openSaveButtonArr);
tspanel.Join(openSaveToolStrip, 1);
ToolStripButton[] openSaveButtonArr2 = new ToolStripButton[]{
createToolStripButton("Open2", Images.CmdOpen, new EventHandler(this.OnOpen), "Open saved rpx file 2"),
createToolStripButton("Save2", Images.CmdSave, new EventHandler(this.OnSaveToDisk), "Save to disk 2")
};
ToolStrip openSaveToolStrip2 = new ToolStrip(openSaveButtonArr2);
tsPanel.Join(openSaveToolStrip2, 1);
<--Other code here-->
}
上記のコードでは、最初に作成したツールストリップは表示されませんが、2 番目のツールストリップ (openSaveToolStrip2) は表示されます。ちなみに、両方のツールストリップに Join オーバーロード Join(toolStrip) を使用しただけでは、何も表示されません。また、tsPanel.Join(toolstrip3, 2) または tsPanel.Join(toolstrip4, 3) などの他の行にツールストリップを追加すると、ツールストリップが表示されます。
説明のつかない (少なくとも私にとっては) 理由で、追加した最初のツールストリップは表示されませんが、後続のすべてのツールストリップは表示されるようです。回避策として、ダミーのツールストリップを作成して追加し、実際のツールストリップをすべて追加しました。これはかなりハックな気がするので、なぜこれが起こっているのかを理解したいと思います。MSDNのドキュメントに従おうとしましたが、このようなバグが修正されていないとは想像できないため、まだ何かが欠けているに違いありません。
ここで何がうまくいかないのか誰か知っていますか?