C#自定义用户设置类未保存

时间:2009-09-24 22:42:38

标签: c# settings

我有以下课程:

[Serializable]
[XmlRoot ( ElementName = "TextData", IsNullable = false)]
public class TextData
{
    private System.Drawing.Font fontColor;

    [XmlAttribute ( AttributeName = "Font" )]
    public System.Drawing.Font Font { get; set; }

    [XmlAttribute ( AttributeName = "FontColor" )]
    public System.Drawing.Color FontColor { get; set; }

    [XmlAttribute ( AttributeName = "Text" )]
    public string Text { get; set; }

    public TextData ( )
    {
    } // End of TextData
} // End of TextData

我试图用以下代码保存它:

    // Create our font dialog
    FontDialog fontDialog = new FontDialog ( );
    fontDialog.ShowColor = true;

    // Display the dialog and check for an ok
    if ( DialogResult.OK == fontDialog.ShowDialog ( ) )
    {
        // Save our changes for the font settings
        if ( null == Properties.Settings.Default.MainHeadlineTextData )
        {
            Properties.Settings.Default.MainHeadlineTextData = new TextData ( );
        }
        Properties.Settings.Default.MainHeadlineTextData.Font = fontDialog.Font;
        Properties.Settings.Default.MainHeadlineTextData.FontColor = fontDialog.Color;
        Properties.Settings.Default.Save ( );
    }

每次加载应用程序时,Properties.Settings.Default.MainHeadlineTextData仍然为null。保存似乎没有生效。我在另一篇文章中读到该课程必须是公开的。任何想法为什么这不能正常工作?

3 个答案:

答案 0 :(得分:10)

它不起作用,因为Color和Font不是xml可序列化的。 更重要的是,Font没有无参数构造函数,因此 Settings.Save()无法序列化您的对象,也不会保存任何内容。

不幸的是,默认基础设施 SettingsBase (继承设置类) - 请参阅 Settings.Designer.cs中的自动生成代码 file)不会在序列化错误上抛出异常,因此您无法看到问题。

从班级中删除字体和颜色属性,然后重试。

另一种解决方案

另一种解决方案是使用二进制序列化。 打开 Settings.Designer.cs 文件,并将属性[SettingsSerializeAs(SettingsSerializeAs.Binary)]添加到属性 Settings.MainHeadlineTextData

答案 1 :(得分:2)

要将类保存到应用程序设置配置文件,该类必须支持TypeConverter或者是XMLSerializable。

您的代码没有为您的自定义类实现TypeConverter,并且Color和Font类不是XMLSerialiable。

如何实现类型转换器: http://msdn.microsoft.com/en-us/library/ayybcxe5%28VS.80%29.aspx

答案 2 :(得分:1)

  • 请注意,如果您执行完全重新编译,应用程序将在内部获取一个新版本,以便它在另一个文件夹中查找设置 - 当然会找不到并创建一个新的默认版本。
  • 保存数据时,不会抛出异常吗?
  • 如果在TextData构造函数中插入断点,是否在应用程序加载时调用它?