Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保存以编程方式创建的picturebox控件并重新加载_C#_Save_Controls_Load_Picturebox - Fatal编程技术网

C# 保存以编程方式创建的picturebox控件并重新加载

C# 保存以编程方式创建的picturebox控件并重新加载,c#,save,controls,load,picturebox,C#,Save,Controls,Load,Picturebox,事实上我有麻烦了。我的项目是创建一个带有快捷方式的桌面。桌面已经准备好,它是一个图片盒作为背景。现在是捷径 通过对话框,我将在picturebox(桌面)上创建一个快捷方式。例子: 这是我的桌面: 这是我的对话: 第一个文本框是文件的路径。第二个文本框是快捷方式的名称 结果如下: 在左上角是一个新的绿色快捷方式。它是一个picturebox,由以下代码创建: Icon ico = Icon.ExtractAssociatedIcon(textBox1.Text); var

事实上我有麻烦了。我的项目是创建一个带有快捷方式的桌面。桌面已经准备好,它是一个图片盒作为背景。现在是捷径

通过对话框,我将在picturebox(桌面)上创建一个快捷方式。例子: 这是我的桌面:

这是我的对话: 第一个文本框是文件的路径。第二个文本框是快捷方式的名称

结果如下: 在左上角是一个新的绿色快捷方式。它是一个picturebox,由以下代码创建:

 Icon ico = Icon.ExtractAssociatedIcon(textBox1.Text);

        var picture = new PictureBox
        {
            Name = textBox2.Text,
            Size = new Size(48, 46),
            Location = new Point(100, 100),
            Image = ico.ToBitmap(),
            SizeMode = PictureBoxSizeMode.Zoom,

        };


        Form1Singleton.FormVerweis.pictureBox1.Controls.Add(picture);
所以,我的问题是:

当应用程序启动时,如何保存新创建的picturebox(左上角的绿色图标)并将其加载回相同的位置,以及相同的单击事件以启动其后面的.exe(之前对话框中文本框1中的exe路径)。有关要保存的picturebox的信息:位置、图标、.exe路径

谢谢你的帮助,我对代码示例非常满意。
Joshua

您需要创建一个类,该类存储创建图标所需的所有信息:

[Serializable]
public class IconDefinition
{
    public string Name { get; set; }
    public string Path { get; set; }
    public int X { get; set; }
    public int Y { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }
}
然后,您就有了一些基于这些值实际创建图标的方法:

void createIcon(IconDefinition iconDefinition)
{
    PictureBox pictureBox = new PictureBox()
    {
        Name = iconDefinition.Name,
        Size = new Size(iconDefinition.Width, iconDefinition.Height),
        Location = new Point(iconDefinition.X, iconDefinition.Y),
        Image = Icon.ExtractAssociatedIcon(iconDefinition.Path).ToBitmap(),
        SizeMode = PictureBoxSizeMode.Zoom
    };
    pictureBox.Click += myClickHandler;
    Form1Singleton.FormVerweis.pictureBox1.Controls.Add(pictureBox);
}
接下来,您将有您的方法来序列化和反序列化这些。由于您可能希望将所有图标存储在同一个文件中以实现持久性,因此可以使用
列表
进行序列化

static void saveIcons(List<IconDefinition> icons)
{
    using (Stream stream = new FileStream(@".\icons.bin", FileMode.Create, FileAccess.Read))
        new BinaryFormatter().Serialize(stream, icons);
}

static List<IconDefinition> loadIcons()
{
    using (Stream stream = new FileStream(@".\icons.bin", FileMode.Open, FileAccess.Read))
        return (List<IconDefinition>)new BinaryFormatter().Deserialize(stream);
}
当您要保存所有图标时:

List<IconDefinition> allIcons = new List<IconDefinition>();
saveIcons(allIcons);
当应用程序开始恢复它们时:

// When application starts you can load the icons
allIcons = loadIcons();
// then restore them all
foreach (IconDefinition definition in allIcons)
    createIcon(definition);

希望有帮助。

您需要创建一个类,该类存储创建图标所需的所有信息:

[Serializable]
public class IconDefinition
{
    public string Name { get; set; }
    public string Path { get; set; }
    public int X { get; set; }
    public int Y { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }
}
然后,您就有了一些基于这些值实际创建图标的方法:

