C# 如何在鼠标光标下获取正确的ListViewItem?
ListView.GetItemAt方法的问题如下面的屏幕截图所示 设计者代码 代码隐藏 截图 鼠标光标下的矩形应为黄色,但与其他未悬停的矩形一样为绿色 如果图标的标签或图标矩形包含该点,则ListView.GetItemAt将获取该项。这不是你要找的。您需要检查整个项目 您可以使用以下任一方法: 示例-检测DrawItem中的热项目C# 如何在鼠标光标下获取正确的ListViewItem?,c#,winforms,listview,C#,Winforms,Listview,ListView.GetItemAt方法的问题如下面的屏幕截图所示 设计者代码 代码隐藏 截图 鼠标光标下的矩形应为黄色,但与其他未悬停的矩形一样为绿色 如果图标的标签或图标矩形包含该点,则ListView.GetItemAt将获取该项。这不是你要找的。您需要检查整个项目 您可以使用以下任一方法: 示例-检测DrawItem中的热项目 为什么不能使用listView1.FocusedItem属性您不需要在鼠标移动中查找热项目。在鼠标移动中,您只需调用InValidate@RezaAghaei在M
为什么不能使用listView1.FocusedItem属性您不需要在鼠标移动中查找热项目。在鼠标移动中,您只需调用InValidate@RezaAghaei在MouseMove处理程序中,我只需要使一个或两个项无效,而不是使整个ListView无效,因此我认为在MouseMove中查找热项是最好的方法。您知道自己的要求,即使您希望在鼠标移动中找到它,使用答案中提到的重载方法。
this.listView1 = new System.Windows.Forms.ListView();
this.SuspendLayout();
//
// listView1
//
this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.listView1.Location = new System.Drawing.Point(0, 0);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(717, 511);
this.listView1.TabIndex = 0;
this.listView1.UseCompatibleStateImageBehavior = false;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(717, 511);
this.Controls.Add(this.listView1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
listView1.OwnerDraw = true;
listView1.View = View.LargeIcon;
listView1.DrawItem += ListView1_DrawItem;
listView1.MouseMove += ListView1_MouseMove;
for (int i = 1; i <= 10; ++i)
{
listView1.Items.Add($"item {i}", 0);
}
}
private void ListView1_MouseMove(object sender, MouseEventArgs e)
{
ListViewItem item = listView1.GetItemAt(e.X, e.Y);
if (LastHoveredItem != null)
{
ListViewItem item2 = LastHoveredItem;
LastHoveredItem = null;
listView1.Invalidate(item2.Bounds);
}
if (item != null)
{
LastHoveredItem = item;
listView1.Invalidate(item.Bounds);
}
else
{
LastHoveredItem = null;
}
}
private void ListView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
if (LastHoveredItem == e.Item)
{
e.Graphics.FillRectangle(Brushes.Yellow, e.Item.Bounds);
}
else
{
e.Graphics.FillRectangle(Brushes.Green, e.Item.Bounds);
}
}
internal ListViewItem LastHoveredItem = null;
private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
//...
var p = listView1.PointToClient(Cursor.Position);
if (e.Item.GetBounds(ItemBoundsPortion.Entire).Contains(p))
{
//e.Item is Hot
}
else
{
//e.Item is Normal
}
//...
}