C# 未绘制TapePage图像属性
设置: 我有一个名为ProjectForm的System.Windows.Forms类。在这种形式中,我有一个名为TabControl的TabControl。初始化表单时,tabControl也会初始化;但是,tabControl没有加载TabPages。当用户在treeView控件中选择项时,会在运行时根据需要创建和加载选项卡页 来自ProjectForm的调用示例: TabPageLibrary作为PageLibrary类引用 问题 当TabPage在运行时加载到控件中时,选项卡上不会显示任何图像。TabControl.ImageList设置为包含我正在引用的图像的ImageList。随后,树控件引用相同的ImageList,并且图像确实显示在树控件中 如果您能给我提供任何建议、解决方案或让我眼花缭乱的信息,我将不胜感激 -和平 +++修复更新++++ 凭借DonBoitnott的洞察力,我能够通过较小的重构使这些图像正确渲染 来自ProjectForm的新示例调用: 重构TabPageLibrary作为PageLibrary类引用 再次感谢@DonBoitnott,像冠军一样工作 TabPage的代码告诉我们,只有当页面有一个从中提取图像列表的父对象时,该页面才会提取图像列表。奇怪,但你可以证明。这是:C# 未绘制TapePage图像属性,c#,winforms,tabcontrol,tabpage,C#,Winforms,Tabcontrol,Tabpage,设置: 我有一个名为ProjectForm的System.Windows.Forms类。在这种形式中,我有一个名为TabControl的TabControl。初始化表单时,tabControl也会初始化;但是,tabControl没有加载TabPages。当用户在treeView控件中选择项时,会在运行时根据需要创建和加载选项卡页 来自ProjectForm的调用示例: TabPageLibrary作为PageLibrary类引用 问题 当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;
}
}
}
是否将图像列表指定给选项卡控件?i、 e.tabControl1.ImageList=ImageList1是-已正确分配。如果我使用VS-添加一个静态选项卡页面,我可以从我分配的图像列表中选择图像。非常感谢您周到的回答!你的回答当然有道理,完全有道理。让我在我的项目中介绍一下你的解决方案,我会给你回复的。再次感谢-非常好的回答!实际上,我采取了一种不同的方法,只需对代码做一些更改,就可以让图像显示出来。为了结案,我会把它贴出来。再次感谢您的见解,并指出了问题的症结所在。
TabPage page = PageLibrary.NewProjectPage();
this.tabControl.TabPages.Add(page);
page = PageLibrary.CallStackPage(e.Node.Name, e.Node.Text, page);
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;
}
}
//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;
}
}
}