void createIcon(IconDefinition iconDefinition)
{
    PictureBox pictureBox = new PictureBox()
    {
        Name = iconDefinition.Name,
        Size = new Size(iconDefinition.Width, iconDefinition.Height),
        Location = new Point(iconDefinition.X, iconDefinition.Y),
        Image = Icon.ExtractAssociatedIcon(iconDefinition.Path).ToBitmap(),
        SizeMode = PictureBoxSizeMode.Zoom
    };
    pictureBox.Click += myClickHandler;
    Form1Singleton.FormVerweis.pictureBox1.Controls.Add(pictureBox);
}
接下来,您将有您的方法来序列化和反序列化这些。由于您可能希望将所有图标存储在同一个文件中以实现持久性,因此可以使用
列表
进行序列化

static void saveIcons(List<IconDefinition> icons)
{
    using (Stream stream = new FileStream(@".\icons.bin", FileMode.Create, FileAccess.Read))
        new BinaryFormatter().Serialize(stream, icons);
}

static List<IconDefinition> loadIcons()
{
    using (Stream stream = new FileStream(@".\icons.bin", FileMode.Open, FileAccess.Read))
        return (List<IconDefinition>)new BinaryFormatter().Deserialize(stream);
}
当您要保存所有图标时:

List<IconDefinition> allIcons = new List<IconDefinition>();
saveIcons(allIcons);
当应用程序开始恢复它们时:

// When application starts you can load the icons
allIcons = loadIcons();
// then restore them all
foreach (IconDefinition definition in allIcons)
    createIcon(definition);


希望这能有所帮助。

阅读一下。不要序列化PictureBox tho,而是加载应用程序时以编程方式还原它所需的值。我应该如何加载它?我必须在启动时创建一个新的picturebox,并将文件中的值加载到其中?这是正确的!如果您有一个方法,可以获取一些参数并创建可用于现有进程的picturebox(例如,
CreateIcon(字符串路径、字符串名称、int x、int y、int width、int height)
,您可以使用
textbox1.text、textbox2.text、48、46、100、100
调用该方法然后在启动时使用反序列化的值加载。我创建了您的示例。但问题是,我不知道如何序列化它,我读了你发送的文章。。。我必须在创建图标后序列化它,并在加载mainform时反序列化它。两种不同的形式…我不知道,我必须用什么作为对象。你站起来了吗?读一读。不要序列化PictureBox tho,而是加载应用程序时以编程方式还原它所需的值。我应该如何加载它?我必须在启动时创建一个新的picturebox,并将文件中的值加载到其中?这是正确的!如果您有一个方法,可以获取一些参数并创建可用于现有进程的picturebox(例如,
CreateIcon(字符串路径、字符串名称、int x、int y、int width、int height)
,您可以使用
textbox1.text、textbox2.text、48、46、100、100
调用该方法然后在启动时使用反序列化的值加载。我创建了您的示例。但问题是,我不知道如何序列化它,我读了你发送的文章。。。我必须在创建图标后序列化它,并在加载mainform时反序列化它。两种不同的形式…我不知道,我必须用什么作为对象。你站起来了吗?它在工作!谢谢!最后一个问题:我可以在哪里以及如何为picturebox输入单击处理程序?不知道?:/我很想这样做,但我没有图片框对象,我可以这样做:pic.click+=neweventhandler()嗨,很抱歉我无法回复。我看不出为什么普通的点击处理程序
。MouseClick+=handler
不能工作。你可能想为这个问题提出一个新问题。嘿,问题是,我不知道,我必须把这个代码片段放到你上面写的代码中的什么地方。就这些…谢谢你的帮助和支持!它起作用了!谢谢!最后一个问题:我可以在哪里以及如何为picturebox输入单击处理程序?不知道?:/我很想这样做,但我没有图片框对象,我可以这样做:pic.click+=neweventhandler()嗨,很抱歉我无法回复。我看不出为什么普通的点击处理程序
。MouseClick+=handler
不能工作。你可能想为这个问题提出一个新问题。嘿,问题是,我不知道,我必须把这个代码片段放到你上面写的代码中的什么地方。就这些…谢谢你的帮助和支持!