我知道如何使用默认按钮项,但是有什么方法可以实现多行按钮的样式(或者更确切地说,“可点击文本”?),如下所示?
情况是我有一个界面供用户选择他希望建立什么样的文件,并且在较大的主文本行下必须有一个简短的描述。
我只打算在 Windows 7 上运行它,所以我不需要担心与旧版本 Windows 的向后兼容性
屏幕截图中显示的按钮实际上是整个 Aero UI 中使用的按钮。它是一种自定义样式的按钮,称为“命令链接”,可以轻松应用于标准Button
控件。
不幸的是,WinForms 库并没有通过一个简单的属性公开这个功能,但是通过一点 P/Invoke 很容易解决这个问题。
您要查找的样式称为BS_COMMANDLINK
. 根据文档,这种风格:
创建一个行为类似于
BS_PUSHBUTTON
样式按钮的命令链接按钮,但命令链接按钮左侧有一个绿色箭头,指向按钮文本。可以通过向按钮发送BCM_SETNOTE
消息来设置按钮文本的标题。
这是一个小自定义按钮控件类,它扩展了标准 WinFormsButton
控件,并将“命令链接”样式实现为您可以在设计器中或通过代码配置的属性。
关于代码有几点需要注意:
该FlatStyle
属性必须始终设置为FlatStyle.System
,这会强制使用标准的 Windows API 按钮控件,而不是由 WinForms 代码绘制的控件。这是BS_COMMANDLINK
样式工作所必需的(因为它仅受本机控件支持),并且无论如何它都会产生更好看的按钮控件(具有跳动效果等)。为了强制执行此操作,我重写了该FlatStyle
属性并设置了默认值。
该CommandLink
属性是您打开和关闭“命令链接”样式的方式。默认情况下它是关闭的,为您提供标准按钮控件,因此您可以将应用程序中的所有按钮控件替换为此控件,如果您愿意,只是为了方便。当您打开该属性(将其设置为True
)时,您会得到一个精美的多行命令链接按钮。
命令链接按钮的标题与标准按钮上显示的标题相同。但是,标题按钮也支持第二行的“描述”。CommandLinkNote
这可以通过WinAPI 消息之后称为 的另一个属性进行配置BCM_SETNOTE
。当您将按钮配置为标准按钮控件 ( CommandLink = False
) 时,此属性的值将被忽略。
Imports System.Windows.Forms
Imports System.ComponentModel
Imports System.Runtime.InteropServices
Public Class ButtonEx : Inherits Button
Private _commandLink As Boolean
Private _commandLinkNote As String
Public Sub New() : MyBase.New()
'Set default property values on the base class to avoid the Obsolete warning
MyBase.FlatStyle = FlatStyle.System
End Sub
<Category("Appearance")> _
<DefaultValue(False)> _
<Description("Specifies this button should use the command link style. " & _
"(Only applies under Windows Vista and later.)")> _
Public Property CommandLink As Boolean
Get
Return _commandLink
End Get
Set(ByVal value As Boolean)
If _commandLink <> value Then
_commandLink = value
Me.UpdateCommandLink()
End If
End Set
End Property
<Category("Appearance")> _
<DefaultValue("")> _
<Description("Sets the description text for a command link button. " & _
"(Only applies under Windows Vista and later.)")> _
Public Property CommandLinkNote As String
Get
Return _commandLinkNote
End Get
Set(value As String)
If _commandLinkNote <> value Then
_commandLinkNote = value
Me.UpdateCommandLink()
End If
End Set
End Property
<Browsable(False)> <EditorBrowsable(EditorBrowsableState.Never)> _
<DebuggerBrowsable(DebuggerBrowsableState.Never)> _
<Obsolete("This property is not supported on the ButtonEx control.")> _
<DefaultValue(GetType(FlatStyle), "System")> _
Public Shadows Property FlatStyle As FlatStyle
'Set the default flat style to "System", and hide this property because
'none of the custom properties will work without it set to "System"
Get
Return MyBase.FlatStyle
End Get
Set(ByVal value As FlatStyle)
MyBase.FlatStyle = value
End Set
End Property
#Region "P/Invoke Stuff"
Private Const BS_COMMANDLINK As Integer = &HE
Private Const BCM_SETNOTE As Integer = &H1609
<DllImport("user32.dll", CharSet:=CharSet.Unicode, SetLastError:=False)> _
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, _
<MarshalAs(UnmanagedType.LPWStr)> ByVal lParam As String) As IntPtr
End Function
Private Sub UpdateCommandLink()
Me.RecreateHandle()
SendMessage(Me.Handle, BCM_SETNOTE, IntPtr.Zero, _commandLinkNote)
End Sub
Protected Overrides ReadOnly Property CreateParams As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
If Me.CommandLink Then
cp.Style = cp.Style Or BS_COMMANDLINK
End If
Return cp
End Get
End Property
#End Region
End Class
不幸的是,接受的答案有错误,请改用我的库VistaUIFramework
,它包含更好的 CommandLink。
CommandLink
CommandLinkNote
不工作(如果您第二次运行您的应用程序)CommandLinkNote
不是多行CommandLink
控制权Note
一直在工作(属性是Note
而不是CommandLinkNote
)Note
是多行的VistaUIFramework 还有另一个控件:
Hint
属性,一个灰色的文本替换空值)CloseBox
属性,它的工作方式类似于MaximizeBox
and MinimizeBox
,但它与关闭按钮一起工作)State
不改变已安装操作系统的本机视觉样式的情况下更改进度条的状态/颜色的属性)https://www.github.com/myapkapp/VistaUIFramework/
重要提示:这不是垃圾邮件,我只是假装发布一个提供更好 CommandLink 和更多内容的答案。