C#如何在TabPage

时间:2016-04-20 20:18:43

标签: c# windows winforms

目标:当应用程序启动时,我想为我的资源中的每张图片生成一个按钮(6个用于测试,128个最终版本),位于TabPage的一侧。

这是我到目前为止所处的位置:

private void tabPage1_load(object sender, EventArgs e)
{
    ResourceSet rs = new ResourceSet("");
    IDictionaryEnumerator id = rs.GetEnumerator();
    List<Bitmap> CIcons = new List<Bitmap>();
    while (id.MoveNext())
    {
        if (id.Value is Bitmap)
            CIcons.Add((Bitmap)id.Value);
    }
}

这似乎没有诀窍,任何建议都会非常感激

编辑(添加):问题是应用程序启动时我没有看到“tabPage1”中列出的图像。

同样是的,我在Visual Studio中的“资源文件夹”中添加了6张图像。

仅为未来的人们,我想添加完成的工作代码:

        // Button list start
        // Credit to Jcl
        ResourceSet rs = Properties.Resources.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
        IDictionaryEnumerator id = rs.GetEnumerator();
        List<Bitmap> CIcons = new List<Bitmap>();
        while (id.MoveNext())
        {
            if (id.Value is Bitmap)
                CIcons.Add((Bitmap)id.Value);
        }


        int yposition = 0;
        foreach (var bmp in CIcons)
        {
            Button button = new Button();
            button.Location = new Point(0, yposition);
            button.Size = new Size(125, 125);
            button.Visible = true;
            button.BackgroundImage = bmp;
            tabPage1.Controls.Add(button);
            yposition += 125; 

        }
        //Button list end

1 个答案:

答案 0 :(得分:1)

如果你想生成一个按钮,我会说:

private void tabPage1_load(object sender, EventArgs e)
{
    ResourceSet rs = new ResourceSet("");
    IDictionaryEnumerator id = rs.GetEnumerator();
    List<Bitmap> CIcons = new List<Bitmap>();
    while (id.MoveNext())
    {
        if (id.Value is Bitmap)
            CIcons.Add((Bitmap)id.Value);
    }

    // Vertical aligned: i'll let you figure out how to position them
    int yposition = 0;
    foreach(var bmp in CIcons)
    {
       var button = new Button();   
       button.Location = new Point(0, yposition);
       button.Size = new Size(50, 20); // for example
       button.Visible = true;
       button.BackgroundImage = bmp;
       tabPage1.Controls.Add(button);        
       yposition += 20; // height of button

    }
}

更新

如评论中所述(我认为这是示例代码,但似乎不是),您还需要指定从哪里获取ResourceSet。在您的情况下,更改:

ResourceSet rs = new ResourceSet("");

ResourceSet rs = Properties.Resources.ResourceManager.GetResourceSet(
                                  CultureInfo.CurrentUICulture, true, true);

代码易读性奖金

所有这些代码:

IDictionaryEnumerator id = rs.GetEnumerator();
List<Bitmap> CIcons = new List<Bitmap>();
while (id.MoveNext())
{
    if (id.Value is Bitmap)
        CIcons.Add((Bitmap)id.Value);
}

相当于:

List<Bitmap> CIcons = new List<Bitmap>();
foreach(var bmp in rs.OfType<Bitmap>())
  CIcons.Add(bmp);

由于您可以从可枚举中创建列表,因此您可以执行以下操作:

List<Bitmap> CIcons = new List<Bitmap>(rs.OfType<Bitmap>());

但是,由于除了创建按钮之外没有使用位图列表,您可能无法定义它,然后整个代码变为:

var rs  = Properties.Resources.ResourceManager.GetResourceSet(
                         CultureInfo.CurrentUICulture, true, true);
int yposition = 0;
foreach (var bmp in rs.OfType<Bitmap>())
{
    var button = new Button()
    {
        Location = new Point(0, yposition),
        Size = new Size(125, 125),
        Visible = true,
        BackgroundImage = bmp,
    };
    tabPage1.Controls.Add(button);
    yposition += 125; 
}

这可以进一步优化:如果我是你,而不是通过计算每个组件的像素位置来定位,我会使用FlowLayoutPanel来排列按钮。 FlowLayoutPanel的使用超出了这个问题的范围,我只是提到它,以防您想要进一步调查和谷歌