C#Winforms - 强制将用户控件的属性值写入resx文件

时间:2017-08-29 08:46:28

标签: c# .net winforms windows-forms-designer

我拥有byte[]属性的用户控件。阵列在设计时也会变得庞大。当Visual Studio保存表单时,它使用此方法将其保存到cs文件

this.ctlShowSpreadsheet1.SerializationContent = new byte[] {
        ((byte)(80)),
        ((byte)(75)),
        ((byte)(3)),
        ((byte)(4)),
        ((byte)(20)),
        ((byte)(0)),
        ((byte)(2)),
        ((byte)(0)),
        ((byte)(8)),
        ((byte)(0)),
        ((byte)(128)),
        ((byte)(84)),
        ((byte)(29)),
        ...

有没有办法强制将字节数组保存到resx文件中? 我尝试更改DesignerSerializationVisibility,但没有结果。

1 个答案:

答案 0 :(得分:1)

如果属性的类型为Serializable,则设计器会将其序列化为资源文件。

因此,在您的情况下,您可以创建一个可序列化的字节列表并使用它存储您的字节列表。请记住,设计人员需要将可序列化的类放在不同的程序集中。

实施例

在下面的例子中,我创建了一个具有字节列表属性的控件,该属性将存储在表单的resx文件中。为此,请按照下列步骤操作:

  1. 创建一个新的 Windows Forms 项目项目作为主项目。
  2. Windows窗体控件库的新项目添加到解决方案中。
  3. 将包含以下代码的c#文件添加到控件库项目中。
  4. 将控件库项目的引用添加到主窗体窗体项目中。
  5. 构建解决方案。
  6. 在表单上删除MyControl的实例。
  7. 然后在属性网格中找到ByteList属性并展开它。
  8. 修改Bytes属性。
  9. 保存表单
  10. 查看属性值是否保存在表单的资源文件中。设计人员还会生成代码以从资源中获取值:

    this.myControl1.ByteList = ((WindowsFormsControlLibrary1.SerializableByteList)
        (resources.GetObject("myControl1.ByteList")));
    
  11. 代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Windows.Forms;
    public class MyControl: UserControl
    {
        public MyControl()
        {
            ByteList = new SerializableByteList();
        }
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public SerializableByteList ByteList { get; set; }
    }
    
    [Serializable]
    public class SerializableByteList
    {
        public SerializableByteList()
        {
            Bytes = new List<byte>();
        }
        public List<byte> Bytes { get; set; }
    }
    

    注意

    有关设计器序列化的更多信息,请查看Customizing Code Generation in the .NET Framework Visual Designers

      

    使用二进制序列化

         

    并非所有类型都能干净利落地进行代码生成。例如,如何将位图序列化为代码?你可以编码   它作为一个字符串,但即使是一个中等大小的位图字符串   可能比文件中的其余代码大得多。该   Designer通过将二进制类型持久化来解决此问题   资源文件,将值推送到.NET的清单中   框架应用。然后,当应用程序初始化时,它   可以将值加载回Assembly的清单中。

         

    在尝试序列化类型时,代码生成器遵循此顺序:

         
        
    • 内置基本类型的序列化(字符串,bool,整数,浮点数等)
    •   
    • 自定义类型的InstanceDescriptor序列化
    •   
    • 标记为Serializable的类型的二进制序列化。
    •   

    请记住,您可以控制设计器序列化的方式  通过为您的类实现ISerializable接口来实现对象。