Метод ToolStripPanel Join не добавляет панель инструментов на панель

У меня действительно странная проблема с 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, но мне все равно что-то не хватает, потому что я не могу представить, чтобы подобная ошибка не была исправлена.

Кто-нибудь знает, что здесь может быть не так?


person greyseal96    schedule 10.10.2014    source источник
comment
Не уверен, актуально это или нет, но на всякий случай ... Этот проект был обновлен с VS 2008 и .NET 3.5 до VS 2010 и .NET 4.   -  person greyseal96    schedule 14.10.2014


Ответы (1)


Снимок экрана работающего приложения со всеми полосками инструментов внутри панели полоски инструментов

Запуск приложения со всеми панелями инструментов внутри панели полос инструментов

Я взял ваш код и удалил случайные элементы, чтобы я мог скомпилировать, или что-то, что не имеет отношения к вашей проблеме (например: // private Panel pnlToolbox; // private Panel pnlProperties;). Я создал полосы инструментов среды выполнения и соединил их с панелью, как и вы. Я также предоставил свою собственную реализацию createToolStripButton, поскольку вы этого не сделали. Третья панель инструментов использует Image.FromStream и веб-ресурсы, поскольку мне не хватало локальных. С изображениями или без них у меня вообще не было неисправностей ...

Полный пример ниже:

public partial class MFDesigner : Form {
    private ToolStripPanel tsPanel;
    //private Panel pnlToolbox;
    //private Panel pnlProperties;        

    public MFDesigner ( )
    {
      InitializeComponent();
      //
      // first toolstrip
      //
      ToolStripButton tsbOpen = new ToolStripButton("Open", null, new EventHandler(this.OnOpen), "Open saved file");
      ToolStripButton tsbSave = new ToolStripButton("Save", null, new EventHandler(this.OnSaveToDisk), "Save to disk");
      ToolStripButton[] openSaveButtonArr = new ToolStripButton[] { tsbOpen, tsbSave };
      ToolStrip openSaveToolStrip = new ToolStrip(openSaveButtonArr) { CanOverflow = true };
      this.tsPanel.Join(openSaveToolStrip);    
      //
      // second toolstrip
      //
      ToolStripButton tsbOpen2 = createToolStripButton("Open2", null, new EventHandler(this.OnOpen), "Open saved file");
      ToolStripButton tsbSave2 = createToolStripButton("Save2", null, new EventHandler(this.OnSaveToDisk), "Save to disk");
      ToolStripButton[] openSaveButtonArr2 = new ToolStripButton[] { tsbOpen2, tsbSave2 };
      ToolStrip openSaveToolStrip2 = new ToolStrip(openSaveButtonArr2) { CanOverflow = true };
      this.tsPanel.Join(openSaveToolStrip2, 1);      
      //
      // third toolstrip
      //
      WebClient wc = new WebClient();
      byte[] bytes = wc.DownloadData("http://my.crestron.eu/images/icons/ico_folder_open.png");
      // You must keep the stream open for the lifetime of the Image.
      MemoryStream msOpen = new MemoryStream(bytes);
      System.Drawing.Image imgOpen = System.Drawing.Image.FromStream(msOpen);

      bytes = wc.DownloadData("http://www.njrussians.com/images/save_ico.png");
      MemoryStream msSave = new MemoryStream(bytes);
      System.Drawing.Image imgSave = System.Drawing.Image.FromStream(msSave);
      ToolStripButton tsbOpen3 = createToolStripButton("Open3", imgOpen, new EventHandler(this.OnOpen), "Open saved file");
      ToolStripButton tsbSave3 = createToolStripButton("Save3", imgSave, new EventHandler(this.OnSaveToDisk), "Save to disk");
      ToolStripButton[] openSaveButtonArr3 = new ToolStripButton[] { tsbOpen3, tsbSave3 };
      ToolStrip openSaveToolStrip3 = new ToolStrip(openSaveButtonArr3) { CanOverflow = true };
      this.tsPanel.Join(openSaveToolStrip3, 2);     

    }

    ToolStripButton createToolStripButton (string text, Image i, EventHandler eh, string name)
    {
      return new ToolStripButton(text, i, eh, name);
    }

    void MFDesigner_Resize (object sender, System.EventArgs e) { }

    void MFDesigner_Load (object sender, System.EventArgs e) { }

    void OnOpen (object target, EventArgs e) { }

    void OnSaveToDisk (object target, EventArgs e) { }

    #region Windows Form Designer generated code
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose (bool disposing)
    {
      if (disposing && (components != null))
      {
        components.Dispose();
      }
      base.Dispose(disposing);
    }

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent ( )
    {
      this.tsPanel = new System.Windows.Forms.ToolStripPanel();
      this.SuspendLayout();
      // 
      // 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(984, 0);
      // 
      // MFDesigner
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
      this.BackColor = System.Drawing.Color.Gainsboro;
      this.ClientSize = new System.Drawing.Size(984, 632);
      this.Controls.Add(this.tsPanel);
      this.ForeColor = System.Drawing.Color.Black;
      this.Name = "MFDesigner";
      this.Text = "MFDesigner";
      this.Load += new System.EventHandler(this.MFDesigner_Load);
      this.Resize += new System.EventHandler(this.MFDesigner_Resize);
      this.ResumeLayout(false);
      this.PerformLayout();    
    }    


    #endregion    
  }
person andrei.ciprian    schedule 11.10.2014
comment
Я благодарю вас за то, что вы нашли время, чтобы все это смоделировать. К сожалению, это не очень полезно, потому что оно в основном подтверждает, что определенно происходит что-то странное, но не дает никакого ключа к пониманию того, что может быть причиной проблемы. - person greyseal96; 13.10.2014
comment
Я только что заметил, что вы используете форму для теста. Не уверен, что я сказал это выше или нет, но я помещаю все это в пользовательский элемент управления в одном проекте dll, а затем помещаю этот пользовательский элемент управления в форму в другом проекте. Как вы думаете, это имеет значение? - person greyseal96; 15.10.2014
comment
›Вы даже не уверены в подробностях ... Вы даже не удосужились прочитать свой исходный пост. Не уверен, почему вы сочли необходимым добавить эту язвительную грубость в конец вашего комментария. Вы могли бы просто ответить на мой вопрос о наличии пользовательского элемента управления в одной dll и использовании его в форме в другом проекте. Кстати, я подумал, что было бы лучше сказать: «Не уверен, сказал ли я это выше или нет ... исходные условия, и вы не объясняете, почему вы решили это сделать. - person greyseal96; 16.10.2014
comment
Несмотря на это, я действительно благодарен за то, что вы нашли время, чтобы ответить и предложить помощь. - person greyseal96; 16.10.2014
comment
Извлеките из кода как можно больше мусора и поделитесь им, если это невозможно, предоставьте более подробную информацию об инициализации формы / пользовательского элемента управления. Вложен ли ToolStrip в пользовательский элемент управления, используемый формой? Что непонятно ... - person andrei.ciprian; 16.10.2014