2017-08-01 1 views
0

Donc je travaillais sur cette application dans WinForm il y a environ un an et j'ai décidé de la recréer dans WPF pour la rendre encore plus ... À jour je suppose. Et j'ai juste couru dans mon premier problème, permettant de glisser n drop. Lorsque j'essaie de faire glisser et déposer un fichier, cela ne fonctionne pas car il me donne ce cercle noir avec une ligne qui le traverse.Comment autoriser correctement Drag n Drop dans WPF?

C'est ce que j'ai essayé jusqu'ici. Définition de AllowDrop = true.

Test quelques solutions sur Stack

testé ce un http://codeinreview.com/136/enabling-drag-and-drop-over-a-grid-in-wpf/

Mais combien je Google je ne peux pas trouver une réponse, alors je pose les pros. Dis-moi ce que je fais de mal et comment le ferais-je correctement? Ce est le code que j'ai jusqu'à présent

<Grid AllowDrop="True" Drop="Grid_Drop" DragOver="Grid_DragOver"> 
    <TextBox Name="tbSomething" Text="stuff" Margin="181,140,183,152"></TextBox> 
</Grid> 

    private void Grid_Drop(object sender, DragEventArgs e) 
    { 
     if (null != e.Data && e.Data.GetDataPresent(DataFormats.FileDrop)) 
     { 
      var data = e.Data.GetData(DataFormats.FileDrop) as string[]; 
      // handle the files here! 
     } 
    } 

    private void Grid_DragOver(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
     { 
      e.Effects = DragDropEffects.Copy; 
     } 
     else 
     { 
      e.Effects = DragDropEffects.None; 
     } 
    } 
+0

... avez-vous essayé de définir un point de rupture? – MickyD

Répondre

0

Le problème est que TextBox a son propre glisser-déposer des gestionnaires qui ne prennent pas en charge FileDrop, ce qui est la raison pour laquelle vous obtenez l'icône Drag.None.

Vous devez donc placer votre gestionnaire devant le gestionnaire TextBox. Comme ceci ...

<Grid> 
     <TextBox Name="tbSomething" Text="stuff" Margin="20" AllowDrop="True" PreviewDrop="Grid_Drop" PreviewDragOver="Grid_DragOver" ></TextBox> 
    </Grid> 

Les gestionnaires d'aperçu sont appelés avant les gestionnaires de zone de texte.

Puis, dans les manutentionnaires ...

private void Grid_Drop(object sender, DragEventArgs e) 
    { 
     if (null != e.Data && e.Data.GetDataPresent(DataFormats.FileDrop)) 
     { 
      var data = e.Data.GetData(DataFormats.FileDrop) as string[]; 
      e.Handled = true; 
      // handle the files here! 
     } 
    } 

    private void Grid_DragOver(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
     { 
      e.Effects = DragDropEffects.Copy; 
      e.Handled = true; 
     } 
     else 
     { 
      e.Effects = DragDropEffects.None; 
     } 
    } 

Notez le e.Handled = true déclarations! Sans cela, les gestionnaires de textbox écraseront simplement votre travail.

+0

Je suis sûr que cela fonctionnerait dans la plupart des cas, mais je reçois toujours le cercle. –

+0

Regardez le XAML. J'ai déplacé les gestionnaires de la grille à la zone de texte. Cela fonctionne dans votre cas. J'ai utilisé votre code! – AQuirky