【问题标题】:Custom property does not show in properties window自定义属性未显示在属性窗口中
【发布时间】:2013-11-26 21:18:11
【问题描述】:

我希望自定义控件根据Enabled 属性的值提供不同的BackColor。我继承了一个Button,现在尝试隐藏BackColor 属性以将其隐藏在视图中,然后提供另一个,称为BackColorEnabled

这是针对该问题的简化测试用例:

Imports System.ComponentModel

Friend Class StyledButton : Inherits Button
  Private _BackColorEnabled As Color

  <Browsable(False)>
  Friend Shadows Property BackColor As Color
    Get
      Return MyBase.BackColor
    End Get
    Set(value As Color)
      MyBase.BackColor = value
    End Set
  End Property

  <Browsable(True)>
  Friend Property BackColorEnabled As Color
    Get
      Return _BackColorEnabled
    End Get
    Set(value As Color)
      _BackColorEnabled = value
    End Set
  End Property

  Sub New()
    _BackColorEnabled = SystemColors.Control
  End Sub

End Class

问题是这两个属性都不起作用,即BackColor 仍然出现,而BackColorEnabled 不存在。根据我在网上找到的许多链接,设置 BrowsableAttribute 应该可以 100% 工作。那么上面的代码有什么问题呢?

【问题讨论】:

    标签: vb.net winforms custom-controls


    【解决方案1】:

    似乎WinForms 设计器 不喜欢将属性声明为Friend,并完全忽略它们,即使使用来自同一程序集的控件也是如此。在我将两者都更改为Public 之后,它就像一个魅力。

    据我所知,它不应该造成范围问题,因为类本身可以保持Friend

    旁注:我首先花费大量时间在一个更大的项目中调试此问题。然后开始收集关于在 SO 上提问的想法。准备了一个简化的测试用例 - 然后在几分钟内找到了解决方案。只是觉得与社区分享我的发现会很好。

    【讨论】:

    • 我知道 Public 试图隐藏 BackColor - 范围必须像签名一样匹配,但你很快。我刚刚遇到的相关问题:w/ctl 从 ListView 继承,我想隐藏/使用 Headerstyle,但它不会落在属性列表中……它区分大小写。一旦我将其更改为HeaderStyle(大写S),它就消失了。我已经来回切换了 2-3 次,以确保它不是别的东西。与BackColorBackcolor 相同。如果您不使用 Shadows,VS 会抱怨,但除非大小写匹配,否则不会真正遮住它!也许是一个错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2018-11-16
    • 2010-12-15
    • 1970-01-01
    • 2014-06-16
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多