ObjectListView默认拖拽蓝色效果干扰自定义效果,如何禁用?
解决ObjectListView默认拖拽指示干扰自定义效果的问题
我完全懂你的困扰——在普通ListView里好好的自定义拖拽高亮,换到ObjectListView后,暂停拖拽(还没释放)时默认的蓝色拖拽线就冒出来了,直接破坏了自定义效果的一致性。下面给你两种实用的解决办法:
方法一:重写ObjectListView的DrawDropIndicator方法(推荐)
ObjectListView的默认拖拽指示是通过DrawDropIndicator方法绘制的,我们只需要让这个方法什么都不做,就能彻底禁用默认效果:
- 先创建一个继承自
ObjectListView的自定义控件:
public class CustomObjectListView : ObjectListView { protected override void DrawDropIndicator(Graphics g, DropTarget dropTarget) { // 留空不执行任何绘制,直接禁用默认拖拽指示 } }
- 把窗体里原来的ObjectListView替换成这个自定义控件,再保留你原来的
DragOver事件代码就行。这样不管拖拽处于什么状态,默认的蓝色指示都不会再出现,完全由你的自定义高亮逻辑主导。
方法二:通过DropSink禁用默认指示(无需自定义控件)
如果不想新建自定义控件,也可以直接通过ObjectListView的DropSink属性来关闭默认绘制:
在窗体初始化代码(比如Form_Load方法)里添加这一行:
yourObjectListView.DropSink.ShowDropIndicator = false;
这条语句会告诉ObjectListView的拖拽处理组件,不要绘制默认的蓝色拖拽线,之后你的自定义高亮效果就能完全正常展示了。
额外优化:让自定义高亮更稳定
你原来用CreateGraphics()直接绘制的方式,可能会在控件刷新时丢失高亮。可以优化成在Paint事件里绘制,把高亮索引存起来触发重绘:
private int highlightedIndex = -1; private void yourObjectListView_DragOver(object sender, DragEventArgs e) { Point mLoc = yourObjectListView.PointToClient(Cursor.Position); var hitt = yourObjectListView.HitTest(mLoc); if (hitt.Item == null) { if (highlightedIndex != -1) { highlightedIndex = -1; yourObjectListView.Invalidate(); } return; } int idx = hitt.Item.Index; if (idx == highlightedIndex) return; highlightedIndex = idx; yourObjectListView.Invalidate(); // 触发控件重绘 } private void yourObjectListView_Paint(object sender, PaintEventArgs e) { if (highlightedIndex != -1 && highlightedIndex < yourObjectListView.Items.Count) { Rectangle rect = yourObjectListView.GetItemRect(highlightedIndex); using (Pen myPen = new Pen(Color.OrangeRed, 3)) { e.Graphics.DrawLine(myPen, rect.Left, rect.Top, rect.Right, rect.Top); } } }
这样就算控件刷新,高亮效果也能稳定保持,体验会更流畅。
内容的提问来源于stack exchange,提问作者Shino Lex
相关产品推荐
相关产品推荐

