TapePage Image属性未绘制

本文关键字:绘制 属性 Image TapePage | 更新日期: 2023-09-27 18:26:44

设置:我有一个名为ProjectForm的System.Windows.Forms类。在这个表单中,我有一个名为TabControl的TabControl。初始化表单时,tabControl也是如此;但是,tabControl没有加载TabPages。TabPages是在用户选择treeView控件中的项目时在运行时根据需要创建和加载的。

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,并且图像确实显示在树控件中。

如果您能提供任何建议、解决方案或显而易见的闪光点,我将不胜感激。

--和平

+++FIX更新++++

凭借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,像冠军一样工作!

TapePage Image属性未绘制

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