广义设置UI +设置类

时间:2010-08-04 00:11:17

标签: c# inheritance user-interface user-controls settings

对于从基类I decided派生的更多类,可以为每个派生类创建一个基本UserControl和派生类(用于可视化;图像右侧的框)。

现在每个派生的UserControl都有一个特定的设置(左边的红色矩形)设置UI是一个单独的UserControl(可以自由移动,如果太大则放到单独的对话框中......)并且有一个底层数据类它更改(此类的实例是主UserControl的成员)。

alt text http://a.imageshack.us/img651/2710/46937664.png

这使我能够创建一个单独的类来保存(并可能保存)设置数据,将UserControl分开以设置值并将它们手动连接在一起。
这不是我第一次遇到类似问题所以我开始考虑一些类+接口,这使我可以轻松创建数据保持类并生成用户控件。我的想法就像是

class SettingsItem
{
    string name;
    TypeEnum type;
    double value;  //how about different types eg. bool? Inheritance?
}

设置类将是这些项的列表。对于每种类型,都会有一个值UserControl(checkbox / textbox / numericfield + description)。 foreach循环将创建最终的UserControl(一个值UCs彼此相对)。

一方面,我喜欢这个想法,这是一个有趣的挑战,可能会减少无聊,重复和耗时,将较小的方块放入较大的方块并对齐它们。另一方面,在我看来有点像用霰弹枪杀死苍蝇。

是否有一些标准/现成的解决方案?有更好的方法吗?或者它是解决小问题的过于复杂的解决方案?我很乐意看到任何答案,建议,评论......

1 个答案:

答案 0 :(得分:0)

首先,看看this主题,它可能会为您发现有趣的事情。

无论如何,根据您的问题,您可以为此目的使用序列化,如果由于某种原因您不想使用VS提供的 .settings 文件功能,以下是您如何转换和将您的项目转换为XML:

class Program
{
  static void Main(string[] args)
  {
    var setting = new SettingsItem
    {
      Name = "Setting1",
      Type = SettingTypes.UserSetting,
      Value = "setting"
    };

    XmlSerializer serializer = new XmlSerializer(typeof(SettingsItem));
    StringBuilder sb = new StringBuilder();
    using (StringWriter sr = new StringWriter(sb))
      serializer.Serialize(sr, setting);

    var serialized = sb.ToString();

    Console.WriteLine(serialized);

    SettingsItem item;
    using (var r = new StringReader(sb.ToString()))
      item = (SettingsItem)serializer.Deserialize(r);

    Console.WriteLine("Name: {0}, Type: {1}, Value: {2}", 
      item.Name, 
      item.Type, 
      item.Value);
    Console.ReadKey();
  }
}

[Serializable]
public class SettingsItem
{
  public string Name { get; set; }
  public SettingTypes Type { get; set; }
  public object Value { get; set; }
}

[Flags]
public enum SettingTypes
{
  ApplicationSetting = 1,
  UserSetting = 2,
  AdminOnly = 4,
  Temporary = 8
}

获得XML后,只需将其存储在ApplicationData文件夹或您想要的任何其他位置。