2010-12-15 170 views
1

J'écris une application Windows Forms (C#) qui a un contrôle WebBrowser (parmi quelques autres boutons et zones de texte). Je veux être en mesure de déposer un fichier n'importe où sur le formulaire. Le problème est que, par défaut, WebBrowser tentera de rendre tout fichier déposé sous son contrôle; Je ne veux pas cela car je dois d'abord effectuer un pré-traitement sur le fichier. Le contrôle WebBrowser fournit une propriété nommée AllowWebBrowserDrop, que j'ai définie sur false pour désactiver ce comportement. Cependant, le résultat est que je ne peux rien supprimer sur le contrôle WebBrowser (commentaires "non autorisés"). Le contrôle WebBrowser occupe la majorité de l'espace, il serait donc un peu boiteux si vous deviez déposer le fichier dans l'espace libre quelque part. Comment puis-je activer la suppression d'un fichier n'importe où sur mon formulaire sans que le contrôle WebBrowser essaie de le rendre?Glissez et déposez sur un formulaire (mais pas un contrôle WebBrowser sur le formulaire)

Je suppose que je devrais ajouter que j'ai AllowDrop sur mon formulaire défini sur true et avoir des gestionnaires pour DragEnter et DragDrop. J'ai AllowWebBrowserDrop sur mon WebBrowser défini sur false. Tout le reste a les paramètres par défaut.

Répondre

2

En fonction de ce que vous faites avec le WebBrowser, vous pouvez gérer l'événement Navigating, qui se déclenche avant que le navigateur navigue. Ensuite, déterminez si vous voulez gérer la chute en vérifiant l'URL. Par exemple:

private void browser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
    if (e.Url.IsFile) 
    { 
     // Prevent navigation 
     e.Cancel = true; 

     // Fire your other OnDrop code 
    } 
} 

Pour que cela fonctionne, vous voulez laisser AllowWebBrowserDrop ensemble à true.

Si cela fonctionne pour votre business case, génial; Dans le cas contraire, vous êtes probablement bloqué en manipulant les messages de la fenêtre directement, comme mentionné, ce qui n'est pas très amusant.

+0

Ce n'est pas tout à fait ce que je veux, mais pour mes besoins c'est assez bon. – Luke

0

Pourriez-vous ajouter un arrière-plan transparent de couleur Panel avec un ordre-z plus élevé que le WebBrowser au-dessus et laisser le panneau gérer la baisse?

+0

imo, ceci est susceptible de fonctionner pour attraper l'événement de baisse, mais également susceptible de casser l'application pendant que les winforms seulement "fausse" les arrière-plans transparents. Il est également susceptible d'exclure d'autres événements importants. –

+1

peut remplacer le WndProc et transmettre les événements _all_ au WebBrowser sous-jacent, sauf que l'événement Drop peut fonctionner. –