2010-08-21 5 views
0

Chaque fois que je veux laisser l'utilisateur faire glisser un contrôle, j'appelle DoDragDrop de ce contrôle.DoDragDrop() d'un autre thread

Le drag & drop fonctionne très bien, mais j'ai problème avec les choses autour de:

  1. DoDragDrop bloquant complètement la forme, aucun événement timer sauts, aucun message de peinture traitées.

  2. Blocage DoDragDrop non seulement pour l'opération de déplacement glisser &, mais jusqu'à ce que le programme cible finisse avec l'événement de suppression (code d'extraction I.E. explorer.exe). Selon le code de l'autre programme est nul.

Je pensais appeler DoDragDrop à partir d'un nouveau thread.

essayé ceci:

Thread dragThread = new Thread(() => 
{ 
    Form frm = new Form(); 
    frm.DoDragDrop("data", DragDropEffects.All); 
}); 

dragThread.SetApartmentState(ApartmentState.STA); 
dragThread.IsBackground = true; 
dragThread.Start(); 

mais il ne semble pas fonctionner. Je veux dire: lorsque vous faites DoDragDrop à partir d'un autre thread comme celui-ci, d'autres contrôles dans mon programme ou d'autres programmes ne reçoivent pas glisser & messages.

D'autres solutions?

+0

Que diriez-vous de fournir un peu plus d'informations sur l'échec que « ne pas travail"? – Timwi

+0

lorsque vous effectuez DoDragDrop à partir d'un autre thread comme celui-ci, d'autres contrôles dans mon programme ou d'autres programmes ne reçoivent pas de glisser-déposer des messages. – DxCK

Répondre

1

Vous devez oublier d'utiliser un thread, qui va uniquement envoyer des notifications D + D aux fenêtres qui ont été créées sur ce thread. Ce qui ne sera pas vos contrôles.

Je ne peux pas faire grand-chose avec un diagnostic "code is sucks". L'appel DoDragDrop() lui-même bloquera en effet jusqu'à ce que le bouton de la souris soit relâché. Une autre boucle de message, interne au code COM prendra le relais et délivrera les messages Windows. Les messages de minuterie et de peinture doivent être livrés normalement. Un diagnostic est très difficile à faire jusqu'à ce que vous postez un code de repro.

+0

Je soupçonne que ce dont il pourrait parler est que Explorer se lance dans une opération de copie après la suppression et provoque le blocage de son interface utilisateur lors de la copie. Je sais qu'il le fait pour WinRAR ... – Timwi

+2

Il existe un protocole D + D pour permettre à l'application de livrer les données de manière tardive. C'est très difficile de démarrer dans un programme .NET, certainement pas "data". –

1

Vous souhaitez probablement que le DoDragDrop quitte et exécute le travail de manière asynchrone.

Here is the answer.

4

Le procédé DoDragDrop arrête le traitement d'événements jusqu'à ce premier événement de souris (par exemple déplacement de la souris). Donc, la solution que je trouve est très simple - il suffit de simuler l'événement de la souris avec la même position de la souris juste avant d'appeler DoDragDrop: semble


void XYZControl_MouseDown(object sender, MouseEventArgs e) 
{ 
    var senderControl = (Control) sender; 
    ... 
    Cursor.Position = senderControl.PointToScreen(new Point(e.X, e.Y)); // Workaround! 
    if (DoDragDrop(senderControl, DragDropEffects.Move) == DragDropEffects.Move) 
    { 
    ... 
    } 
.... 
} 
Questions connexes