首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么用于OnDrawItem的ListView事件不影响设计时环境?

为什么用于OnDrawItem的ListView事件不影响设计时环境?
EN

Stack Overflow用户
提问于 2016-10-30 22:20:37
回答 1查看 299关注 0票数 2

如果我创建一个类并使它从这样的ListView派生出来.

代码语言:javascript
复制
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对象中有一个项。它对我的表单中名为lvMyListView类型的对象没有任何影响。另一方面,当我运行我的应用程序时,我看到了我所期望的,并且没有列出任何项目。

为什么这会影响运行时,而不是设计时间的绘画?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-30 22:35:58

答案

ListViewDesigner阴影OwnerDraw属性,如控件的VisibleEnabled属性。因此,它只在运行时工作,而更改它并不影响设计时。

边注

如果您查看ListViewDesigner的源代码,您将看到以下属性:

代码语言:javascript
复制
private bool OwnerDraw
{
    get { return (bool) base.ShadowProperties["OwnerDraw"]; }
    set { base.ShadowProperties["OwnerDraw"] = value; }
}

PreFilterProperties中,您将看到设计器用以下一个替换了原始属性:

代码语言:javascript
复制
PropertyDescriptor oldPropertyDescriptor = (PropertyDescriptor) properties["OwnerDraw"];
if (oldPropertyDescriptor != null)
{
    properties["OwnerDraw"] = TypeDescriptor.CreateProperty(typeof(ListViewDesigner), 
        oldPropertyDescriptor, new Attribute[0]);
}

因此,无论您使用什么View,它都会执行默认的画法,而不管您在OnDrawItem中有什么。这是因为它在设计时不使用OwnerDraw属性。设计师把它遮住了。这与您在EnabledVisible属性中看到的行为相同。

解决方案,以便在运行时上启用所有者绘图

作为解决办法,您可以为派生控件注册不同的Designer。这样,OwnerDraw属性将作为正常属性工作:

代码语言:javascript
复制
[Designer(typeof(ControlDesigner))]
public class MyListView : ListView

警告:请记住,通过为控件注册新的设计器,您将失去当前的ListViewDesigner功能,如其设计器谓词或智能标记(动作列表)窗口或列大小选项。如果需要这些特性,可以通过查看ListViewDesigner源代码在自定义设计器中实现这些功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40334256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档