应用程序设置中不保存自定义类型

时间:2016-07-08 20:14:25

标签: c# application-settings

我有一个类CaptureResolution表示摄像头捕获的分辨率:

[Serializable]
[SettingsSerializeAs(SettingsSerializeAs.Xml)]
[XmlRoot (ElementName = "CaptureResolution", IsNullable = false)]
public class CaptureResolution: ApplicationSettingsBase
{
    [UserScopedSetting]
    [SettingsSerializeAs(SettingsSerializeAs.Xml)]
    [XmlAttribute (AttributeName = "Width")]
    public int Width { get; set; }

    [UserScopedSetting]
    [SettingsSerializeAs(SettingsSerializeAs.Xml)]
    [XmlAttribute(AttributeName = "Height")]
    public int Height { get; set; }

    public CaptureResolution(int width, int height)
    {
        Width = width;
        Height = height;
    }

    public CaptureResolution(): this(1024, 720)
    {
    }
}

我在设置设计器中添加了一个具有给定类型的设置:

enter image description here

然而,在调用此

Properties.Settings.Default.ResolutionSelection = new CaptureResolution(1920, 1080);
Properties.Settings.Default.Save();

该设置未保存在用户设置文件中:

<setting name="ResolutionSelection" serializeAs="Xml">
    <value />
</setting>

我确定可以验证该值是否已分配给该设置的属性。否则该程序根本不起作用。我也看了调试器。

此外,我已经在互联网上搜索了合适的解决方案,但最终它并没有真正帮助。保存其他设置没有任何问题。

Afaik设置设计器需要一个可以序列化为XML的类和一个可公开访问的默认无参数构造函数。我做了两个,所以我想知道它为什么没有按预期工作。

其他问题

如何为此自定义类型设置指定默认值? 输入new FaceDetection.Model.CaptureResolution()最终会出现异常。

1 个答案:

答案 0 :(得分:1)

您从CaptureResolution

派生ApplicationSettingsBase
public class CaptureResolution: ApplicationSettingsBase
不要这样做。没有必要这样做,这样做显然不起作用。

默认值

如果您点击&#34;查看代码&#34;设置desinger将创建Settings.cs。顶部的按钮。在此Settings.cs文件中,您可以添加自己的代码,也可以手动创建应用程序设置,例如类似的东西:

[UserScopedSetting]
public CaptureResolution ResolutionSelection
{
  get
  {
    var value = (CaptureResolution)this[nameof(ResolutionSelection)];
    if (value == null)
    {
      value = new CaptureResolution(1, 2);  // decent default value
      this[nameof(ResolutionSelection)] = value;
    }
    return value;
  }
  set { this[nameof(ResolutionSelection)] = value; }
}

这将创建一个默认值,设置为null。您必须删除使用desinger创建的设置。