0

对此可能没有简单的解决方案,但我基本上想要某种方法来保存一堆控件及其属性。

我允许用户添加控件,例如图片和标签(在运行时)。我想以某种方式回顾所有这些控件,就像 PowerPoint 一样。他们只能将控件添加到某个面板。

我首先想到将每个控件的属性存储在文本文档中,方法是遍历每个控件的属性并将它们写入一行,用“¬”分隔它们,以便可以拆分它们,但我非常困惑并且阅读和写入特定的线条比我最初想象的要困难一些,尽管我最终做到了。

我目前的解决方案是简单地“快照”面板并保存图像,但很快意识到这可能不是最有效的方式,就存储而言。

“为面板拍照”的代码...

 Using bmp As New Bitmap(QuizDesignPanel.Width, QuizDesignPanel.Height)
            bmp.SetResolution(My.Computer.Screen.BitsPerPixel, My.Computer.Screen.BitsPerPixel)
            QuizDesignPanel.DrawToBitmap(bmp, New Rectangle(0, 0, QuizDesignPanel.Width, QuizDesignPanel.Height))
            bmp.Save(QuizPath & "\" & FileName & Number & ".png", Imaging.ImageFormat.Png)

        End Using

...显然那里有一些变量在其他地方声明。

我只是想知道我是否走错了方向,是否有更好的方法来保存属性。

我可能没有很好地解释,但我相信你会明白我在说什么。提前感谢您的所有帮助。

另外,是否有一种简单的方法可以在运行时复制和粘贴控件?因为我目前只是将属性作为文本保存到剪贴板,然后在粘贴控件时引用它们。

编辑

    Friend Class SavedControl
    Friend theName As String
    Friend theSize As Size
    Friend theLocation As Point
    Friend imgFile As String
End Class

Private Sub TopPanel_Paint(sender As Object, e As PaintEventArgs) Handles TopPanel.Paint
    Dim SaveCtl As New SavedControl
    Dim myList As Collection
    For Each n As Control In QuizDesignForm.QuizDesignPanel.Controls
        SaveCtl.theSize = n.Size
        SaveCtl.theName = n.Name
        SaveCtl.theLocation = n.Location
        myList.Add(SaveCtl)
    Next


    Try
        Dim fs As New FileStream(My.Computer.FileSystem.SpecialDirectories.Desktop, FileMode.Create, FileAccess.Write)

        Serializer.Serialize(fs, myList)

        fs.Close()
        fs.Dispose()
    Catch ex As Exception
        MessageBox.Show("Oops!", "Title", MessageBoxButtons.OK, _
                 MessageBoxIcon.Exclamation)
    End Try

End Sub

序列化程序带有下划线,我不确定我是否正确声明了 myList(我已经导入了 System.IO 和 System.Xml.Serialization,如果重要的话)

4

1 回答 1

0

遍历面板的控件数组,将相关数据(大小?图像文件的名称等)收集到集合或列表中。理想情况下,每个控件的统计信息将存储在一个类中,并将它们中的许多存储到一个 List(of SavedControl) 中。然后序列化列表。

Friend Class SavedControl
   friend theName as String
   friend theSize as Size
   friend theLocation as Point

   friend imgFile as String
End Class

存储每个控件的数据

SaveCtl as New SavedControl
SaveCtl.theSize = pnl.Controls(n).Size
...  etc

myList.Add(SaveCtl)

然后使用二进制或 xml 序列化程序将列表保存到文件。我通常使用不同的序列化程序,但这就是它的全部:

Try
    Dim fs As New FileStream(SavedInfoFile, FileMode.Create, FileAccess.Write)

    Serializer.Serialize(fs, myList)

    fs.Close()
    fs.Dispose()
Catch ex As Exception
    MessageBox.Show("Oops!", MsgTitle, MessageBoxButtons.OK, _
             MessageBoxIcon.Exclamation)
 End Try

编辑(答案)

  1. 它是如何保存控件的。它正在保存相关信息,以便可以从收集和存储的数据中重建它们,例如它们的大小、位置、名称和使用的图像。请记住,我不知道它是什么或做什么或看起来像或行为或什么样的控制!

  2. 去哪儿?无论你给它起什么名字。它SavedInfoFile在示例中

  3. 什么类型的文件...有关系吗?如果您使用二进制序列化程序、XML 用于 XML 和二进制用于 ProtoBuff-NET,它将是二进制数据。

  4. 我如何读取数据...只需反向执行所有操作。反序列化,遍历列表并根据您收集的数据创建控件。

于 2013-09-30T20:35:37.873 回答