我试图改变一个listview项目的背景颜色时,鼠标hover在它
我有一个鼠标hover事件,但是如何在鼠标hover在项目上时添加“突出显示”效果?
private void pinnedAppsListBox_MouseHover(object sender,EventArgs e) { }
终止在C#中运行消息循环的工作线程
是否可以使用extern和override修饰符指定一个函数?
与崩溃转储相比,WinDbg在附加到进程时显示不同的调用堆栈
沙盒AppDomain中的线程安全性
分布式键/值存储可以在Windows上运行,并具有.Net客户端?
在.NET中获取常见的桌面path
在Desktop应用程序的发布版本中分发PDB文件的优点和缺点
在.Net CLI应用程序中显示完成百分比的最佳方法是什么?
如何测量用于.NET远程处理的IP端口的进/出字节数?
命令和复合应用程序块中的事件之间的区别
用这个:
private void pinnedAppsListBox_MouseHover(object sender,EventArgs e){ Point point = pinnedAppsListBox.PointToClient(Cursor.Position); int index = pinnedAppsListBox.IndexFromPoint(point); if (index < 0) return; //Do any action with the item pinnedAppsListBox.GetItemRectangle(index).Inflate(1,2); }
转到ListView的ItemmouseHover事件并添加然后设置项目的属性“BackColor”。
private void listView1_ItemmouseHover(object sender,ListViewItemmouseHoverEventArgs e) { e.Item.BackColor = Color.Black; }
如果您使用的是ListBox,则处理起来相当困难,您需要为ListBox设置MouseHover事件,并确定将哪个项目悬停,然后手动绘制。
看到这个答案 。
但是,如果您使用的是ListView,则可以像这样轻松添加一个ItemmouseHover事件:
private void pinnedAppsListView_MouseHover(object sender,EventArgs e) { e.Item.BackColor = Color.Lime; }
我多次看到这个问题没有一个很好的答案。 我知道没有好的答案,但是,我做了,在别处使用了一些提示。 我用拉撒路做了这个,但你应该能够适应你的语言。
获取物品。 您可能需要设置变量来分别捕获这些变量。 您可能还希望首先获取鼠标按钮的状态。
If (ListView.GetItemAt(X,Y) <> nil) then // do this with an if else // Next,you can get the bounding rect: ListView.GetItemAt(X,Y).displayRect(drSelectBounds); //Option: If Button up or down then // you may have to catch this elsewhere,such as for a drag operation. // Create and set a boolean variable: HighLightOn := True; ListView.Repaint; // clears prevIoUs hightlights ListView.Canvas.Brush.Color := clBtnFace; // or your color of choice ListView.Canvas.FillRect(Rect); // If you are moving around in an area where GetItem is nil,// then do this to stop flicker and remove the highlight: If (ListView.GetItemAt(X,Y) = nil) // do this with an if else If HighLightOn then begin SelectedList.Repaint; HighLightOn := False; end; // If a highlight gets left behind,// you may need to repeat this elsewhere,such as in a component exit. // This is the basic gist of the issue. // There can be a lot of options or things to look for,// so you code Could get more complicated. // I am not suggesting this is the best way to implement it,// but it is easy. Part of this code only works inside your app!
声明这个全局变量
使用这个Listview Item变量来跟踪什么项目被徘徊
ListViewItem lvHoveredItem;
设置以下功能为您的控件打开DoubleBuffering以防止闪烁:
public static void SetDoubleBuffering(System.Windows.Forms.Control control,bool value) { System.Reflection.PropertyInfo controlProperty = typeof(System.Windows.Forms.Control) .GetProperty("DoubleBuffered",System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); controlProperty.SetValue(control,value,null); }
SetDoubleBuffering(lvTaskList,true);
然后在listview的mousemove事件中使用这段代码
private void lvTaskList_MouseMove(object sender,MouseEventArgs e) { //Set the Color you want the list Item to be when mouse is over Color oItemColor = Color.Lavender; Color oOriginalColor = Color.blue; //Your original color //get the Item the Mouse is currently hover ListViewItem lvCurrentItem = lvTaskList.GetItemAt(eX,eY); if ((lvCurrentItem != null) && (lvCurrentItem != lvHoveredItem)) { lvCurrentItem.BackColor = oItemColor; if(lvHoveredItem != null) { lvHoveredItem.BackColor = oOriginalColor ; } lvHoveredItem = lvCurrentItem; return; } if (lvCurrentItem == null) { if (lvHoveredItem != null) { lvHoveredItem.BackColor = oOriginalColor; } } }
您也可以添加MouseLeave事件
private void lvTaskList_MouseLeave(object sender,EventArgs e) { Color oOriginalColor = Color.Blue; //Your original color //When the mouse leave the control. If a ListViewItem was highlighted then set it's original color back if (lvHoveredItem != null) { lvHoveredItem.BackColor = oOriginalColor ; } lvHoveredItem = null; }