[英]How to disable drop on wpf webbrowser control
如何禁用System.Windows.Controls.WebBrowser上的文件删除? 从文档看来,默认情况下应该禁用此行为,因为它是从UIElement.AllowDrop属性继承的。
但是,默认情况下,我可以将文件拖放到WebBrowser控件上。 除此之外,似乎我无法禁用此所谓的非默认行为。 例如,如果我在XAML中将属性的值显式设置为false
<WebBrowser Name="webBrowser1" AllowDrop="False" />
..和/或隐藏在代码中,即
webBrowser1.AllowDrop = false;
然后,我仍然可以将文件拖放到控件上。 如何禁用此行为并消除它造成的安全风险?
经过数小时的努力,我想出了一个可行的解决方案。 因为我使用的是标准WPF Web浏览器,所以我知道我也可以使用Microsoft为Internet Explorer引入的“扩展事件属性”。
我用于禁用将文件拖放到控件上的事件是ondragover。 本质上,我只是在事件发生时就取消它。
<body ondragover="window.event.returnValue=false;">
这并不是真正理想的方法-但是此技术的优点在于,它允许设置许多其他属性,这些属性不能直接从托管代码中获得。 对于滚动条状态(未在托管代码中公开),可以通过这种方式设置。
<body scroll="no">
我尝试了几件事,但看起来WebBrowser控件在布局引擎想要的任何东西之上都断言了其首要地位。 除了控制选址外,它不服从甚至不真正位于视觉树中。 Panel.ZIndex无效,等等。
也许会按顺序使用不同的HTML布局控件,该控件的行为比ActiveX IE 6/7/8接口好:
通过反射有一些棘手的方法:
1.)通过调用非公共实例属性“ AxIWebBrowser2”上的吸气剂,获得底层浏览器COM实例(SHDocVw.IWebBrowser2)。
2.)也可以通过调用属性设置器,在浏览器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)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.