我想在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
答案 0 :(得分:0)
以下是所有者绘制的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,您还需要以{x}最简单的形式对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;
}
如果您希望在此处绘制矩形,显然您需要为此事件编写更多代码。但此处也可以使用DrawBackground
和DrawText
的默认功能。