【问题标题】:Rectangle around selected ListView item选定 ListView 项周围的矩形
【发布时间】:2014-11-19 11:01:32
【问题描述】:

我想在 ListView 中的选定项目周围绘制一个矩形,因为在某处阅读了 Microsoft 建议不要更改所述项目的“突出显示颜色”的内容。但是,我正在使用 selectedIndexChanged 事件,当绘制实际的 listviewitem 时,我的矩形消失了。有根据的猜测会表明我的矩形要么在它后面,要么在重绘时被清除?所以我的问题是,什么时候才是真正绘制矩形的最佳时间,因为它是可见的?到目前为止,我的代码如下所示:

 void lvMain_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (lvMain.SelectedItems.Count > 0)
        {
            if (lastSelectedItem == null) // First time called
            {
                lastSelectedItem = (sender as System.Windows.Forms.ListView).SelectedItems[0];
                DrawHighlightRectanlge(lastSelectedItem);
            }
            else
            {
                // TODO: Remove previous highlight
                lastSelectedItem = (sender as System.Windows.Forms.ListView).SelectedItems[0];
                DrawHighlightRectanlge(lastSelectedItem);
            }
        }
    }

    internal void DrawHighlightRectanlge(System.Windows.Forms.ListViewItem item)
    {
        using (Graphics g = item.ListView.CreateGraphics())
        {                
            g.DrawRectangle(new Pen(Color.Red), new Rectangle(item.Position.X, item.Position.Y, item.Bounds.Width, item.Bounds.Height));
        }
    }

TIA

【问题讨论】:

  • 是的,它在DrawItem 事件中被重绘。这是您需要添加矩形绘图代码的地方。请注意,您现在需要负责所有绘图;但是大多数困难的事情都可以通过调用e 参数中的函数来完成.. - 你使用哪种视图模式?
  • 我正在使用“详细信息”视图

标签: c# winforms


【解决方案1】:

这是一个非常基本的版本,用于所有者绘制的ListView。将OwnerDraw 属性设置为true 并编码DrawItem 事件,可能是这样的:

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    e.DrawBackground();
    e.DrawText();

    if (e.Item.Selected)
    {
        Rectangle R = e.Bounds;  
        R.Inflate(-1, -1);
        using (Pen pen = new Pen(Color.Red, 1.5f))
        e.Graphics.DrawRectangle(pen, R);
    }
}

为了在Details View 中工作,我将矩形缩小了一点,但您应该尝试一下,使其适合您的需求和喜好......!

注意:如果您有 ColumnHeaders,您还需要对 DrawColumnHeader 事件进行编码,其最简单的形式如下:

private void listView1_DrawColumnHeader(object sender, 
                                        DrawListViewColumnHeaderEventArgs e)
{
    e.DrawDefault = true;
}

如果你有 SubItems,你需要有一个 DrawSubItem 事件,至少像这样:

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    e.DrawDefault = true;
}

显然,如果您希望在此处也绘制矩形,您需要为此事件编写更多代码。但是DrawBackgroundDrawText的默认功能在这里也可以使用。

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多