WPF拖放阻止操作

时间:2011-02-16 16:02:32

标签: c# wpf drag-and-drop

我正在使用正在使用拖放功能的WPF应用程序。

拖放操作是一个阻塞操作,在我的应用程序中有一些负面的副作用。我最近添加了使用装饰器来显示项目拖动。这个问题是,为了做到这一点,我需要跟踪鼠标的当前位置。当启动拖放操作时,它会阻止进一步执行,直到该项被删除。

我已经读过,修复此问题的方法是在自己的线程中执行拖放操作,然后更新UI。我在这里阅读这篇文章

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 个答案:

答案 0 :(得分:2)

您可以使用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
}