开发者

WPF Drag and Drop blocking operations

开发者 https://www.devze.com 2023-02-11 08:34 出处:网络
I am working with a WPF application that is using Drag and Drop f开发者_StackOverflow中文版unctionality.

I am working with a WPF application that is using Drag and Drop f开发者_StackOverflow中文版unctionality.

The Drag and Drop operation is a blocking operation and is having some negative side effects in my application. I have recently added the use of an adorner to show the item dragging. The problem with this is that in order to do this, I need to track the current position of the mouse. When a Drag and Drop operation is initiated, it blocks further execution until the item is dropped.

I have read that a fix for this is to execute the drag and drop in its own thread, and then update the UI. I read this article here

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

I am not sure if this is what I am looking to do, but It sounds like what I need.

Is there another fix around this?

Here is the code that I need to execute.

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

    }


You can use DragDrop.GiveFeedback attached event for that:

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
}
0

精彩评论

暂无评论...
验证码 换一张
取 消