WPF Drag and Drop блокировка операций - PullRequest
0 голосов
/ 16 февраля 2011

Я работаю с приложением WPF, использующим функцию перетаскивания.

Операция перетаскивания является блокирующей операцией и имеет некоторые негативные побочные эффекты в моем приложении. Недавно я добавил использование рекламного элемента для отображения перетаскивания элемента. Проблема в том, что для этого мне нужно отслеживать текущее положение мыши. Когда инициируется операция перетаскивания, она блокирует дальнейшее выполнение до тех пор, пока предмет не будет отброшен.

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

http://msdn.microsoft.com/en-us/library/ms741870.aspx

Я не уверен, что это то, что я хочу сделать, но это звучит как то, что мне нужно.

Есть ли другое исправление?

Вот код, который мне нужно выполнить.

 private void FieldItemGrid_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        if (_isDown)
        {
            if ((_isDragging == false))
            {
               /*Add Adorner to Item that is being dragged*/
                DragStarted(e.GetPosition(this));
            }
            if (_selectedElement != null)
            {
                /*Begin Drag Operation*/
                DragDrop.DoDragDrop(_selectedElement, _selectedElement, DragDropEffects.Move);
            }

            /*The following code is not executed until the dragged item is released*/
            if (_isDragging)
            {  
                /*Update Current Position of Mouse to update adorner position*/
                DragMoved(e.GetPosition(this));
            }
        }

    }

1 Ответ

2 голосов
/ 16 февраля 2011

Вы можете использовать DragDrop.GiveFeedback прикрепленное событие для этого:

private void FieldItemGrid_PreviewMouseMove(object sender, MouseEventArgs e) {
    if (_isDown) {
        if ((_isDragging == false)) {
            /*Add Adorner to Item that is being dragged*/
            DragStarted(e.GetPosition(this));
        }
        if (_selectedElement != null) {
            DragDrop.AddGiveFeedbackHandler(Element, OnGiveFeedback);
            try {
                /*Begin Drag Operation*/
                DragDrop.DoDragDrop(_selectedElement, _selectedElement, DragDropEffects.Move);
            }
            finally {
                DragDrop.RemoveGiveFeedbackHandler(Element, OnGiveFeedback);
            }
        }

        /*The following code is not executed until the dragged item is released*/
        if (_isDragging) {
            /*Update Current Position of Mouse to update adorner position*/
            DragMoved(e.GetPosition(this));
        }
    }
}

private void OnGiveFeedback(object sender, GiveFeedbackEventArgs e) {
    // Update adorner location here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...