У меня действительно странная проблема с ToolStripPanel.Join, и я искал в Google и SO некоторые подсказки относительно того, что я делаю не так, но я не могу этого понять. По сути, когда я использую ToolStripPanel.Join, первая добавляемая мной ToolStrip вообще не отображается в ToolStripPanel, но появляются все остальные ToolStrip, к которым я присоединяюсь. Прежде чем я углублюсь в детали, позвольте мне сначала сказать, что я использую C #, VS 2010 и .NET 4, и просто для некоторого контекста я пытаюсь использовать ToolStripPanel в пользовательском элементе управления, который находится внутри настраиваемая dll, которую мы создали, чтобы мы могли повторно использовать эти пользовательские элементы управления в других формах.
Раньше я использовал ToolStripContainer, но решил отказаться от использования ToolStripPanel, поскольку нам действительно нужна была только верхняя панель ToolStripContainer; Я не видел смысла в использовании 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-->
}
Поскольку мы создаем панели инструментов и добавляем их в панель инструментов в коде, я не вижу, как они выглядят в дизайнере для пользовательского элемента управления. Итак, я создаю dll и перехожу к другой форме в отдельном проекте, который использует пользовательский элемент управления из библиотеки dll, и когда форма открывается, панели инструментов нет; это просто не появляется. Но вот что странно. Если я добавлю к панели еще одну панель инструментов, появится вторая панель инструментов:
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-->
}
В приведенном выше коде первая созданная мной панель инструментов не появится, но появится вторая (openSaveToolStrip2). Между прочим, если я просто использую перегрузку Join (toolStrip) для обеих полосок инструментов, ничего не появляется. Кроме того, если я добавлю полоски инструментов к другим строкам, например tsPanel.Join (toolstrip3, 2) или tsPanel.Join (toolstrip4, 3), появятся полоски инструментов.
Похоже, что по какой-то необъяснимой (по крайней мере для меня) причине первая добавляемая мною панель инструментов никогда не появляется, но появляются все последующие панели инструментов. В качестве обходного пути я просто создал фиктивную панель инструментов, добавил ее, а затем добавил все мои настоящие панели инструментов. Это кажется довольно хакерским, поэтому я хотел бы выяснить, почему это происходит. Я пытался следовать документации в MSDN, но мне все равно что-то не хватает, потому что я не могу представить, чтобы подобная ошибка не была исправлена.
Кто-нибудь знает, что здесь может быть не так?