单声道无法保存用户设置

时间:2016-05-18 07:03:24

标签: c# mono settings

我在Mono(Ubuntu)上保存用户设置时遇到问题。这是代码示例:

private void Form1_Load(object sender, EventArgs e)
{
    string savedText = Properties.Settings.Default.tbText.ToString();
    tbInput.Text = savedText;
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    string textToSave = tbInput.Text;
    Properties.Settings.Default.tbText = textToSave;
    Properties.Settings.Default.tbText = Properties.Settings.Default.tbText;
    Properties.Settings.Default.Save();
}

但我只收到空配置,如

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <userSettings />
</configuration>

我已经尝试了像

这样的东西
Properties.Settings.Default.tbText = Properties.Settings.Default.tbText;
来自here

。但仍然得到相同的结果。如何在Mono中使用设置?

2 个答案:

答案 0 :(得分:0)

  1. 删除行

    Properties.Settings.Default.tbText = Properties.Settings.Default.tbText;
    
  2. 检查应用程序配置文件。可能你有这样的事情:

    <configuration>
      <configSections>
        <sectionGroup name="userSettings" 
                      type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
          <section name="ExampleApp.Properties.Settings" 
                   type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
      </configSections>
      ...
      <appSettings>
        <add key="TestKey1" value="Test1" />
        <add key="TestKey2" value="Test2" />
      </appSettings>
      ...
      <userSettings>
        <ExampleApp.Properties.Settings>
          <setting name="textBox1" serializeAs="String">
            <value />
          </setting>
        </ExampleApp.Properties.Settings>
      </userSettings>
    </configuration>
    

    删除 userSettings 的sectionGroup。

    <sectionGroup name="userSettings" 
                  type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <section name="ExampleApp.Properties.Settings" 
                 type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
    

    还删除 userSettings 部分。

    <userSettings>
      ...
    </userSettings>
    
  3. 删除您当地的 user.config 。首次运行后,它将被正确重建。

    应该有效

答案 1 :(得分:0)

我对此有疑问,PiKos的建议对我没有用。我的就是你发现的:

我的AppName.exe旁边有一个AppName.exe.config,其中的数据如下:

  <configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="AppName.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <userSettings>
    <AppName.Properties.Settings>
      <setting name="X" serializeAs="String">
        <value>0</value>
      </setting>
    </AppName.Properties.Settings>
  </userSettings>

我有一个~/.local/share/CompanyName/AppName_4309857324572934859834/user.config,实际上是空的:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <userSettings />
</configuration>

请注意,这个sectionGroup没有孩子,但是AppName.exe.config中的孩子有孩子

对我来说,解决方案是从<sectiongroup>中切出相关的<userSettings>及其子对象,并将AppName.exe.config剪切并粘贴到空的user.config


似乎单声道希望它们只在一个地方。如果它们位于appname.exe.cofnig中,您将得到一个空的user.config文件。如果它们在user.config中,则将在调用Save()时在那里对其进行更新。我认为,这样做的缺点是,如果user.config遭到损坏,则任何地方都没有任何默认设置(我尝试了PiKos的建议从AppName.exe.config中删除它们,还删除了user.config然后重新启动他的应用;使用所有设置名称创建了user.config,但所有值均为null)