编程语言
首页 > 编程语言> > c# – Custom ListBox:优雅有效的实现?

c# – Custom ListBox:优雅有效的实现?

作者:互联网

所有,

我正在进行一些ListBox自定义,以提高我的应用程序的清晰度.基本上,很容易找到“如何”为此目的导致我目前的结果如下.

Current display http://www.freeimagehosting.net/uploads/2967c2c763.png

我对显示器很满意,但是…我用鼠标滚轮遇到了奇怪的行为.我试图找到有关此问题的信息,我发现这篇文章:

http://aviationxchange.net/wikis/winforms/net-color-listbox.aspx

这指出鼠标问题不是唯一的问题(从链接中简单复制/粘贴)

>水平滚动条消失了.
只有固定长度的字符串更小
比控制宽度还可以
显示.如果控制怎么办
调整?
>如果您尝试使用鼠标
轮子,你可能已经注意到了
所选项目上下移动
滚轮是不正常的
移动.
>可覆盖的方法
OnPaint()OnPaintBackGround()没有
工作.只是他们不是
迷上了这些事件.背景是
仅通过Windows消息绘制.

它提供了一些纠正这些问题的建议,但我觉得实施所有这些“解决方法”以显示自定义列表感到非常沮丧.我错过了什么吗?是否有任何winform控件允许我进行相同类型的自定义,但是更干净/更优雅?我无法找到更多信息:/

下面,添加了自定义绘图部分的相关部分,但我不确定显示问题是否真的基于overriden方法的实现,更多的是关于控件本身.

    public RecordListBox(): base()
    {
        mListBox = this;

        mListBox.DrawItem += new DrawItemEventHandler(mListBox_DrawItem);
        mListBox.MeasureItem += new MeasureItemEventHandler(mListBox_MeasureItem);
        this.DrawMode = DrawMode.OwnerDrawFixed;

    }

    public void mListBox_DrawItem(object sender, DrawItemEventArgs e)
    {
        if (this.DesignMode) return;

        e.DrawBackground();
        e.DrawFocusRectangle();

        // drawing actions

    }

    public void mListBox_MeasureItem(object sender, MeasureItemEventArgs e)
    {
        e.ItemHeight = 40;
    }

问候,

解决方法:

根据给定的链接,您必须覆盖void WndProc(ref Message m)才能管理鼠标滚轮问题.如果要基于现有的窗口对象(甚至是UserControl)滚动自己的自定义控件,您将覆盖许多方法和属性,以使控件真正想要您想要的.给出的链接似乎是一个良好的开端.实现这些功能以及MeasureItem的覆盖,并查看最终结果.但是如果你想创建一个自定义控件,那么大多数只是试验和错误,并且混入了很多研究.

标签:c,winforms,listbox,custom-controls
来源: https://codeday.me/bug/20190710/1423086.html