Ваше решение рисует линию выше / ниже выбранного элемента?
Вы можете разрешить переключение между:
lvPlaylist.IsSimpleDropSink = true;
((SimpleDropSink)lvPlaylist.DropSink).CanDropBetween = true;
Если это не достаточно хорошо, вы можете ответить на ModelCanDrop
например
//((SimpleDropSink)lvPlaylist.DropSink).ModelCanDrop+= ModelCanDrop;
private void ModelCanDrop(object sender, ModelDropEventArgs e)
{
e.DropSink.Billboard.BackColor = Color.GreenYellow;
e.DropSink.FeedbackColor = Color.GreenYellow;
e.InfoMessage = "Hey there";
e.Handled = true;
e.Effect = DragDropEffects.Move;
}
Если вы действительно ненавидите этостолько, сколько вы можете даже:
e.DropSink.EnableFeedback = false;
На сайте ObjectListView есть отличный урок по перетаскиванию:
http://objectlistview.sourceforge.net/cs/blog4.html#blog-rearrangingtreelistview
Если вы хотите что-то сделатьдействительно интересно, вы можете написать свой собственный подкласс для SimpleDropSink:
lvPlaylist.IsSimpleDragSource = true;
lvPlaylist.DropSink = new MyDropSink();
private class MyDropSink : SimpleDropSink
{
public override void DrawFeedback(Graphics g, Rectangle bounds)
{
if(DropTargetLocation != DropTargetLocation.None)
g.DrawString("Heyyy stuffs happening",new Font(FontFamily.GenericMonospace, 10),new SolidBrush(Color.Magenta),bounds.X,bounds.Y );
}
}
Для вашего желаемого поведения вы должны попробовать что-то вроде:
private class MyDropSink : SimpleDropSink
{
private ObjectListView _olv;
public MyDropSink(ObjectListView olv)
{
_olv = olv;
}
public override void DrawFeedback(Graphics g, Rectangle bounds)
{
if(DropTargetLocation != DropTargetLocation.None)
{
Point mLoc = _olv.PointToClient(Cursor.Position);
var hitt = _olv.HitTest(mLoc);
if (hitt.Item == null) return;
int idx = hitt.Item.Index;
Rectangle rect = _olv.GetItemRect(idx);
Pen MyPen = new Pen(Color.OrangeRed, 3);
g.DrawLine(MyPen, rect.Left, rect.Top, rect.Right, rect.Top);
}
}
}