Je dois capturer les événements glisser et déposer du contrôle WebBrowser dans WinForm C#. Y a-t-il un moyen?Implémentation de la fonctionnalité de glisser-déposer Winforms de contrôle WebBrowser C#
Répondre
La méthode standard de glisser-déposer ne fonctionne-t-elle pas?
WebBrowser Customization Vous pouvez également regarder dans IDocHostUIHandler :: GetDropTarget si vous voulez contrôler ce que le contrôle WebBrowser fait pendant les opérations de glisser-déposer. La méthode la plus simple pour connecter une implémentation de IDocHostUIHandler est de connecter l'interface ICustomDoc et toute sa méthode SetUIHandler (voir http://www.codeproject.com/csharp/advhost.asp). This method has memory leak cependant. Une autre méthode consiste à ignorer la classe webbrowser de Windows Form et use the ActiveX host support directly.
Mon Workarond:
utiliser une variable membre booléen pour détecter si vous appelez naviguer à partir du code à l'intérieur ou est appelé de navigation Code ouside. Implémentez l'événement "Navigating" (BeforeNavigating) et vérifiez s'il s'agissait d'un appel provenant de l'extérieur.
Exemple:
appel naviguer à l'intérieur:
private void NavigateLocal(string htmlFileName)
{
this.localNavigate = true;
this.webBrowser.Navigate(htmlFileName);
}
méthode d'événement
:
private void WebBrowser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
if (this.localNavigate)//inside call
{
this.localNavigate = false;
}
else //call from outside
{
this.DoDragDrop(e.Url.ToString());
}
}
"Fix" je l'utilise est de laisser le navigateur vous dire qu'il est en cours de draged, plus pop une image avec une capture d'écran, et gérer les événements C# normale.
[ComVisible(true)]
public class Communicator
{
private static frmMain m_mainWindow = null;
public Communicator(frmMain mainWindow)
{
m_mainWindow = mainWindow;
}
public void exit()
{
m_mainWindow.Close();
}
public void DragStarted(object e)
{
m_mainWindow.DoDragEnterFromScript();
}
}
private void frmMain_Load(object sender, EventArgs e)
{
webBrowser1.ObjectForScripting = new Communicator(this);;
webBrowser1.Navigate(@"about:blank");
}
public void DoDragEnterFromScript()
{
// Is this an executable, shortcut or batch?
Rectangle rect = new Rectangle(0, 0, webBrowser1.Size.Width, webBrowser1.Size.Height);
Bitmap bmp = new Bitmap(rect.Width, rect.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
Point ptCon;
ptCon = webBrowser1.PointToScreen(new Point(0, 0));
g.CopyFromScreen(ptCon, new Point(0, 0), webBrowser1.Size, CopyPixelOperation.SourceCopy);
pictureBox2.BackgroundImage = bmp;
//pictureBox2.BackColor = Color.Red;
webBrowser1.Visible = false;
pictureBox2.Visible = true;
pictureBox2.Location = new Point(0, 0);
pictureBox2.Size = webBrowser1.Size;
}
public void frmMain_DragEnter(object sender, DragEventArgs e)
{
if (!e.Data.GetDataPresent(DataFormats.FileDrop))
return;
string[] arrfiles = (string[])e.Data.GetData(DataFormats.FileDrop);
// SUCCESS
}
Et dans le fichier html
var holder = document.getElementsByTagName('body')[0];
holder.ondragover = function() {
window.external.DragStarted(event);
return true;
};
Ne pas oublier de cacher le picturebox après DragLeave/DragDrop
Désolé mon mauvais, l'objet de l'événement n'a pas pu être utilisé en Winform. – Obble
La meilleure façon que j'ai trouvé est de gérer l'événement Navigating
dans le contrôle par l'hôte. Lorsque vous déposez des fichiers sur le contrôle, cet événement se déclenche et vous pouvez récupérer les noms de fichier à ce moment-là. L'astuce est que vous devez savoir ce qui constitue une navigation légale (c'est-à-dire un document qui est navigué directement par rapport à un fichier qui est abandonné). La plupart des applications qui gèrent des événements de dépôt utilisent un document spécifique ou un ensemble de documents connus pour que cela ne pose pas de problème. Une autre option consiste à gérer l'opération de suppression via window.ondrop
dans le document HTML avec du code JavaScript, mais vous ne pouvez récupérer que les données de fichier et le nom de fichier, pas le chemin d'accès complet.
Pour plus d'informations sur les deux approches un coup d'oeil à ce blog: https://weblog.west-wind.com/posts/2017/Mar/10/Dragging-and-Dropping-Images-and-Files-into-the-Web-Browser-Control
- 1. Implémentation personnalisée de la fonctionnalité "queue -f" dans C
- 2. Implémentation de la fonctionnalité friend (disponible en C++) dans Java
- 3. IE8, Flash et le contrôle WinForms WebBrowser
- 4. Implémentation de la fonctionnalité "Recherche" sur le site Web
- 5. Contrôle WEBBrowser; Est-il possible de sauvegarder le contenu Webbrowser dans une base de données SQL?
- 6. Le contrôle WebBrowser n'imprimera pas à partir de C#
- 7. Modification de l'agent utilisateur du contrôle WebBrowser
- 8. Obtention de DocumentSteam pour les sites Web html sans utiliser de contrôle Winforms WebBrowser pour l'analyse?
- 9. L'application se bloque lors de la fermeture du contrôle WebBrowser
- 10. Collision de contrôle dans winforms
- 11. C#: implémentation de SkipLast
- 12. Implémentation de l'interface C#
- 13. Retirer Javascript/ChildElement de contrôle WebBrowser
- 14. Propriétés de l'événement WebBrowser?
- 15. C# Accédez aux ancres dans le contrôle WebBrowser
- 16. wpf: modifier la taille de police pour le contrôle WebBrowser
- 17. Chargement du texte de la mémoire dans le contrôle WebBrowser
- 18. Winforms C# - Ajout de formulaires à un contrôle FlowPanel
- 19. Alternative au contrôle Webbrowser
- 20. lien hypertexte d'interception de C# webbrowser
- 21. Le contrôle WinForms WebBrowser prend-il en charge le contenu mhtml défini par la propriété DocumentText?
- 22. Automatisation du contrôle .NET webbrowser
- 23. Contrôle WinForms intégré à la sous-classe?
- 24. Contrôle WebBrowser Annuler/Rétablir question
- 25. C# Winforms Contrôle Transparent permettant le Clic
- 26. Contrôle de grille .NET (WinForms) avec capacités de réduction/expansion
- 27. Le contrôle WebBrowser échoue sur Vista
- 28. Obtenir la valeur de défilement à partir d'un contrôle WebBrowser C#
- 29. C# WinForms UserControl Mouse Aide de l'événement
- 30. C# webbrowser rafraîchissement brut
WinForm en C# ne prend pas en charge la fonctionnalité glisser-déposer pour les contrôles WebBrowser. Vous auriez besoin d'écrire votre propre classe pour le gérer. WPF fournit des fonctionnalités de glisser-déposer pour les contrôles WebBrowser. – TheJediCowboy