【问题标题】:Custom type not saving in application settings自定义类型未保存在应用程序设置中
【发布时间】:2016-07-08 20:14:25
【问题描述】:

我有一个类 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>

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

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

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

其他问题

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

【问题讨论】:

    标签: c# application-settings


    【解决方案1】:

    您从ApplicationSettingsBase 派生CaptureResolution

    public class CaptureResolution: ApplicationSettingsBase
    

    不要那样做。没必要这样做,而且这样做显然是行不通的。

    默认值

    如果您点击顶部的“查看代码”按钮,设置设计器将创建一个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; }
    }
    

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

    【讨论】:

    • 谢谢。像魅力一样工作。
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 2012-10-13
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2015-05-22
    相关资源
    最近更新 更多