好的,我觉得你把WPF当作老式的WinForms应用程序来处理。您不再需要监视表单事件以从表单属性中检索信息。大多数WPF控件属性都是一种称为Dependency Property的东西。
依赖属性引入的一些聪明技巧包括Data Binding。
如果您考虑使用MVVM Architecture编写应用程序,您将很快能够自己解决以下问题... =)
在 View
*1 中,您可以创建依赖属性或标准属性并实现
INotifyPropertyChanged,这些属性保存大小、布局、位置等。然后将表单的属性(在 xaml 或代码中)绑定到 View 的属性上。通过简单地调整视图中属性的 Get/Set,您可以为存储/检索默认值实现任何功能,并在表单更改时自动更新。以下是 Windows 标题的快速示例:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="{Binding Path=DisplayName}"
WindowStartupLocation="CenterScreen" >
<Grid>...</Grid>
</Window>
视图的一个实现示例:
public class SampleView : System.ComponentModel.INotifyPropertyChanged
{
public event PropertyChangedEventHandler System.ComponentModel.INotifyPropertyChanged.PropertyChanged;
public delegate void PropertyChangedEventHandler(object sender, System.ComponentModel.PropertyChangedEventArgs e);
private string _Title;
public string Title {
get {
if (_Title == null) {
_Title = My.Settings.MainWindowTitle;
}
return _Title;
}
set {
_Title = value;
if (!(_Title == My.Settings.MainWindowTitle)) {
if (PropertyChanged != null) {
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("Title"));
}
My.Settings.MainWindowTitle = Title;
My.Settings.Save();
}
}
}
}
编辑:关于最佳存储用户偏好的方式,我不建议使用注册表,尽管这并不罕见。现在的注册表已经充满了各种设置,在我看来,注册表并不是真正设计用来存储这些设置的。考虑使用应用程序设置设置为用户范围。这将处理大多数数据存储/检索的细节,并为您提供一个良好的类型安全接口。
*1我个人更喜欢尝试将所有内容都绑定到ViewModel,并且几乎完全使用无脑视图;尽管我知道有很多有效的情况需要视图具有代码。我不认为大小/布局等实际上是业务逻辑问题,也不是我目前关注的事情,因此这应该在视图本身中处理。
编辑2-用户/应用程序范围设置的快速示例:
这是我添加到项目中的设置的快速图片:
![Settings screenshot](https://istack.dev59.com/neKMg.webp)
下面的代码尝试同时使用应用程序和用户范围的设置。
注意:
在运行时,应用程序范围设置是只读的。
public class SettingsExample
{
private Form1 frmMain = new Form1();
public void Main()
{
frmMain.BackColor = My.Settings.DefaultBackColour;
}
public void UserLoggedIn()
{
frmMain.BackColor = My.Settings.UserBackcolour;
}
public void UpdateUserBackcolour(System.Drawing.Color newColour)
{
My.Settings.UserBackcolour = newColour;
My.Settings.Save();
}
public void UpdateDefaultBackcolour(System.Drawing.Color newColour)
{
My.Settings.DefaultBackColour = newColour;
}
}