using System.Windows.Forms; using System.Drawing; using System.ComponentModel; namespace Common { public class Theme { public delegate void ApplyThemeHandler(Component component); public static event ApplyThemeHandler OnApplyTheme; public static Color ColorWindow; public static Color ColorWindowText; public static Color ColorControl; public static Color ColorControlText; public static Color ColorControlSelected; public static bool Used; private static string _name; public static string Name { get => _name; set { _name = value; switch (value) { case "Dark": ColorWindow = Color.FromArgb(0x20, 0x20, 0x20); ColorWindowText = Color.White; ColorControl = Color.FromArgb(0x40, 0x40, 0x40); ColorControlText = Color.White; ColorControlSelected = Color.FromArgb(255, 96, 125, 155); break; case "Light": ColorWindow = Color.White; ColorWindowText = Color.Black; ColorControl = Color.FromArgb(0xe0, 0xe0, 0xe0); ColorControlText = Color.Black; ColorControlSelected = Color.FromArgb(255, 196, 225, 255); break; default: _name = "System"; ColorWindow = Color.FromKnownColor(KnownColor.Window); ColorWindowText = Color.FromKnownColor(KnownColor.WindowText); ColorControl = Color.FromKnownColor(KnownColor.Control); ColorControlText = Color.FromKnownColor(KnownColor.ControlText); ColorControlSelected = Color.FromArgb(255, 196, 225, 255); break; } } } static Theme() { Name = "System"; } public static Color AdjustColor(Color color) { if (color == Color.White) color = ColorWindow; else if (color == Color.Black) color = ColorWindowText; else { if (Name == "Dark") { // Exchange dark with light colors and vice versa if (color == Color.DarkBlue) color = Color.LightBlue; else if (color == Color.LightBlue) color = Color.DarkBlue; else if (color == Color.DarkGreen) color = Color.LightGreen; else if (color == Color.LightGreen) color = Color.DarkGreen; else if (color == Color.DarkRed) color = Color.LightCoral; else if (color == Color.LightCoral) color = Color.DarkRed; else if (color == Color.PowderBlue) color = Color.Navy; else if (color == Color.Navy) color = Color.PowderBlue; else if (color == Color.LightCyan) color = Color.DarkCyan; else if (color == Color.DarkCyan) color = Color.LightCyan; else if (color == Color.Cyan) color = Color.Teal; else if (color == Color.Teal) color = Color.Cyan; else if (color == Color.Yellow) color = Color.Brown; else if (color == Color.Brown) color = Color.Yellow; else if (color == Color.LightGray) color = Color.DarkGray; else if (color == Color.DarkGray) color = Color.LightGray; else if (color == Color.Orchid) color = Color.DarkOrchid; else if (color == Color.DarkOrchid) color = Color.Orchid; } } return color; } public static void ApplyTheme(Component component) { if (component is Control control) { foreach (Control child in control.Controls) { ApplyTheme(child); } if ((control is TextBox) || (control is NumericUpDown) || (control is ComboBox) || (control is RichTextBox) || (control is ListView)) { control.BackColor = ColorWindow; control.ForeColor = ColorWindowText; } else { control.BackColor = ColorControl; control.ForeColor = ColorControlText; } if (control.ContextMenuStrip != null) { ApplyTheme(control.ContextMenuStrip); } } if (component is SplitButton splitButton) { ApplyTheme(splitButton.Menu); } if ((component is Button button) && (Name == "System")) { button.UseVisualStyleBackColor = true; } else if (component is LinkLabel linkLabel) { linkLabel.LinkColor = ColorControlText; linkLabel.ActiveLinkColor = ColorControlText; linkLabel.VisitedLinkColor = ColorControlText; } else if (component is TabControl tabControl) { foreach (TabPage tabPage in tabControl.TabPages) { ApplyTheme(tabPage); } } else if (component is ToolStrip toolStrip) { toolStrip.RenderMode = ToolStripRenderMode.Professional; toolStrip.Renderer = new ToolStripProfessionalRenderer(new ThemeColorTable()); foreach (ToolStripItem item in toolStrip.Items) { if (item is ToolStripMenuItem toolStripMenuItem) { if (toolStripMenuItem.DropDownItems.Count > 0) { foreach (ToolStripItem dropDownItem in toolStripMenuItem.DropDownItems) { ApplyTheme(dropDownItem); } } } ApplyTheme(item); } } else if (component is ToolStripItem toolStripItem) { toolStripItem.ForeColor = ColorControlText; toolStripItem.BackColor = ColorControl; if (toolStripItem is ToolStripMenuItem toolStripMenuItem) { if (toolStripMenuItem.DropDownItems.Count > 0) { foreach (ToolStripItem dropDownItem in toolStripMenuItem.DropDownItems) { ApplyTheme(dropDownItem); } } } } else if (component is DataGridView dataGridView) { dataGridView.BackgroundColor = ColorWindow; dataGridView.DefaultCellStyle.BackColor = ColorWindow; dataGridView.DefaultCellStyle.ForeColor = ColorWindowText; dataGridView.ColumnHeadersDefaultCellStyle.BackColor = ColorWindow; dataGridView.ColumnHeadersDefaultCellStyle.ForeColor = ColorWindowText; } else if (component is RichTextBox richTextBox) { richTextBox.SelectAll(); richTextBox.SelectionColor = ColorWindowText; richTextBox.SelectionLength = 0; } else { OnApplyTheme?.Invoke(component); } } public static void UseTheme(Form form) { if (!Used && (_name == "System")) return; ApplyTheme(form); Used = true; } } public class ThemeColorTable : ProfessionalColorTable { public override Color MenuStripGradientBegin => Theme.ColorControl; public override Color MenuStripGradientEnd => Theme.ColorControl; public override Color ToolStripContentPanelGradientBegin => Theme.ColorControl; public override Color ToolStripContentPanelGradientEnd => Theme.ColorControl; public override Color ToolStripDropDownBackground => Theme.ColorControl; public override Color ToolStripGradientBegin => Theme.ColorControl; public override Color ToolStripGradientMiddle => Theme.ColorControl; public override Color ToolStripGradientEnd => Theme.ColorControl; public override Color MenuItemSelected => Theme.ColorControlSelected; public override Color MenuItemSelectedGradientBegin => Theme.ColorControlSelected; public override Color MenuItemSelectedGradientEnd => Theme.ColorControlSelected; public override Color ImageMarginGradientBegin => Theme.ColorControl; public override Color ImageMarginGradientMiddle => Theme.ColorControl; public override Color ImageMarginGradientEnd => Theme.ColorControl; public override Color MenuItemPressedGradientBegin => Theme.ColorControlSelected; public override Color MenuItemPressedGradientMiddle => Theme.ColorControlSelected; public override Color MenuItemPressedGradientEnd => Theme.ColorControlSelected; } }