首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ToolStripPanel联接方法没有将工具条添加到面板

ToolStripPanel联接方法没有将工具条添加到面板
EN

Stack Overflow用户
提问于 2014-10-10 22:44:29
回答 1查看 1K关注 0票数 1

我在ToolStripPanel.Join上遇到了一个很奇怪的问题,我一直在谷歌上搜索,所以我想知道我做错了什么,但我搞不懂。基本上,当我使用ToolStripPanel.Join时,我添加的第一个ToolStrip根本不会出现在ToolStripPanel中,但是我加入的所有其他ToolStrips都会出现。在深入讨论细节之前,首先让我说一下,我使用的是C#和VS 2010以及.NET 4,只是在某些上下文中,我尝试在用户控件上使用ToolStripPanel,该控件位于我们创建的自定义dll中,这样我们就可以在其他形式中重用这些用户控件。

我以前使用过ToolStripContainer,但我决定使用ToolStripPanel,因为我们只需要ToolStripContainer的顶部面板;我不认为使用ToolStripContainer有什么意义。由于无法在工具箱中找到ToolStripPanel控件,所以我决定自己将其添加到Designer.cs文件中。我就是这样做的:

代码语言:javascript
复制
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();
}

然后,在用户控件的构造函数中,我有:

代码语言:javascript
复制
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中消耗用户控件,当表单打开时,没有工具条;它根本不出现。不过,奇怪的是。如果我只向面板再添加一个工具条,那么将出现第二个工具条:

代码语言:javascript
复制
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)会出现。顺便说一句,如果我只对这两个工具条使用连接重载连接(ToolStrip),则不会出现任何情况。另外,如果我将工具条添加到其他行,即tsPanel.Join(toolstrip3,2)或tsPanel.Join(toolstrip4,3),则将出现这些工具条。

似乎,出于某种莫名其妙的原因(至少对我而言),我添加的第一个工具条从未出现过,但所有后续的工具条都会出现。作为一种解决办法,我只是创建了一个虚拟工具条,添加了它,然后添加了我所有的实际工具条。这感觉很烦人,所以我很想弄清楚为什么会发生这种事。我试图跟踪文档论MSDN,但我肯定仍然遗漏了一些东西,因为我无法想象这样的bug没有得到修复。

有人知道这里可能出了什么问题吗?

EN

回答 1

Stack Overflow用户

发布于 2014-10-11 07:14:56

在工具条面板中使用所有工具条运行应用程序的屏幕截图

我取走了您的代码并删除了分散的成员,以便可以编译或与您的问题无关的内容(例如://私有Panel pnlToolbox;//私有Panel pnlProperties;)。我创建了运行时工具条,并将它们加入到面板中,就像您一样。我还提供了我自己的createToolStripButton实现,因为您没有。第三个工具条使用Image.FromStream和web资源,因为我缺少本地资源。不管有没有图像我都没有任何故障..。

以下是完整的例子:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26309092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档