C#ListBox OwnerDrawFixed模式滚动没有正确显示列表

时间:2014-09-19 15:44:41

标签: c# winforms listbox smooth-scrolling

我在C#(windows 64bit)中使用了一个列表框项目,我想用不同的颜色着色不同的项目 颜色。 我通过将列表框设置为OwnerDrawFixed和"重载"来管理。 DrawItem函数

  this.TestList.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
  this.TestList.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.TestList_DrawItem);
    private void TestList_DrawItem(object sender, DrawItemEventArgs e)
    {
        e.DrawBackground();
        TestListItem item = TestList.Items[e.Index] as TestListItem; 
        bool selected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);
        if (item != null)
        {
            SolidBrush backgroundBrush = reportsBackgroundBrushSelected;
            if (selected)
            {
                backgroundBrush = reportsBackgroundBrushSelected;
            }
            SolidBrush foregroundBrush = (selected) ? reportsForegroundBrushSelected : reportsForegroundBrush;
            e.Graphics.DrawString( // Draw the appropriate text in the ListBox
                item.GetTestName(), // The message linked to the item
                TestList.Font, // Take the font from the listbox
                new SolidBrush(item.GetColor()), // Set the color 
                0, // X pixel coordinate
                e.Index * TestList.ItemHeight // Y pixel coordinate.  Multiply the index by the ItemHeight defined in the listbox.
            );
            //background:
            e.DrawFocusRectangle();
        }
        else
        {
        }
    }

选择项目也可以正常工作。 但是,当试图滚动列表项时,"闪烁" - 有时会消失,直到我点击 他们再次强制绘制项目。 我的理论是,我需要重载滚动条事件并调用刷新函数,也许?

我很感激任何帮助,

谢谢, Despairy

图片:  http://i62.tinypic.com/25soga1.jpg

http://i57.tinypic.com/2di20er.jpg

编辑: 看起来e.bounds是解决方案。

滚动并拖动鼠标可能编辑了Y属性。正确的电话:

  e.Graphics.DrawString( // Draw the appropriate text in the ListBox
                item.GetTestName(), // The message linked to the item
                TestList.Font, // Take the font from the listbox
                new SolidBrush(item.GetColor()), // Set the color 
                e.Bounds.X, // X pixel coordinate
                e.Bounds.Y // Y pixel coordinate.  Multiply the index by the ItemHeight defined in the listbox.
            );

0 个答案:

没有答案