WPF - 拖放 - 装饰器在控件外消失

3
我正在使用WPF创建两个ListView并实现拖放功能(包括在ListView内和ListView之间)。
我发现了一个有趣的帖子here可以实现这一点。
然而,存在一个问题。当我从listView1中拖动listviewitem时,我只能在listView1内看到装饰器(即幽灵图像)。当我想要将listviewItem放置在ListView2上时,我也必须在那里看到装饰器。基本上,装饰器仅出现在启动拖动操作的listView上。一旦它离开listView,它就会消失。
我做了一些研究,但找不到让装饰器在启动拖动的控件之外可见的方法。
有人可以给我提供一些建议吗?
1个回答

2

将GiveFeedback事件与adorner位置的更新连接起来,使其超出listview。从下面的示例和方法更新ListView属性(在listview_DragLeave方法中,您不希望折叠adorner):

    /// <summary>
    /// Gets/sets the ListView whose dragging is managed.  This property
    /// can be set to null, to prevent drag management from occuring.  If
    /// the ListView's AllowDrop property is false, it will be set to true.
    /// </summary>
    public ListView ListView
    {
        get { return listView; }
        set
        {
            if( this.IsDragInProgress )
                throw new InvalidOperationException( "Cannot set the ListView property during a drag operation." );

            if( this.listView != null )
            {
                #region Unhook Events

                this.listView.PreviewMouseLeftButtonDown -= listView_PreviewMouseLeftButtonDown;
                this.listView.PreviewMouseMove -= listView_PreviewMouseMove;
                this.listView.DragOver -= listView_DragOver;
                this.listView.DragLeave -= listView_DragLeave;
                this.listView.DragEnter -= listView_DragEnter;
                this.listView.GiveFeedback -= listView_GiveFeedback;
                this.listView.Drop -= listView_Drop;

                #endregion // Unhook Events
            }

            this.listView = value;

            if( this.listView != null )
            {
                if( !this.listView.AllowDrop )
                    this.listView.AllowDrop = true;

                #region Hook Events

                this.listView.PreviewMouseLeftButtonDown += listView_PreviewMouseLeftButtonDown;
                this.listView.PreviewMouseMove += listView_PreviewMouseMove;
                this.listView.DragOver += listView_DragOver;
                this.listView.DragLeave += listView_DragLeave;
                this.listView.DragEnter += listView_DragEnter;
                this.listView.GiveFeedback += listView_GiveFeedback;
                this.listView.Drop += listView_Drop;

                #endregion // Hook Events
            }
        }
    }

    void listView_GiveFeedback(object sender, GiveFeedbackEventArgs e)
    {
        if (this.ShowDragAdornerResolved)
            this.UpdateDragAdornerLocation();
    }

当我在测试的时候,我遇到另一个问题。就是说,如果我有一个弹出式动画窗口,展示第二个列表视图,装饰者就不再可见了。它只在页面上可见,而不是在弹出式窗口上。是否可能克服这个限制? - Nihar Ranjan
谢谢Nihar,不知道如何在窗口之外渲染,需要进行一些研究。 :-) - Dave Clemmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接