我想创建一个派生自ListView对象的类。
class MyListView : ListView
{
}
我尝试了一些强制默认View
属性的东西,但在设计时,我似乎没有做任何对象属性的影响。
我尝试过的一些事情是......
public MyListView():base()
{
base.View = View.Tile;
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[DefaultValue(View.Tile)]
new public View View
{
get {
return base.View;
}
set {
base.View = value;
}
}
protected override void InitLayout()
{
base.InitLayout();
base.View = View.Tile;
}
所以我的问题是如何强制值始终在View
属性上持久化,或者如何为其设置默认值并在新类中隐藏属性?
答案 0 :(得分:1)
在正常情况下,它足以覆盖属性并将所需的值放在getter和setter中。但ListView
的{{1}}属性是一种特殊情况。 ListViewDesigner
为设计师添加了一个带阴影的View
属性。
如果您查看ListViewDesigner
课程,您将看到无论您的new
视图属性如何,设计人员都使用基类的View
属性:((ListView) base.Component).View = value;
。
我们可以做些什么来强制ListView
在设计时使用特定的视图?
您可以使用View
修饰新的Browsable(false)
媒体资源。这样,它不会在属性网格中显示View
属性,但会在控件操作列表中显示该属性。
要删除该操作列表,您可以为您的控件注册其他Designer
,例如ControlDesigner
:
[Designer(typeof(ControlDesigner))]
public class MyListView : ListView
{
public MyListView()
{
this.View = System.Windows.Forms.View.Tile;
}
[Browsable(false)]
new public View View
{
get
{
return System.Windows.Forms.View.Tile;
}
set
{
base.View = System.Windows.Forms.View.Tile;
}
}
}
另外,作为另一个选项,您可以获取控件的设计器实例并清除其操作列表,而不是注册新的设计器。
不要忘记添加对System.Design.dll
的引用并添加using System.Windows.Forms.Design;