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

5

我有如下类:

[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仍然为空。保存似乎没有生效。我在另一篇帖子中读到,这个类必须是公共的,而且它确实是公共的。有什么想法为什么这不起作用?

你什么时候加载数据?那段代码是什么样子的? - Michael Todd
设置会通过 .Net 框架自动加载。 - Kyle
3个回答

10

它不起作用是因为Color和Font不支持xml序列化。 更甚的是,Font没有无参数构造函数,所以Settings.Save()无法序列化您的对象,并且不保存任何内容。

不幸的是,默认情况下,在类SettingsBase下的基础架构下(您的Settings类继承自此类-请参见Settings.Designer.cs文件中的自动生成代码),不会在序列化错误上引发异常,因此您无法看到问题。

从您的类中删除Font和Color属性,然后重试。

另一个解决方案

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


谢谢您的帮助,我在字体和颜色选项中添加了[XmlIgnore],并使用了来自以下网址的一些序列化代码:http://devblog.antongochev.net/2008/06/26/serializedeserialize-a-font-tofrom-xml/,使其正常工作。 - Kyle
1
SettingsSerializeAs.Binary 运作良好,但我发现如果使用设计器添加新设置,则需要再次添加该属性。 - Daniel Ballinger

2

1
  • 请注意,如果您进行完整的重新编译,则应用程序会在另一个文件夹中查找设置,并且当然找不到任何设置并创建新的默认设置。
  • 当您保存数据时,没有抛出任何异常吗?
  • 如果您在TextData构造函数中插入断点,它会在应用程序加载时被调用吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接