應用範圍廣泛的設

快速閱讀大多數開發人員網站都會發現 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(或資料庫等),而且還在執行時更改靜態類中的屬性。請注意,靜態類的靜態屬性不是常量; 從這個意義上講,它們可能被視為應用程式的變數。這意味著在儲存更改後開啟的任何表單將立即受到儲存的任何更改的影響。

你可以輕鬆地想到你希望以相同方式配置的其他應用程式範圍的屬性。字型是另一個非常好的例子。