如果我创建一个类并使它从这样的ListView派生出来.
class MyListView : ListView
{
public MyListView() : base()
{
DoubleBuffered = true;
OwnerDraw = true;
Cursor = Cursors.Hand;
Scrollable = false;
}
protected override void OnDrawItem(DrawListViewItemEventArgs e)
{
//base.OnDrawItem(e);
}
}然后打开windows窗体的设计视图,添加一个新的MyListView对象,然后添加单个项并将其链接到图像列表。我可以看到mylistview对象中有一个项。它对我的表单中名为lv的MyListView类型的对象没有任何影响。另一方面,当我运行我的应用程序时,我看到了我所期望的,并且没有列出任何项目。
为什么这会影响运行时,而不是设计时间的绘画?

发布于 2016-10-30 22:35:58
答案
ListViewDesigner阴影OwnerDraw属性,如控件的Visible或Enabled属性。因此,它只在运行时工作,而更改它并不影响设计时。
边注
如果您查看ListViewDesigner的源代码,您将看到以下属性:
private bool OwnerDraw
{
get { return (bool) base.ShadowProperties["OwnerDraw"]; }
set { base.ShadowProperties["OwnerDraw"] = value; }
}在PreFilterProperties中,您将看到设计器用以下一个替换了原始属性:
PropertyDescriptor oldPropertyDescriptor = (PropertyDescriptor) properties["OwnerDraw"];
if (oldPropertyDescriptor != null)
{
properties["OwnerDraw"] = TypeDescriptor.CreateProperty(typeof(ListViewDesigner),
oldPropertyDescriptor, new Attribute[0]);
}因此,无论您使用什么View,它都会执行默认的画法,而不管您在OnDrawItem中有什么。这是因为它在设计时不使用OwnerDraw属性。设计师把它遮住了。这与您在Enabled或Visible属性中看到的行为相同。
解决方案,以便在运行时上启用所有者绘图
作为解决办法,您可以为派生控件注册不同的Designer。这样,OwnerDraw属性将作为正常属性工作:
[Designer(typeof(ControlDesigner))]
public class MyListView : ListView警告:请记住,通过为控件注册新的设计器,您将失去当前的ListViewDesigner功能,如其设计器谓词或智能标记(动作列表)窗口或列大小选项。如果需要这些特性,可以通过查看ListViewDesigner源代码在自定义设计器中实现这些功能。
https://stackoverflow.com/questions/40334256
复制相似问题