如何禁止在System.Windows.Controls.WebBrowser上删除文件?从文档中可以看出,默认情况下应禁用此行为,因为它是从UIElement.AllowDrop属性继承的。
但是dy默认我可以将文件拖放到WebBrowser控件上。除此之外,我似乎无法禁用这种所谓的非默认行为。例如,如果我在XAML中将属性的值显式设置为false
<WebBrowser Name="webBrowser1" AllowDrop="False" />
..和/或代码隐藏,即
webBrowser1.AllowDrop = false;
然后我仍然可以将文件拖放到控件上。如何禁用此行为并消除其创建的安全风险?
答案 0 :(得分:4)
好好玩了几个小时后,我想出了一个有效的解决方案。因为我使用标准的WPF webbrowser,我知道我也可以使用Microsoft为Internet Explorer引入的“扩展事件属性”。
我用来禁止将文件拖放到控件上的事件是ondragover。基本上我只是在发生这种情况时取消该事件。
<body ondragover="window.event.returnValue=false;">
这不是很理想 - 但是这项技术的好处在于它允许设置一系列其他属性,这些属性不能直接从托管代码中获得。对于未在托管代码中公开的滚动条状态,可以通过这种方式设置。
<body scroll="no">
答案 1 :(得分:1)
我尝试了很多东西,但看起来WebBrowser控件在布局引擎想要的任何东西之上断言它的首要地位。除了控制选址外,它不服从甚至真正坐在视觉树中。 Panel.ZIndex没有效果,等等。
也许是一个不同的HTML布局控件,这个控件的行为比ActiveX IE 6/7/8接口要好:
Replacing .NET WebBrowser control with a better browser, like Chrome?
答案 2 :(得分:1)
通过反思来做这件事有点棘手:
1。)通过在非公共实例属性&#34; AxIWebBrowser2&#34;上调用getter获取底层浏览器COM实例(SHDocVw.IWebBrowser2)。
2。)设置属性&#34; RegisterAsDropTarget&#34;通过调用属性setter,在浏览器COM对象上为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 });
提示:&#34; this.WebBrowser&#34;是你的WPF WebBrowser实例(System.Windows.Controls.WebBrowser)。