ObjectListView игнорирует эффект перетаскивания - PullRequest
0 голосов
/ 09 апреля 2019

Здравствуйте, я использую ObjectListView для моего приложения. Я пытаюсь создать эффект перетаскивания, потому что оригинальный синий не очень хорош. Это как выделение первого столбца при перетаскивании. Я использовал это в моем обычном списке

        private void lvPlaylist_DragOver(object sender, DragEventArgs e)
        {
            Point mLoc = lvPlaylist.PointToClient(Cursor.Position);
            var hitt = lvPlaylist.HitTest(mLoc);
            if (hitt.Item == null) return;

            int idx = hitt.Item.Index;
            if (idx == prevItem) return;

            lvPlaylist.Refresh();
            using (Graphics g = lvPlaylist.CreateGraphics())
            {
                Rectangle rect = lvPlaylist.GetItemRect(idx);
                Pen MyPen = new Pen(Color.OrangeRed, 3);
                g.DrawLine(MyPen, rect.Left, rect.Top, rect.Right, rect.Top);
            }
            prevItem = idx;
        }

Но это не работает в ObjectListView. Ну, на самом деле это так, но когда я прекращаю перетаскивать, но не отпускаю свои перетаскиваемые объекты, он показывает мне синий эффект перетаскивания по умолчанию, пока я продолжаю двигаться, я вижу свой собственный эффект перетаскивания. Есть ли способ отключить эффект перетаскивания OLV?

1 Ответ

1 голос
/ 11 апреля 2019

Ваше решение рисует линию выше / ниже выбранного элемента?

Вы можете разрешить переключение между:

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);
        }
    }
}
...