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?
}
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>
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.
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);
}
}