WPF设置中的默认值为“Directory.GetCurrentDirectory”

时间:2018-01-26 13:38:21

标签: c# wpf

最近,我一直在研究WPF应用程序,并且我一直在为项目添加用户设置。对于其中一个设置SaveDir,我需要将默认值作为方法System.IO.Directory.GetCurrentDirectory()的返回字符串。

SaveDir in Visual Studio designer

我看了一下visual studio中设计师背后的代码,发现了这个:

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string SaveDir {
    get {
        return ((string)(this["SaveDir"]));
    }
    set {
        this["SaveDir"] = value;
    }
}

我尝试将System.Configuration.DefaultSettingValueAttribute中的引号删除到方法System.IO.Directory.GetCurrentDirectory(),但这引发了以下错误:

  

属性参数必须是属性参数类型

的常量表达式,typeof表达式或数组创建表达式

如何将此设置的默认值设置为应用程序的当前目录?

当应用程序启动时,我更新如下设置:

Settings.Default.SaveDir = 
Directory.Exists(Settings.Default.SaveDir)
    ? Settings.Default.SaveDir
    : Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

当用户重置所有设置时,这会给我一些问题。我想知道是否有更有效的方法来做到这一点。

3 个答案:

答案 0 :(得分:0)

一种可能的解决方案是创建一个包装用户可以更改的配置属性的类,并添加一些空值或空值的控件。

这将允许您在需要时创建属性并返回默认值:

public class MyAppSettings
{
    public string SaveDir
    { 
        get
        {
            if(Properties.Settings.Default.SaveDir.Equals(String.Empty))
            {
                return Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            }
            return Properties.Settings.Default.SaveDir;
        }
   }
}

更改或修改自动生成的代码可能会有一点风险,因为您冒着IDE意外更改它的风险。

我希望这会有所帮助。

答案 1 :(得分:0)

您似乎尝试将默认值设置为错误的属性名称DefaultSaveDir,它应该是' SaveDir'

Settings.Default.SaveDir = 
Directory.Exists(Settings.Default.SaveDir)
    ? Settings.Default.SaveDir
    : Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

Settings.Default.Save() //<-- call save to keep the default value

<强>更新

可能是您可以挂钩此事件,重置默认值

    Settings.Default.PropertyChanged += (o, e1) =>
    {
        Console.WriteLine(e1.PropertyName);
    };

希望它有所帮助。

答案 2 :(得分:0)

实际上它不会起作用。您无法将设置SaveDir的值设置为Directory.GetCurrentDirectory()

然而,有几种方法可以解决这个问题。当您致电Settings.Default.Reset()时,您可以使用相同的方法重新运行设置SaveDir值的代码。

void ResetMySettings
{
    // Method where settings are reset
    Properties.Settings.Default.Reset();

    // Set value of SaveDir
    CheckSaveDirValue();
}

...

private void CheckSaveDirValue()
{
    Settings.Default.SaveDir = 
        Directory.Exists(Settings.Default.SaveDir)
        ? Settings.Default.SaveDir
        : Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
}

然而,这不是一个好主意。您不希望让最终用户使用应用程序目录,如果他们意外删除了.dll文件会怎样?

最好的办法是创建另一个应用程序目录,用于存储所有用户的文件。