[英]Dragging selected Item along with the mouse in WPF
我使用以下代码在我的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。
您需要创建一个展示您商品的Adorner
。
在DragDrop.DoDragDrop
之前将Adorner
添加到AdornerLayer
。
覆盖PreviewDragOver
以便在拖动期间更新Adorner
的位置。
在DragDrop.DoDragDrop
之后从AdornerLayer
删除Adorner
。
如果我理解正确并且您希望对拖放操作中拖动的对象有一些视觉反馈,那么您需要使用Adorner Layer 。 从链接页面:
Adorners是一种特殊类型的FrameworkElement,用于为用户提供视觉提示...... [和]在AdornerLayer中呈现,AdornerLayer是一个始终位于装饰元素之上的渲染表面
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.