【问题标题】:Dragging selected Item along with the mouse in WPF在 WPF 中使用鼠标拖动选定的项目
【发布时间】:2014-03-25 17:14:56
【问题描述】:

我正在使用以下代码在我的 StackPanel Childran 中执行拖放操作,

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>

代码背后

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();
        }
    }  
}

我要实现的是,我需要将单击的项目与单击并拖动一起拖动。在这个实现中,当拖放时,会出现一个像选择点一样的小矩形,然后它会下降到鼠标指针离开的地方。我怎样才能将图像与我的选择一起保存(拖放)

提前致谢,

StezPet.

【问题讨论】:

    标签: wpf drag-and-drop wpf-controls wpf-animation


    【解决方案1】:

    如果我对您的理解正确,并且您希望对拖放操作中被拖动的对象有一些视觉反馈,那么您需要使用Adorner Layer。从链接页面:

    Adorner 是一种特殊类型的 FrameworkElement,用于向用户提供视觉提示... [并且] 在 AdornerLayer 中呈现,它是始终位于装饰元素顶部的呈现表面

    您可以在 Code Blitz 上的 WPF: Drag Drop Adorner 帖子中找到一篇解释如何使用代码示例执行此操作的好文章。

    【讨论】:

      【解决方案2】:

      您需要创建一个 Adorner 来显示您的项目。

      Adorner 添加到AdornerLayer 之前的DragDrop.DoDragDrop

      覆盖PreviewDragOver 以便在拖动过程中更新Adorner 的位置。

      AdornerLayer 之后的DragDrop.DoDragDrop 中删除Adorner

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-11
        相关资源
        最近更新 更多