WPF拖放 - PreviewMouseMove + PreviewMouseLeftButtonDown无法一起工作?

时间:2011-02-16 00:15:39

标签: c# .net wpf

如果我使用两个事件处理程序,PreviewMouseLeftButtonDown和PreviewMouseMove。我遇到的问题是触发PreviewMouseLEftButtonDown时一切正常,但由于它是一个拖放操作,左按钮保持不动。因此,当他们按住左键时,PreviewMouseMove EventHandler应该处理它,但是在它们释放鼠标左键之后才会被调用

这是首先被称为

的内容
 private void FieldItemGrid_PreviewMouseLeftButtonDown(object sender, MouseEventArgs e)
    {
        down = e.GetPosition(this);
        Grid fieldItemGrid = (Grid)sender;

        fieldItemGrid.Background = Brushes.White;
        _isDown = true;
        _startPoint = e.GetPosition(this);
        _originalElement = fieldItemGrid;
        this.CaptureMouse();
        e.Handled = true;


        _selectedElement = fieldItemGrid;
        DragStarted(e.GetPosition(this));
    }

这里的一切工作正常,但问题是,如果他们在按住时移动鼠标,则不会执行以下的PreviewMouseMove处理程序

 private void FieldItemGrid_PreviewMouseMove(object sender, MouseEventArgs e)
    {

        if (_isDown)
        {
            if (_selectedElement != null)
            {
                DragDrop.DoDragDrop(_selectedElement, _selectedElement, DragDropEffects.Move);
            }
            if (_isDragging)
            {
                DragMoved(e.GetPosition(this));
            }

        }
    }

有解决方法吗?因此,在释放鼠标左键之前,我没有被阻止其他事件处理程序?

2 个答案:

答案 0 :(得分:2)

除非thisGrid,否则this.CaptureMouse()会阻止包括Grid在内的任何其他元素接收鼠标事件。对于拖放,您可能根本不需要捕获鼠标,但是如果捕获鼠标,则需要使用fieldItemGrid.CaptureMouse()以便在捕获之前调用鼠标移动处理程序释放。

答案 1 :(得分:0)

看起来这个问题已经回答了一段时间,所以我不太精心解决,但为了遇到同样的问题,你也可以使用DragDrop.DoDragDrop实现拖放。单击鼠标按钮时源代码隐藏中的()方法。在目标上,您设置" AllowDrop"在XAML中为true并处理" Drop"方法。您的实现会有所不同,但看起来会像:

private void MyUIElement_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        //find the clicked row
        var tempObject = e.Source as [whatever];
        if (tempObject == null) return;

        DragDrop.DoDragDrop(tempObject, tempObject.PropertyToBePassed, DragDropEffects.Copy);
    }

然后在" Drop"你会在目标中使用事件处理程序(为了示例而传递一个字符串属性):

private void MyTarget_Drop(object sender, DragEventArgs e)
    {
        string myNewItem = (string)e.Data.GetData(DataFormats.StringFormat);
        Debug.WriteLine("I just received: " + myNewItem);
    }

你仍然没有抓住鼠标事件,但在很多情况下,它是一种快速简便的方法来完成同样的事情。