应用范围广泛的设
快速阅读大多数开发人员网站都会发现 WinForms 被认为不如 WPF。最常被引用的原因之一是假设难以对整个应用程序的外观进行应用程序的广泛更改。
实际上,如果你只是避免使用标准控件并从中获取自己的标准控件,那么在 WinForms 中生成一个可以在设计时和运行时轻松配置的应用程序非常容易。
以 TextBox 为例。很难想象一个 Windows 应用程序不会在某个阶段或其他阶段要求使用 TextBox。因此,拥有自己的 TextBox 总是有意义的。采用以下示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace StackOverflowDocumentation
{
public class SOTextBox : TextBox
{
public SOTextBox() : base()
{
base.BackColor = SOUserPreferences.BackColor;
base.ForeColor = SOUserPreferences.ForeColor;
}
protected override void OnEnter(EventArgs e)
{
base.BackColor = SOUserPreferences.FocusColor;
base.OnEnter(e);
}
protected override void OnLeave(EventArgs e)
{
base.BackColor = SOUserPreferences.BackColor;
base.OnLeave(e);
}
}
}
用户在数据输入表单中找到最有用的东西之一,有许多输入框,是具有焦点变化的框的背景颜色。显然比标准闪烁的垂直光标更容易看到。上面的代码提供了一个完全正确的 TextBox。
在此过程中,它使用静态类的静态属性。我在下面给出了我的摘录:
using System;
using System.Threading;
using Microsoft.Win32;
using System.Globalization;
using System.Data;
using System.Drawing;
namespace StackOverflowDocumentation
{
public class SOUserPreferences
{
private static string language;
private static string logPath;
private static int formBackCol;
private static int formForeCol;
private static int backCol;
private static int foreCol;
private static int focusCol;
static SOUserPreferences()
{
try
{
RegistryKey HKCU = Registry.CurrentUser;
RegistryKey kSOPrefs = HKCU.OpenSubKey("SOPrefs");
if (kSOPrefs != null)
{
language = kSOPrefs.GetValue("Language", "EN").ToString();
logPath = kSOPrefs.GetValue("LogPath", "c:\\windows\\logs\\").ToString();
formForeCol = int.Parse(kSOPrefs.GetValue("FormForeColor", "-2147483630").ToString());
formBackCol = int.Parse(kSOPrefs.GetValue("FormBackColor", "-2147483633").ToString());
foreCol = int.Parse(kSOPrefs.GetValue("ForeColor", "-2147483640").ToString());
backCol = int.Parse(kSOPrefs.GetValue("BackColor", "-2147483643").ToString());
focusCol = int.Parse(kSOPrefs.GetValue("FocusColor", "-2147483643").ToString());
}
else
{
language = "EN";
logPath = "c:\\windows\\logs\\";
formForeCol = -2147483630;
formBackCol = -2147483633;
foreCol = -2147483640;
backCol = -2147483643;
focusCol = -2147483643;
}
}
catch (Exception ex)
{
//handle exception here;
}
}
public static string Language
{
get
{
return language;
}
set
{
language = value;
}
}
public static string LogPath
{
get
{
return logPath;
}
set
{
logPath = value;
}
}
public static Color FormBackColor
{
get
{
return ColorTranslator.FromOle(formBackCol);
}
set
{
formBackCol = ColorTranslator.ToOle(value);
}
}
public static Color FormForeColor
{
get
{
return ColorTranslator.FromOle(formForeCol);
}
set
{
formForeCol = ColorTranslator.ToOle(value);
}
}
public static Color BackColor
{
get
{
return ColorTranslator.FromOle(backCol);
}
set
{
backCol = ColorTranslator.ToOle(value);
}
}
public static Color ForeColor
{
get
{
return ColorTranslator.FromOle(foreCol);
}
set
{
foreCol = ColorTranslator.ToOle(value);
}
}
public static Color FocusColor
{
get
{
return ColorTranslator.FromOle(focusCol);
}
set
{
focusCol = ColorTranslator.ToOle(value);
}
}
}
}
此类使用 Windows 注册表来保留属性,但如果你愿意,可以使用数据库或设置文件。以这种方式使用静态类的优点是不仅可以在设计时进行应用程序范围的更改,而且可以在运行时由用户进行。我总是在我的应用程序中包含一个表单,允许用户更改首选值。save 函数不仅保存到 Registry(或数据库等),而且还在运行时更改静态类中的属性。请注意,静态类的静态属性不是常量; 从这个意义上讲,它们可能被视为应用程序的变量。这意味着在保存更改后打开的任何表单将立即受到保存的任何更改的影响。
你可以轻松地想到你希望以相同方式配置的其他应用程序范围的属性。字体是另一个非常好的例子。