如何禁用wpf webbrowser控件上的drop

如何禁用System.Windows.Controls.WebBrowser上的文件丢弃? 从文档中可以看出,默认情况下应禁用此行为,因为它是从UIElement.AllowDrop属性inheritance的。

但是dy默认我可以将文件拖放到WebBrowser控件上。 除此之外,我似乎无法禁用这种假设的非默认行为。 例如,如果我在XAML中将该属性的值显式设置为false

 

..和/或代码隐藏,即

 webBrowser1.AllowDrop = false; 

然后我仍然可以将文件拖放到控件上。 如何禁用此行为并消除其创建的安全风险?

好好玩了几个小时后,我想出了一个有效的解决方案。 因为我使用标准WPF webbrowser,我知道我也可以使用Microsoft为Internet Explorer引入的“扩展事件属性”。

我用来禁止将文件拖放到控件上的事件是ondragover。 基本上我只是在发生这种情况时取消该事件。

  

这不是很理想 – 但是这种技术的好处在于它允许设置一系列其他属性,这些属性不能直接从托管代码中获得。 对于未在托管代码中公开的滚动条状态,可以通过这种方式设置。

  

我尝试了几件事,但看起来WebBrowser控件在布局引擎想要的任何东西之上都声称它的首要地位。 除了控制选址外,它不服从甚至真正坐在视觉树中。 Panel.ZIndex无效等。

也许是一个不同的HTML布局控件,这个控件在这里表现得比ActiveX IE 6/7/8更好:

用更好的浏览器替换.NET WebBrowser控件,比如Chrome?

反思有一点棘手的方法:

1.)通过在非公共实例属性“AxIWebBrowser2”上调用getter来获取底层浏览器COM实例(SHDocVw.IWebBrowser2)。

2.)通过调用属性setter,在浏览器COM对象上将属性“RegisterAsDropTarget”设置为false。

就这样。

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

提示:“this.WebBrowser”是您的WPF WebBrowser实例(System.Windows.Controls.WebBrowser)。