为UserControl的Image公共属性设置默认值时遇错误求助
解决UserControl Image属性默认值设置的错误问题
嘿,我懂你碰到这个报错的烦躁——Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class,其实原因说穿了很简单:
你用的DefaultValueAttribute是在属性元数据初始化阶段生效的,这个阶段属于类的「共享(Shared)上下文」,也就是还没创建任何UserControl实例的时候。而你定义的Image_是个实例变量(没加Shared修饰),只有类被实例化后才能访问它,编译器自然会拦着你。
下面给你两种实用的解决办法,按需选就行:
方法1:用共享成员存储默认图像
把默认图像定义成类的共享只读成员,这样就能在DefaultValue里直接引用了——共享成员属于类本身,不需要实例就能访问:
' 定义共享的默认图像,让元数据初始化阶段能访问到 Private Shared ReadOnly DefaultImage As Image = My.Resources.MyImage Private Image_ As Image = DefaultImage <Category("Appearance")> <DisplayName("Image")> <DefaultValue(DefaultImage)> <Description("自定义控件的显示图像")> Public Property Image As Image Get Return Image_ End Get Set(value As Image) Image_ = value NestedControl.Image = value End Set End Property
这种方式的好处是,设计器能准确识别属性的默认值,当你把属性改回默认图像时,设计器不会额外序列化这个值,保持代码干净。
方法2:构造函数中设置默认值
如果你不想用共享成员,也可以在UserControl的构造函数里初始化默认值,同时把DefaultValue设为Nothing(引用类型的默认值):
Private Image_ As Image = Nothing <Category("Appearance")> <DisplayName("Image")> <DefaultValue(Nothing)> <Description("自定义控件的显示图像")> Public Property Image As Image Get Return Image_ End Get Set(value As Image) Image_ = value NestedControl.Image = value End Set End Property ' 在构造函数里初始化默认图像 Public Sub New() InitializeComponent() Image_ = My.Resources.MyImage NestedControl.Image = Image_ End Sub
这种方式更直观,不过要注意:设计器可能不会自动识别构造函数里的默认值为「默认状态」,如果后续修改属性再改回来,设计器可能还是会序列化这个值。
内容的提问来源于stack exchange,提问作者Simos Sigma
相关产品推荐
相关产品推荐

