【发布时间】:2020-07-17 08:35:46
【问题描述】:
我有一个小型 WPF 应用程序,它有一个带有图像控件的窗口。图像控件显示来自文件系统的图像。我希望用户能够将图像拖放到其桌面或任何地方以保存它。它工作正常。
但是当用户拖动它时,我想显示小图像缩略图和鼠标光标。就像我们将图像从 Windows 文件资源管理器拖到其他地方一样。如何实现?
拖放的当前行为
期望的行为
这是我的 XAML 代码
<Grid>
<Image x:Name="img" Height="100" Width="100" Margin="100,30,0,0"/>
</Grid>
这里是 C# 代码
public partial class MainWindow : Window
{
string imgPath;
Point start;
bool dragStart = false;
public MainWindow()
{
InitializeComponent();
imgPath = "C:\\Pictures\\flower.jpg";
ImageSource imageSource = new BitmapImage(new Uri(imgPath));
img.Source = imageSource;
window.PreviewMouseMove += Window_PreviewMouseMove;
window.PreviewMouseUp += Window_PreviewMouseUp;
window.Closing += Window_Closing;
img.PreviewMouseLeftButtonDown += Img_PreviewMouseLeftButtonDown;
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
window.PreviewMouseMove -= Window_PreviewMouseMove;
window.PreviewMouseUp -= Window_PreviewMouseUp;
window.Closing -= Window_Closing;
img.PreviewMouseLeftButtonDown -= Img_PreviewMouseLeftButtonDown;
}
private void Window_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (!dragStart) return;
if (e.LeftButton != MouseButtonState.Pressed)
{
dragStart = false; return;
}
Point mpos = e.GetPosition(null);
Vector diff = this.start - mpos;
if (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
{
string[] file = { imgPath };
DataObject d = new DataObject();
d.SetData(DataFormats.Text, file[0]);
d.SetData(DataFormats.FileDrop, file);
DragDrop.DoDragDrop(this, d, DragDropEffects.Copy);
}
}
private void Img_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.start = e.GetPosition(null);
dragStart = true;
}
private void Window_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
dragStart = false;
}
}
【问题讨论】:
-
也许你会使用
DragDrop.GiveFeedback。检查这个stackoverflow.com/questions/4878004/… -
@RaoHammasHussain 它正在尝试更改鼠标光标,这不是我需要的。
-
只是一个想法,也许你可以做一些事情,比如创建一个隐藏容器,在拖动时显示并让子当前拖动图像,并且该容器跟随鼠标光标。
-
@RaoHammasHussain 隐藏容器有一个问题,它会保留在窗口内。当鼠标离开窗口时,我们无法将其显示在外面。
-
得到了一些应该起作用的东西..试试这个人stackoverflow.com/questions/1175870/…
标签: c# wpf drag-and-drop