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

Custom type not saving in application settings

我有 class 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)
    {
    }
}

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

但是当调用这个

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

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

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

我可以肯定地验证该值已分配给设置的 属性。否则程序根本无法运行。我还查看了调试器。

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

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

补充问题

如何为该自定义类型设置分配默认值? 输入 new FaceDetection.Model.CaptureResolution() 以异常结束。

您正在从 ApplicationSettingsBase 导出 CaptureResolution:

public class CaptureResolution: ApplicationSettingsBase

不要那样做。没有必要,而且这样做显然不行。

默认值

如果您单击其顶部的 "View Code" 按钮,设置设计器将创建一个 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; }
}

如果设置为空,这将创建一个默认值。您将必须删除使用设计器创建的设置。