完全可定制的菜单栏、工具栏、上下文菜单栏和状态栏






4.81/5 (19投票s)
更改设计时用于渲染菜单栏、工具栏、上下文菜单栏和状态栏控件的颜色。
引言
正如您可能知道也可能不知道的,MenuStrip
、ToolStrip
、ContextMenuStrip
和 StatusStrip
控件(以下简称“Strips”或“Strip 控件”)在很大程度上是可定制的。它们使用 ToolStrip(Professional)Renderer
类来渲染自身,并且可以继承该类并重写其绘制行为。当然,这需要付出一些努力,因为您基本上是在手动编写绘制代码。
如果您只想更改任何 Strip 控件的*颜色*,但保留所有元素的形状(例如矩形按钮等),那么有一个更快的方法。ToolStripProfessionalRenderer
的构造函数接受一个 ProfessionalColorTable
,它就像 Strip 控件的主题。当提供 ProfessionalColorTable
时,ToolStripProfessionalRenderer
会使用 ProfessionalColorTable
中指定的颜色进行绘制。
虽然这是自定义 Strip 控件的一种更快的方法,但它仍然需要您编写代码(继承 ProfessionalColorTable
类并重写所有颜色属性,返回您自己的值)。这些控件的设计宗旨是让您可以在 Visual Studio 设计器中非常轻松地自定义任何 Strip 控件的颜色,而无需编写一行代码。
此外,您可以将更改的颜色保存在一个组件中,并供任意数量的 Strip 控件重复使用。因此,如果您需要 MenuStrip
和 ToolStrip
看起来一样,您就不需要单独更改它们的颜色。您只需更改此组件的颜色,它们就会使用相同的颜色。
另外,您的自定义颜色定义可以保存到 XML 文件中,也可以从 XML 文件中加载,因此您甚至可以将它们分发给朋友或同事。
最后,有 6 种预设可用,您只需从列表中选择即可。颜色将被设置为模仿以下样式:
- Office 2007 (蓝色)
- Office 2003 蓝色(默认 Windows XP 风格,蓝色主题)
- Office 2003 银色(默认 Windows XP 风格,银色主题)
- Office 2003 橄榄绿(默认 Windows XP 风格,橄榄绿主题)
- Office XP(默认 Windows Vista / Windows 7 风格)
- Office Classic(经典主题的默认风格)
正如您所见,Windows XP 的三种默认样式也包含在内,因此您甚至可以在具有蓝色主题的 Windows XP 环境中使用银色主题。
背景
我将此项目作为我自己的一个项目。我认为 .NET Framework 提供了自定义 Strip 控件的功能,但却没有提供给普通用户(例如,以属性的形式)。我最初从一个简单的 MenuStrip
控件开始,它通过属性提供颜色,但由于属性太多,属性列表变得非常长且难以管理。当您希望 ToolStrip
看起来与 MenuStrip
一样时,您必须第二次设置颜色,这也是一个问题。或者,如果您需要更多的 Strip 控件,则需要设置更多次。总之:它仍然不实用。
有了这些控件,您只需一次性设置好颜色,通过简单的类别中的属性进行设置,然后就可以将该主题应用于任何您喜欢的 Strip 控件。
使用代码
您无需编写一行代码即可使用这些控件。所需的操作如下:
- 构建包含这些文件的项目。
- 将一个
AppearanceControl
(构建后可在工具箱中找到)拖到您的窗体上。 - 将一个或多个 Strip 控件(构建后可在工具箱中找到)拖到您的窗体上。
- 将 Strip 控件的
Appearance
属性设置为窗体上的AppearanceControl
组件(在属性网格中使用下拉列表)。 - 探索
AppearanceControl
的属性。使用Preset
属性设置预设主题,或使用CustomAppearance
属性手动更改颜色。 - 在弹出的外观编辑器窗口中,找到您需要的颜色属性并进行更改。在预览的 Strips 中即时查看结果。
注意:要使 Strips 使用 CustomAppearance
中定义的颜色,必须将 Preset
属性设置为 Custom
。
关注点
它是如何工作的?
AppearanceControl
组件在内部使用继承自 ProfessionalColorTable
的类的实例。它不是返回硬编码的值,而是返回 CustomAppearance
属性中设置的颜色。
Public Class CustomColorTable _
Inherits ProfessionalColorTable
Private ac As AppearanceControl = Nothing
Public Sub New(ByVal appearanceControl As AppearanceControl)
ac = appearanceControl
End Sub
Overrides ReadOnly Property ButtonSelectedHighlight() As Color
Get
Return ac.CustomAppearance.ButtonAppearance.SelectedAppearance.Highlight
End Get
End Property
Overrides ReadOnly Property ButtonSelectedHighlightBorder() As Color
Get
Return ac.CustomAppearance.ButtonAppearance.SelectedAppearance.BorderHighlight
End Get
End Property
'...
End Class
除了这个 CustomColorTable
类之外,每种预设都有一个 ColorTable
,它*确实*使用硬编码的颜色值。
AppearanceControl
公开了一个 ToolStripProfessionalRenderer
,其 ColorTable
设置为内部颜色表类之一。
最后,Strip 控件(CustomizableMenuStrip
、CustomizableToolStrip
、CustomizableContextMenuStrip
和 CustomizableStatusStrip
)会监听其 AppearanceControl
的变化。当设置 Appearance
属性时,它们会将渲染器从默认渲染器更改为 AppearanceControl
公开的 Renderer
属性。
Protected Overridable Sub OnAppearanceControlChanged(ByVal e As EventArgs)
If Me.Appearance IsNot Nothing Then
AddHandler Me.Appearance.AppearanceChanged, _
AddressOf AppearanceControl_AppearanceChanged
AddHandler Me.Appearance.Disposed, _
AddressOf AppearanceControl_Disposed
Me.Renderer = Me.Appearance.Renderer
Else
Me.Renderer = New ToolStripProfessionalRenderer()
End If
Me.Invalidate()
RaiseEvent AppearanceControlChanged(Me, e)
End Sub