C# 用户设置持久化指南

C#中,用户设置的加载和保存通常不如VB.NET中的My.Settings命名空间那样直观和方便。尽管如此,通过一些简单的步骤,仍然可以实现用户设置的持久化。本文将通过一个简单的Windows Forms程序示例来展示如何做到这一点。将创建应用程序窗口大小和位置的设置,并在程序的多次运行之间持久化这些设置。

步骤一:创建设置

创建设置的最简单方法是使用Visual Studio的设置设计器。要访问设计器,请打开项目的属性页面,并选择“设置”标签。在设置网格中,可以为应用程序设置应用范围或用户范围。应用设置适用于所有用户,并且在程序的每次运行之间不会改变。一旦在设计器中设置了应用设置,就无法在代码中更改。用户设置则可以改变,并且通常用于存储用户偏好,比如窗口大小和位置。

在设置网格中填写如下所示的设置:

// 此处应有设置网格的示例代码,但因格式限制,无法展示

请注意设置网格中的默认值。这些值是从窗体的属性中复制的。务必在“值”列中包含默认值!如果遗漏了,设计器代码将声明设置,但不会实例化它们,任何调用它们的代码都将抛出运行时异常。

步骤二:在运行时加载设置

在运行时加载设置的代码非常简单。设计器为创建了一个类来保存设置。这个类位于项目名下的Properties命名空间中。第一步是为此类添加一个using语句:

using UserSettingsDemo.Properties;

请注意Visual Studio代码编辑器可以自动为添加这个语句。如果没有添加这个语句,那么当第一次输入'Settings'时,代码编辑器会显示一个智能标签,可以自动输入using语句。

添加了using语句后,只需要在窗口的事件处理程序中添加几行代码。为目标窗口创建一个FormLoad事件处理程序,并添加以下代码:

private void FormMain_Load(object sender, EventArgs e) { // 设置窗口位置 if (Settings.Default.WindowLocation != null) { this.Location = Settings.Default.WindowLocation; } // 设置窗口大小 if (Settings.Default.WindowSize != null) { this.Size = Settings.Default.WindowSize; } }

代码非常直观。请注意在设计器为创建的Properties类中找到了设置。这个类可以为用户保存多组设置;需要的是Default设置。

步骤三:在运行时保存设置

保存设置几乎和加载设置一样简单。但是,在保存窗口大小时有一个小问题。将在下面的代码示例中看到这一点。

设置的持久化代码通常放置在目标窗口的FormClosing事件处理程序中。创建处理程序,并添加以下代码:

private void FormMain_FormClosing(object sender, FormClosingEventArgs e) { // 将窗口位置复制到应用设置 Settings.Default.WindowLocation = this.Location; // 将窗口大小复制到应用设置 if (this.WindowState == FormWindowState.Normal) { Settings.Default.WindowSize = this.Size; } else { Settings.Default.WindowSize = this.RestoreBounds.Size; } // 保存设置 Settings.Default.Save(); }

WindowLocation设置非常直观,但WindowSize属性有一个小问题。如果窗口是正常大小,可以像通常那样读取其大小属性。但如果窗口是最小化或最大化的,大小属性将返回一个不准确的值。因此,.NET提供了一个RestoreBounds属性,它将返回窗口在正常状态下的大小。但是,这里有一个转折——RestoreBounds属性只有在窗口最小化或最大化时才返回有效值。因此,必须测试WindowState属性,并根据结果调用Size或RestoreBounds属性。

请注意,必须调用Settings的Save()方法来将设置保存到配置文件中。而且配置文件不是Application.exe.config文件——只有应用设置保存在那里。用户设置保存在每个用户的不同设置文件中,这些文件存储在一个难以找到的位置。这个FAQ解释了如何找到设置文件,以防需要访问它。

数据绑定

许多设置可以从Visual Studio属性窗口进行数据绑定。例如,可以通过在ApplicationSettings属性中设置绑定来数据绑定窗体的位置属性(但不能绑定其大小属性)。

// 保存设置 Settings.Default.Save();
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485