Eu tenho um pequeno aplicativo WPF que possui uma janela com um controle de imagem. O controle de imagem mostra uma imagem do sistema de arquivos. Eu quero que o usuário possa arrastar a imagem e soltar na área de trabalho ou em qualquer lugar para salvá-la. Está funcionando bem.
Mas eu quero mostrar uma miniatura pequena da imagem junto com o cursor do mouse quando o usuário a arrastar. Assim como arrastamos uma imagem do Windows File Explorer para outro local. Como conseguir isso?
Comportamento atual de arrastar / soltar
Comportamento desejado
Aqui está o meu código XAML
<Grid>
<Image x:Name="img" Height="100" Width="100" Margin="100,30,0,0"/>
</Grid>
Aqui está o código 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;
}
}
c#
wpf
drag-and-drop
Riz
fonte
fonte
DragDrop.GiveFeedback
. Verifique este stackoverflow.com/questions/4878004/…Respostas:
Oficialmente, você deve usar a interface IDragSourceHelper para adicionar um bitmap de visualização a uma operação Drag & Drop.
Infelizmente, essa interface usa o método IDataObject :: SetData que não é implementado no nível COM pela classe .NET DataObject, apenas no nível .NET.
A solução é reutilizar um IDataObject fornecido pelo Shell para qualquer item do Shell (aqui um arquivo), usando a função SHCreateItemFromParsingName e o método IShellItem :: BindToHandler .
Observe que essas funções adicionam automaticamente formatos da área de transferência como o FileDrop, mas ainda precisamos usar o IDragSourceHelper para adicionar a imagem de visualização.
É assim que você pode usá-lo:
E aqui está o código:
fonte
Aqui, tente isso. Ele "pega" um quadrado vermelho transparente ao redor da posição do mouse e o "solta" quando você clica novamente.
Na realidade, você deseja criar o thread fazendo a interoperabilidade ao clicar e pará-lo (não abortar) quando você soltar.
E código por trás:
fonte