2010-07-16 5 views
0

Comment puis-je désactiver l'abandon de fichiers sur un System.Windows.Controls.WebBrowser? De la documentation il semblerait que ce comportement devrait être désactivé par défaut car il est hérité de la propriété UIElement.AllowDrop.Comment faire pour désactiver la suppression du contrôle wpf webbrowser

Cependant, je peux glisser et déposer des fichiers sur un contrôle WebBrowser par défaut. En plus de cela, il semble que je ne puisse pas désactiver ce comportement soi-disant inexistant. Par exemple, si je définir explicitement la valeur de la propriété à false dans XAML

<WebBrowser Name="webBrowser1" AllowDrop="False" /> 

..et/ou dans le code-behind, à savoir

webBrowser1.AllowDrop = false; 

Ensuite, je peux encore faire glisser et déposer des fichiers sur la contrôle. Comment puis-je désactiver ce comportement et supprimer le risque de sécurité qu'il crée?

Répondre

3

Ok après des heures et des heures de jeu, j'ai trouvé une solution qui fonctionne. Étant donné que j'utilise le navigateur Web standard WPF, je sais que je peux également utiliser les «attributs d'événements étendus» que Microsoft a introduits pour Internet Explorer.

L'événement que j'utilise pour désactiver l'abandon de fichiers sur le contrôle est ondragover. Essentiellement, je viens d'annuler l'événement à chaque fois que cela arrive.

<body ondragover="window.event.returnValue=false;"> 

Ce n'est pas vraiment idéal - mais ce qui est bon au sujet de cette technique est qu'elle permet une foule d'autres propriétés soient fixées ne sont pas disponibles directement à partir du code managé. Pour l'état de la barre de défilement, qui n'est pas exposé dans le code managé, peut être défini de cette manière.

<body scroll="no"> 
+0

euh, où mettez-vous cette étiquette de corps? –

+0

@Steffen Winkler - dans le code HTML qui est chargé dans le contrôle webbrowser. – Fraser

+0

ah, désolé n'a pas vu la balise web-navigateur. –

1

J'ai essayé un certain nombre de choses, mais il semble que le contrôle WebBrowser affirme sa primauté par-dessus tout ce que veut le moteur de disposition. Il n'obéit pas ou ne s'assied même pas vraiment dans l'arbre visuel, excepté l'emplacement de contrôle. Panel.ZIndex n'a eu aucun effet, etc.

Peut-être un contrôle de mise en page différente HTML serait dans l'ordre, celui qui se comporte mieux que l'interface ActiveX IE 6/7/8 ici:

Replacing .NET WebBrowser control with a better browser, like Chrome?

+0

J'ai besoin que le contrôle soit IE comme je fais interop entre le code managé et un composant COM dans le document chargé. Le composant COM ne fonctionne que dans IE. Le fait que le webbrowser wpf ait un tel trou de sécurité est fou! – Fraser

0

Il y a de façon un peu difficile à faire en réflexion:

1.) Obtenez l'instance COM navigateur underlaying (SHDocVw.IWebBrowser2) en invoquant le getter sur la propriété non instance publique "AxIWebBrowser2" .

2.) Définissez la propriété "RegisterAsDropTarget" sur false sur l'objet COM du navigateur en appelant également le setter de propriétés.

C'est tout.

var webBrowser = this.WebBrowser.GetType().InvokeMember("AxIWebBrowser2", 
                 BindingFlags.Instance | 
                 BindingFlags.NonPublic | 
                 BindingFlags.GetProperty, 
                 null, 
                 this.WebBrowser, 
                 new Object[] { }); 

webBrowser.GetType().InvokeMember("RegisterAsDropTarget", 
            BindingFlags.Instance | 
            BindingFlags.SetProperty, 
            null, 
            webBrowser, 
            new Object[] { false }); 

Conseil: "this.WebBrowser" est votre WPF instance WebBrowser (System.Windows.Controls.WebBrowser).

Questions connexes