【问题标题】:TapePage Image property not being paintedTapePage 图像属性未绘制
【发布时间】:2014-12-12 06:32:40
【问题描述】:

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

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

如果您能分享任何建议、解决方案或令人眼花缭乱的闪现,我将不胜感激。

--和平

+++ 修复更新++++

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

【问题讨论】:

  • 图片列表是否分配给了tab控件?即tabControl1.ImageList = imageList1
  • 是的 - 它已正确分配。如果我使用 VS 添加静态 TabPage - 我可以从我分配的这个 ImageList 中选择图像。

标签: c# winforms tabcontrol tabpage


【解决方案1】:

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

【讨论】:

  • 非常感谢您的周到回答!您的回答当然有优点并且完全有道理。让我在我的项目中介绍您的解决方案,我会回复您。再次感谢 - 很好的答案!
  • 我实际上采取了不同的方式,只需对我的代码进行一些更改即可显示图像。为了关闭,我会发布它。再次感谢您的洞察力并指出问题的症结所在。
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 2019-04-02
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多