2014-10-16 84 views
0

設置: 我有一個名爲ProjectForm的System.Windows.Forms類。在這個表單中我有一個名爲tabControl的TabControl。當表單被初始化時,tabControl也是如此;但是,tabControl沒有加載TabPages。 TabPages在用戶選擇treeView控件中的項目時按需運行時創建和加載。TapePage圖像屬性沒有被繪製

示例呼叫從ProjectForm:

this.tabControl.TabPages.Add(PageLibrary.CallStackPage(e.Node.Name, e.Node.Text)); 

(TabPageLibrary)作爲PageLibrary類參考

class TabPageLibrary 
{ 
    private TabPageToolBar tabToolBar = new TabPageToolBar(); 

    public TabPage CallStackPage(string name, string label) 
    { 
     TabPage tabPage = NewProjectPage(); 
     tabPage.Name = "STACK:" + name; 
     tabPage.Text = label; 
     tabPage.Tag = name; 
     tabPage.ImageKey = "viewstack.png"; 
     return tabPage; 
    } 
    private TabPage NewProjectPage() 
    { 
     TabPage tabPage = new TabPage(); 
     tabPage.Padding = new Padding(3); 
     tabPage.UseVisualStyleBackColor = true; 
     tabPage.Controls.Add(this.tabToolBar); 
     return tabPage; 
    } 
} 

問題 當TabPage的被加載到運行時的控制 - 無圖像顯示在選項卡上。 TabControl.ImageList被設置爲包含我引用的圖像的ImageList。隨後,樹控件引用相同的ImageList,並在樹控件中顯示圖像。

我將不勝感激任何建議,解決方案或明顯的盲目閃光,你可以分享。

--Peace

+++修復更新++++

隨着DonBoitnott的洞見 - 我能得到這些圖像正確輕微重構渲染。

新調用示例從ProjectForm:

TabPage page = PageLibrary.NewProjectPage(); 
this.tabControl.TabPages.Add(page); 
page = PageLibrary.CallStackPage(e.Node.Name, e.Node.Text, page); 

重構(TabPageLibrary)作爲PageLibrary類再次引用

class TabPageLibrary 
{ 
    private TabPageToolBar tabToolBar = new TabPageToolBar(); 

    internal TabPage CallStackPage(string name, string label, TabPage page) 
    { 
     page.Name = "STACK:" + name; 
     page.Text = label; 
     page.Tag = name; 
     page.ImageKey = "viewstack.png"; 
     //TODO: Load Additional CallStack Controls 

     return page; 
    } 

    internal TabPage NewProjectPage() 
    { 
     TabPage tabPage = new TabPage(); 
     tabPage.Padding = new Padding(3); 
     tabPage.UseVisualStyleBackColor = true; 
     tabPage.Controls.Add(this.tabToolBar); 
     return tabPage; 
    } 
} 

感謝@DonBoitnott,作品就像一個冠軍!

+0

是分配給圖像列表標籤控件?即'tabControl1.ImageList = imageList1' – DonBoitnott 2014-10-16 19:47:45

+0

是的 - 它被正確地分配。如果我使用VS添加一個靜態TabPage - 我可以從我已經分配的ImageList中選擇圖像。 – 2014-10-16 20:32:21

回答

0

TabPage的代碼告訴我們,如果頁面有一個從其中拉取的父頁面,該頁面將只顯示圖像列表。奇怪,但你可以證明它。那就是:

//From TabPage.cs 
    public string ImageKey 
    { 
     get 
     { 
      return this.ImageIndexer.Key; 
     } 
     set 
     { 
      this.ImageIndexer.Key = value; 
      TabControl parentInternal = this.ParentInternal as TabControl; 
      if (parentInternal != null) 
      { 
       this.ImageIndexer.ImageList = parentInternal.ImageList; 
      } 
      this.UpdateParent(); 
     } 
    } 

這意味着你必須確保你父標籤頁嘗試給圖像列表鍵之前。

因此,考慮到這一點,這裏有一個裸露的骨頭例如,你可以把任何形式的(你需要提供,當然你自己的藝術):

public partial class Form1 : Form 
{ 
    private ImageList _imgList; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(Object sender, EventArgs e) 
    { 
     foreach (TabPage p in tabControl1.TabPages) 
      p.Dispose(); 
     _imgList = new ImageList(); 
     _imgList.Images.Add("image0", Properties.Resources.ImageOne); 
     _imgList.Images.Add("image1", Properties.Resources.ImageTwo); 
     _imgList.Images.Add("image2", Properties.Resources.ImageThree); 
     tabControl1.ImageList = _imgList; 
    } 

    private void button1_Click(Object sender, EventArgs e) 
    { 

     Int32 count = tabControl1.TabPages.Count; 
     if (count < 3) 
     { 
      TabPage p = new TabPage(); 
      p.Name = "page" + count; 
      p.Text = "page" + count; 
      tabControl1.TabPages.Add(p); 
      p.Parent = tabControl1; 
      p.ImageKey = "image" + count; 
     } 
    } 
} 
+0

非常感謝您的深思熟慮!你的答案當然有好處,並且是完全合理的。讓我在項目中解決您的問題,我會盡快回復您。再次感謝 - 偉大的答案! – 2014-10-16 20:34:33

+0

我實際上採取了不同的路線,並能夠通過對代碼進行一些更改來顯示圖像。我會爲了關閉而張貼它。再次感謝您的洞察力並指出問題的癥結所在。 – 2014-10-16 20:56:07