保留对backcolor属性所做的更改

时间:2009-07-12 06:52:22

标签: c# winforms

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

我有3种形式:

我想将所有3种形式的背景颜色更改为用户选择的颜色。

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

当用户重新启动应用程序时,是否可以保留用户选择的颜色并将其用作背景颜色。

CODE

在Form1中

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 CODE

    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中 CODE

    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;
    }

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

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

任何人都可以帮我完成这项任务吗?

提前致谢!

4 个答案:

答案 0 :(得分:3)

您需要将值保存在某个位置,例如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

答案 1 :(得分:1)

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

首先,应用程序的所有用户共享相同的应用程序配置文件。如果您有多个用户(在网络上,比如说,或同一台计算机上的不同用户),则在应用程序配置文件中存储用户的首选项将更改所有用户的设置。第二个问题是,在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;
}

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

你做错了。

应用程序将如何记住用户选择背景色?
该应用程序在内存和运行中运行显示选择背光直到它终止。

继续阅读this&把它推进去。

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