2009-09-01 8 views

Répondre

0

La méthode standard de glisser-déposer ne fonctionne-t-elle pas?

http://www.codeproject.com/KB/cs/dragdrop.aspx

+0

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

0

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.

2

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()); 
     } 
    } 
1

"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

+0

Désolé mon mauvais, l'objet de l'événement n'a pas pu être utilisé en Winform. – Obble

0

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

Questions connexes