C#WinForms PictureBox控件如何提取加载到Resources.resx中的图像

时间:2018-04-02 17:23:19

标签: c# visual-studio visual-studio-2012 reflection

我正在试图弄清楚如何使用WInForm PictureBox控件执行某些操作。

我将简要描述我的应用程序是如何构建的,然后提出我的问题。

我正在使用C#Visual Studio 2012,但Visual Studio的版本可能并不重要。

创建一个名为“FunWIthPictureBox”的新WinForms应用程序。 打开Form的设计视图。

添加PIctureBox控件并将其命名为pbxPicture。

单击图片框。你会注意到右上角有一个黑色箭头。

单击黑色箭头以显示PictureBox任务对话框。单击“选择图像”选项。

这将打开“选择资源”对话框。确保选中“项目资源文件”单选按钮。单击“导入”按钮导入图像。完成后,再次单击“导入”并添加第二个图像。最后点击“确定”。我的照片被命名为“Picture1.jpg”& “Picture2.jpg”。

现在您已将两个位图图像加载到Project的资源文件(Properties \ Resources.resx)中。

双击表单以显示表单的加载事件。

您可以使用以下代码将Picture Box的图像设置为Picture1.jpg ... pbxPicture.Image = FunWIthPictureBox.Properties.Resources.Picture1; 请注意,“FunWithPictureBox”是命名空间。

如果您想使用其他图片,您可以像这样更新代码行。 pbxPicture.Image = FunWIthPictureBox.Properties.Resources.Picture2;

好到目前为止一切顺利。我正在试图弄清楚如何提取已加载到.Properties.Resources中的所有图像,并将这些图像加载到图像列表(List)中。

使用Reflection(和谷歌)我能够提出以下内容..

(使用System.Reflection添加)

 private void PictureBoxForm_Load(object sender, EventArgs e)
    {
        pbxPicture.Image = FunWithPictureBox.Properties.Resources.Picture1;
        var properties = typeof(Properties.Resources).GetProperties(BindingFlags.NonPublic | BindingFlags.Static);
        foreach (var propertyinfo in properties)
        {
            if (propertyinfo.PropertyType.ToString() == "System.Drawing.Bitmap")
            {
                MessageBox.Show(propertyinfo.Name + " " + propertyinfo.PropertyType.ToString());
            }
        }
    }

这几乎给了我想要的东西。我能够从资源文件中识别出图像。

如何将这些图像添加到图像列表?我有图像的名称,但我不知道如何访问图像并将其添加到列表中。

像这样......

private void PictureBoxForm_Load(object sender, EventArgs e)
    {
        List<Image> lstImages = new List<Image>();
        pbxPicture.Image = FunWithPictureBox.Properties.Resources.Picture1;
        var properties = typeof(Properties.Resources).GetProperties(BindingFlags.NonPublic | BindingFlags.Static);
        foreach (var propertyinfo in properties)
        {
            if (propertyinfo.PropertyType.ToString() == "System.Drawing.Bitmap")
            {
                lstImages.Add(propertyinfo.Name); //This code does not wwork :-(
            }
        }
    }

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

尝试将代码更改为:

        private void PictureBoxForm_Load ( object sender , EventArgs e ) {
            List<Image> lstImages = new List<Image> ( );
            //pbxPicture.Image = FunWithPictureBox.Properties.Resources.Picture1;
            var properties = typeof ( Properties.Resources ).GetProperties ( System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static );
            foreach ( var propertyinfo in properties ) {
                if ( propertyinfo.PropertyType.ToString ( ) == "System.Drawing.Bitmap" ) {
                    lstImages.Add ( ( Bitmap ) Properties.Resources.ResourceManager.GetObject ( propertyinfo.Name ) );
                }
            }
        }

Property.Resources有一个名为Resourcemanager的属性,它有一个函数,用于使用她的名称返回一个对象,如何使用propertyInfo.Name,它可能返回Bitmap。