Neo*_*isk 2 vb.net design-time appearance button winforms
我定义了一个自定义按钮类,它在启用/禁用按钮时设置背景颜色.
在运行时启用外观(A):

运行时禁用外观(B):

无论Enabled属性值如何,设计时外观始终为(A).
我希望我的控件能够完全按照运行时出现的方式出现在设计器中.是否有可能,如果是这样,怎么办呢?
这是我尝试过的(只是代码的相关部分):
Public Class StyledButton : Inherits Button
Private p_fEnabled As Boolean
<DefaultValue(True)>
Public Shadows Property Enabled As Boolean
Get
Return p_fEnabled
End Get
Set(value As Boolean)
p_fEnabled = value
MyBase.Enabled = value
UpdateVisualStyle()
End Set
End Property
Private Sub UpdateVisualStyle()
If Me.Enabled Then
'set enabled appearance
Else
'set disabled appearance
End If
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
我会解释为什么它会这样.控件在设计时的行为与在运行时的行为相同.它在Winforms设计器中提供了强大的WYSIWYG支持.但是某些属性在设计时非常笨拙,你实际上并不希望Visible属性生效.非常重要的是,即使在"属性"窗口中将"可见"设置为" 假",控件仍然可见.
这是控件设计者的核心角色.它拦截了这些困难的属性并模仿它们.显示属性网格中的预期值,但实际上并未将它们传递给控件的属性设置器.
该启用属性适合这一类.如果没有截获,则无法再选择控件.其他的是ContextMenu,AllowDrop,UserControl的位置和Form,等等.你的Shadows替换不会欺骗设计者,它使用Reflection来按名称查找属性.因此,您的属性没有任何影响,您的属性设置器根本不会被调用.
您只能通过覆盖OnPaint()来控制控件,以便在设计时显示不同的颜色.一个定制设计师来戳它.然而,一个重要的问题是,为按钮替换渲染器并不简单,该按钮是实现OnPaint()方法的按钮.微软决定让渲染器内部,你不能覆盖它们.
方式太麻烦,我建议你通过这个.
| 归档时间: |
|
| 查看次数: |
1041 次 |
| 最近记录: |