简体   繁体   English

在WPF中拖动选定的项目和鼠标

[英]Dragging selected Item along with the mouse in WPF

I am using the following code for performing Drag & Drop in my StackPanel Childran, 我使用以下代码在我的StackPanel Childran中执行拖放操作,

XAML XAML

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="601" Width="637">

<StackPanel Name="sp" AllowDrop="True" Background="SkyBlue" PreviewMouseLeftButtonDown="sp_PreviewMouseLeftButtonDown" PreviewMouseLeftButtonUp="sp_PreviewMouseLeftButtonUp" PreviewMouseMove="sp_PreviewMouseMove"
            DragEnter="sp_DragEnter" Drop="sp_Drop">
    <Image Source="/Assets/Image1.jpg" Height="100" Width ="100"/>
    <Image Source="/Assets/Image2.jpg" Height="100" Width ="100"/>
    <Image Source="/Assets/Image3.jpg" Height="100" Width ="100"/>
    <Image Source="/Assets/Image4.jpg" Height="100" Width ="100"/>
    <Image Source="/Assets/Image5.jpg" Height="100" Width ="100"/>
</StackPanel>

Code Behind 代码背后

 public partial class Window1 : Window { public Window1() { InitializeComponent(); } private bool _isDown; private bool _isDragging; private Point _startPoint; private UIElement _realDragSource; private UIElement _dummyDragSource = new UIElement(); 
    private void sp_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (e.Source == this.sp)
        {
        }
        else
        {              
            _isDown = true;                             
            _startPoint = e.GetPosition(this.sp);                       
        }
    }

    private void sp_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        _isDown = false;
        _isDragging = false;
        _realDragSource.ReleaseMouseCapture();
    }

    private void sp_PreviewMouseMove(object sender, MouseEventArgs e)
    {          
        if (_isDown)
        {
            if ((_isDragging == false) && ((Math.Abs(e.GetPosition(this.sp).X - _startPoint.X) > SystemParameters.MinimumHorizontalDragDistance) ||
                (Math.Abs(e.GetPosition(this.sp).Y - _startPoint.Y) > SystemParameters.MinimumVerticalDragDistance)))
            {
                _isDragging = true;
                _realDragSource = e.Source as UIElement;
                _realDragSource.CaptureMouse();
               DragDrop.DoDragDrop(_dummyDragSource, new DataObject("UIElement", e.Source, true), DragDropEffects.Move);
            }              
        }
    }

    private void sp_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent("UIElement"))
        {
            e.Effects = DragDropEffects.Move;               
        }
    }

    private void sp_Drop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent("UIElement"))
        {              
            UIElement droptarget = e.Source as UIElement;              
            int droptargetIndex=-1, i =0;
            foreach (UIElement element in this.sp.Children)
            {
                if (element.Equals(droptarget))
                {
                    droptargetIndex = i;
                    break;
                }
                i++;
            }
            if (droptargetIndex != -1)
            {
                this.sp.Children.Remove(_realDragSource);
                this.sp.Children.Insert(droptargetIndex, _realDragSource);
            }

            _isDown = false;
            _isDragging = false;
            _realDragSource.ReleaseMouseCapture();
        }
    }  
}

What i am trying to implement is, I need to drag the clicked item along with my click and drag. 我想要实现的是,我需要拖动点击的项目以及我的点击和拖动。 In this implementation, While drag and drop a small rectangle dotted like selection appears and then it drops to the place where mouse pointer leaves. 在这个实现中,当拖放一个点状像选择的小矩形时,它会下降到鼠标指针离开的地方。 How can i hold that image along with my selection (drag & drop) 如何将该图像与我的选择一起保持(拖放)

Thanks in Advance, 提前致谢,

StezPet. StezPet。

You'll want to create an Adorner which shows your item. 您需要创建一个展示您商品的Adorner

Add the Adorner to the AdornerLayer before DragDrop.DoDragDrop . DragDrop.DoDragDrop之前将Adorner添加到AdornerLayer

Override PreviewDragOver in order to update the position of the Adorner during drag. 覆盖PreviewDragOver以便在拖动期间更新Adorner的位置。

Remove the Adorner from the AdornerLayer after DragDrop.DoDragDrop . DragDrop.DoDragDrop之后从AdornerLayer删除Adorner

If I understand you correctly and you want to have some visual feedback of the object that is being dragged in a drag and drop operation, then you'll need to use the Adorner Layer . 如果我理解正确并且您希望对拖放操作中拖动的对象有一些视觉反馈,那么您需要使用Adorner Layer From the linked page: 从链接页面:

Adorners are a special type of FrameworkElement, used to provide visual cues to a user... [and] are rendered in an AdornerLayer, which is a rendering surface that is always on top of the adorned element Adorners是一种特殊类型的FrameworkElement,用于为用户提供视觉提示...... [和]在AdornerLayer中呈现,AdornerLayer是一个始终位于装饰元素之上的渲染表面

You can find a good article explaining how to do this with a code example in the WPF: Drag Drop Adorner post on Code Blitz. 您可以使用WPF中的代码示例找到一篇很好的文章来解释如何执行此操作在Code Blitz上拖放Adorner帖子。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM