2014-10-10 3 views
0

У меня очень странная проблема с ToolStripPanel.Join, и я искал в Google и SO некоторые сведения о том, что я делаю неправильно, но я могу " t понять это. В основном, когда я использую ToolStripPanel.Join, первый ToolStrip, который я добавляю, вообще не отображается в ToolStripPanel, но появятся все другие ToolStrips, которые я присоединю. Прежде чем я углубится в подробности, позвольте мне сначала сказать, что я использую C# и VS 2010 и .NET 4, и только для некоторого контекста я пытаюсь использовать ToolStripPanel для пользовательского элемента управления, который находится внутри custom dll, которые мы сделали, чтобы мы могли повторно использовать эти пользовательские элементы управления в других формах.Метод ToolStripPanel Join не добавляет инструментальную панель к панели

Я ранее использовал ToolStripContainer, но решил переключиться на использование ToolStripPanel, так как нам действительно нужна была верхняя панель ToolStripContainer; Я не видел смысла использовать ToolStripContainer. Поскольку я не мог найти элемент управления ToolStripPanel в Toolbox, я решил добавить его сам в файл 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, и когда форма открывается, нет инструментальной панели; он просто не появляется. Вот что странно. Если добавить только еще один ToolStrip к панели, второй ToolStrip появится:

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--> 
} 

В приведенном выше коде, первый ToolStrip, что я создаю не будет появляться, но второй один (openSaveToolStrip2) появится. Кстати, если я просто использую Join overload Join (toolStrip) для обеих панелей инструментов, ничего не появляется. Кроме того, если я добавлю инструментальные панели в другие строки, т. Е. TsPanel.Join (toolstrip3, 2) или tsPanel.Join (toolstrip4, 3), появятся панели инструментов.

Похоже, что для какой-то необъяснимой (по крайней мере, для меня) причины первая панель инструментов, которую я добавляю, никогда не появляется, но все последующие панели инструментов делают. В качестве обходного пути я просто создал манекенную панель инструментов, добавив ее, а затем добавив все свои настоящие инструментальные панели. Это кажется довольно взломанным, поэтому я хотел бы выяснить, почему это происходит. Я попытался выполнить документацию on MSDN, но мне все равно не хватает чего-то, потому что я не могу представить, что ошибка, подобная этой, не исправляется.

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

+0

Не уверен, если это уместно, или нет, но на всякий случай ... Этот проект был повышен с VS 2008 и .NET 3.5 для VS 2010 и .NET 4. – greyseal96

ответ

0

Скриншот запущенного приложения со всеми инструментальными планками внутри панели инструментов полосы

Running application with all tool strips inside the tool strip panel

я взял код и удален паразитные элементы, так что я мог собрать, или материал, который не имеет отношения к вашему вопросу (они, например: // 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  
    } 
+0

Я благодарю вас за то, что нашли время, чтобы получить все это. К сожалению, это не очень полезно, потому что это в основном подтверждает, что что-то странное происходит, но это не дает никакого представления о том, что может вызвать проблему. – greyseal96

+0

Я только что заметил, что вы используете форму для своего теста. Не уверен, заявляю ли я это выше или нет, но я все это выкладываю в пользовательском элементе управления в одном проекте dll, а затем я помещаю этот пользовательский элемент управления в форму в другом проекте. Считаете ли вы, что это имеет значение? – greyseal96

+0

> «Вы даже не уверены в деталях ... вы даже не удосужились прочитать свой оригинальный пост». Не знаете, почему вы считали необходимым отбросить эту неприглядную грубую часть в конце вашего комментария. Вы могли бы просто задать вопрос о том, что пользовательский элемент управления находится в одной dll и использует его в форме в другом проекте. BTW, я подумал, что может показаться приятнее сказать: «Не уверен, что я сказал это выше или нет ...», а не «Эй, не уверен, прочитал ли ты мой оригинальный пост, потому что вы используете форму, «Я воспроизвожу свои исходные условия, и вы не обращаетесь к тому, почему вы решили это сделать». – greyseal96

 Смежные вопросы

  • Нет связанных вопросов^_^