wpf 如何将拖放应用于移动对象和传输数据?

eqfvzcg8  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(97)

在我的WPF桌面应用程序中,我有许多出现在网格上的UserControl示例。我想在屏幕上拖动任何控件的能力,如果我把它放到下面的另一个控件上,从拖动的对象到拖放目标发生数据传输。看起来应该很简单,但我很难让WPF同时做这两件事。
this example中,为了在用户控件上启用拖放(DND),启动DND的代码位于对象本身中,数据传输正常,但对象永远不会在屏幕上移动。在这个other DND example中,包括在屏幕上移动对象,移动对象的DND代码都发生在窗口中。所有的东西都可以很好的拖动,但是在拖动的对象之间没有数据传输。
有没有人知道一个管理两个目标的例子--在屏幕上拖动一个UserControl(或一个Adorner),并将数据从拖动的对象传输到下面的另一个对象?

iih3973s

iih3973s1#

在第二个例子中,使用装饰器来直观地指示对象正在被拖动,您可以在DragStarted()方法中创建一个DataObject,将其存储在某个地方(例如在类变量中),然后在DragFinished方法中从该存储中检索它,例如:

private DataObject data;

private void DragStarted()
{
    _isDragging = true;
    _originalLeft = Canvas.GetLeft(_originalElement);
    _originalTop = Canvas.GetTop(_originalElement);

    data = new DataObject();
    data.SetData(DataFormats.StringFormat, "some data...");
    data.SetData("Object", _originalElement);

    _overlayElement = new SimpleCircleAdorner(_originalElement);
    var layer = AdornerLayer.GetAdornerLayer(_originalElement);
    layer.Add(_overlayElement);
}

private void DragFinished(bool cancelled)
{
    Mouse.Capture(null);
    if (_isDragging)
    {
        AdornerLayer.GetAdornerLayer(_overlayElement.AdornedElement).Remove(_overlayElement);

        if (cancelled == false)
        {
            Canvas.SetTop(_originalElement, _originalTop + _overlayElement.TopOffset);
            Canvas.SetLeft(_originalElement, _originalLeft + _overlayElement.LeftOffset);
        }
        _overlayElement = null;

        string dataString = (string)data.GetData(DataFormats.StringFormat);
        var obj = data.GetData("Object");
    }
    _isDragging = false;
    _isDown = false;
}

不同之处在于,您不调用DragDrop.DoDragDrop,也不处理Drop事件和来自DragEventArgs的数据。数据本身可能完全相同,但您基本上将其存储在另一个位置。

相关问题