web-dev-qa-db-fra.com

Glisser-déposer des fichiers dans WPF

Je dois déposer un fichier image dans mon application WPF. À l'heure actuelle, un événement se déclenche lorsque je dépose les fichiers, mais je ne sais pas comment procéder. Comment puis-je obtenir l'image? L'objet sender est-il l'image ou le contrôle?

private void ImagePanel_Drop(object sender, DragEventArgs e)
{
    //what next, dont know how to get the image object, can I get the file path here?
}
95
Eamonn McEvoy

Ceci est fondamentalement ce que vous voulez faire.

private void ImagePanel_Drop(object sender, DragEventArgs e)
{

  if (e.Data.GetDataPresent(DataFormats.FileDrop))
  {
    // Note that you can have more than one file.
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

    // Assuming you have one file that you care about, pass it off to whatever
    // handling code you have defined.
    HandleFileOpen(files[0]);
  }
}

De plus, n'oubliez pas de connecter l'événement en XAML et de définir l'attribut AllowDrop.

<StackPanel Name="ImagePanel" Drop="ImagePanel_Drop" AllowDrop="true">
    ...
</StackPanel>
188
A.R.

Le fichier image est contenu dans le paramètre e, qui est une instance de la classe DragEventArgs .
(Le paramètre sender contient une référence à l'objet qui a déclenché l'événement.)

Plus précisément, vérifiez le e.Data membre ; comme l'explique la documentation, cela renvoie une référence à l'objet de données ( IDataObject ) contenant les données de l'événement glisser.

L'interface IDataObject fournit un certain nombre de méthodes pour récupérer l'objet de données recherché. Vous voudrez probablement commencer par appeler la méthode GetFormats afin de connaître le format des données avec lesquelles vous travaillez. (Par exemple, s'agit-il d'une image réelle ou simplement du chemin d'accès à un fichier image?)

Ensuite, une fois que vous avez identifié le format du fichier glissé, vous appelez l'une des surcharges spécifiques de la méthode GetData pour récupérer réellement l'objet de données dans un format particulier.

35
Cody Gray

De plus à répondre de A.R. Veuillez noter que si vous voulez utiliser TextBox pour supprimer, vous devez connaître les éléments suivants.

TextBox semble avoir déjà un traitement par défaut pour DragAndDrop. Si votre objet de données est un String, cela fonctionne simplement. Les autres types ne sont pas gérés et vous obtenez le effet de souris interdit et votre gestionnaire de dépôt n'est jamais appelé.

Il semble que vous puissiez activer votre propre gestion avec e.Handled to true dans un gestionnaire d'événements PreviewDragOver.

XAML

<TextBox AllowDrop="True"    x:Name="RtbInputFile"      HorizontalAlignment="Stretch"   HorizontalScrollBarVisibility="Visible"  VerticalScrollBarVisibility="Visible" />

C #

RtbInputFile.Drop += RtbInputFile_Drop;            
RtbInputFile.PreviewDragOver += RtbInputFile_PreviewDragOver;

private void RtbInputFile_PreviewDragOver(object sender, DragEventArgs e)
{
    e.Handled = true;
}

private void RtbInputFile_Drop(object sender, DragEventArgs e)
{
     if (e.Data.GetDataPresent(DataFormats.FileDrop))
     {
                // Note that you can have more than one file.
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                var file = files[0];                
                HandleFile(file);  
     }
}
9
Developer