【问题标题】:Retaining the changes made to the backcolor property保留对 backcolor 属性所做的更改
【发布时间】:2009-07-12 06:52:22
【问题描述】:

我正在开发一个 Windows 应用程序。

我有 3 种形式:

我想将所有 3 个表单的背景颜色更改为用户选择的颜色。

我使用了以下代码,我可以更改背景颜色,但是当我退出应用程序并重新启动它时,我无法获得用户设置的颜色。我只得到默认颜色。

是否可以保留用户选择的颜色,在用户重启应用时作为背景色使用。

代码

在表格 1 中

ColorDialog c1 = new ColorDialog();

   public static System.Drawing.Color bkc;
    private void button1_Click(object sender, EventArgs e)
    {

        DialogResult res = c1.ShowDialog();
        if (res == DialogResult.OK)
        {
            bkc = c1.Color;
            this.BackColor = bkc;


            MessageBox.Show(Convert.ToString(bkc));
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Form2 obj1 = new Form2();
        obj1.BackColor = bkc;
        obj1.Show();
    }

在表格 2 中 代码

    private void button2_Click(object sender, EventArgs e)
    {
        Form3 obj1 = new Form3();
        obj1.Show();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        this.BackColor = Form1.bkc;

    }

在 Form3 中 代码

    private void button2_Click(object sender, EventArgs e)
    {
        Form1 obj1 = new Form1();
        obj1.Show();
    }

    private void Form3_Load(object sender, EventArgs e)
    {
        //Form1 obj2 = new Form1();
        this.BackColor = Form1.bkc;
    }

在颜色对话框中,我正在选择一种颜色并按下确定按钮,颜色也发生了变化,但是当我重新启动应用程序时,我没有得到使用颜色对话框设置的颜色。我想保留此设置,以便每次执行应用程序时,用户无需重新设置即可获得所需的颜色。

以上代码不会产生任何错误。

谁能帮我完成这项任务?

提前致谢!

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    您需要将值保存在某处,例如 Application.exe.config:

        // Open App.Config of executable
        System.Configuration.Configuration config =
         ConfigurationManager.OpenExeConfiguration
                    (ConfigurationUserLevel.None);
    
        // Add an Application Setting.
        config.AppSettings.Settings.Add("BackgroundColour",
                       bkc + " ");
    
        // Save the changes in App.config file.
        config.Save(ConfigurationSaveMode.Modified);
    
        // Force a reload of a changed section.
        ConfigurationManager.RefreshSection("appSettings");
    

    这是一个 C# 完整代码示例:Using System.Configuration.ConfigurationManager Example

    【讨论】:

    • 老兄,你写这段代码的速度太快了,我必须说:)
    • 老实说,我是在 MSDN 上找到的!
    【解决方案2】:

    使用应用程序配置文件的建议很接近,但它有两个问题。

    首先,应用程序的所有用户共享同一个应用程序配置文件。如果您有多个用户(例如,在网络上,或同一台机器上的不同用户),将用户的首选项存储在应用程序配置文件中将更改所有用户的设置。第二个问题是,在 Vista 上的默认安装下,它无论如何都不会工作:默认情况下,Vista 不授予用户对 Program Files 目录下任何内容的写入权限,因此保存对应用程序配置文件的更改会抛出异常。

    正确的答案是使用用户设置。这些存储在应用程序的用户设置文件中,该文件位于用户主目录的(深度嵌套和操作系统版本相关的)子目录中。 ConfigurationManager 在运行时加载这些设置,并允许您在代码中更新和保存它们。 Visual Studio 中内置了一个完整的基础结构,使这(相对)容易,这很好,因为正确地执行它涉及针对ConfigurationManager 类编写大量的代码。以下是它的工作原理:

    如果您在 VS 项目的属性下查看,您会看到一个名为 Settings.settings 的项目。当您双击它时,它将显示一个网格,可让您将设置添加到项目中。您提供设置名称,选择其数据类型和默认值,以及最重要的范围。该设置可以是应用程序范围,在这种情况下,它的值将对应用程序的所有用户通用并存储在应用程序配置文件中。或者它可以是用户范围,在这种情况下,每个用户都可以有自己的设置值,并且设置将存在于用户设置文件中。

    当您向此网格添加设置时,VS 会生成代码以使该设置可用于您的代码。基本上,它创建了一个类,将这些设置作为单例对象的属性公开给您的代码。 (如果您想了解这是什么让您不必自己动手,您可以查看此代码;它存储在项目视图的“Settings.settings”下创建的“Settings.Designer.cs”文件中。 ) 每次更改“设置”网格中的信息时,它还会方便地重新生成此类。在设置网格中创建设置后,您可以在代码中引用它:

    ctl.BackColor = Properties.Settings.Default.BackColor;
    

    您的代码可以修改用户设置:

    Properties.Settings.Default.BackColor = newBackColor;
    

    您可以像这样将它们保存到用户设置文件中:

    Properties.Settings.Default.Save();
    

    将这些设置作为类的属性公开很有用,原因有很多。其中最重要的一点是,由于它们是属性(而不是通过键访问的字典条目,这是人们针对 ConfigurationManager 类编写的大多数代码的工作方式),因此会在编译时检查名称你在代码中使用。如果您拼错设置的名称,您将永远不会在运行时获得NullReferenceException;编译时会报错。

    使用用户设置有一些微妙之处。一个不太明显的问题是:当您制作软件的新版本时会发生什么?用户设置存储在与程序版本号相关的目录中;如果您发布一个新版本,它的用户设置文件将不存在。您如何防止用户在升级您的程序时丢失所有设置?

    这也内置于 Settings 类中;您需要做的就是:

    if (Properties.Settings.Default.UpgradeSettings)
    {
       Properties.Settings.Default.Upgrade();
       Properties.Settings.Default.UpgradeSettings = false;
    }
    

    这会将用户的设置从先前版本复制到新版本的设置文件中。

    【讨论】:

      【解决方案3】:

      为什么不创建一个所有三种形式都听的事件并让它们在听“改变颜色”事件时改变背景颜色?您可以将颜色存储在静态变量中,以便在加载表单时,可以将背景颜色设置为存储在变量中的颜色。

      为了让屏幕记住颜色设置,为什么不将选择的颜色存储在用户首选项文件中?尝试使用“IsolatedStorage”功能保存首选项文件。

      【讨论】:

      【解决方案4】:

      你做错了。

      应用程序如何记住用户选择的背景色?
      该应用程序在内存中运行并显示选择的背景颜色,直到其终止。

      继续阅读this 并继续前进。

      编辑:另外,在 Form2 中使用 Form1.BackColor 也是不对的。
      打开 Form1,更改背景颜色,关闭 Form1 并打开 Form2 看看会发生什么(您可能会看到 Form1 再次打开)。

      【讨论】:

      • 应用程序设置架构不是非常最不熟悉用户设置理念的开发人员应该关注的地方,但它已经接近了。
      • 我对设置文件了解不多。有没有其他办法?
      猜你喜欢
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      相关资源
      最近更新 更多