2010-07-16 33 views
0

如何禁用刪除System.Windows.Controls.WebBrowser上的文件?從文檔看來,這個行爲應該被默認禁用,因爲它是從UIElement.AllowDrop屬性繼承的。如何在wpf webbrowser控件上禁用刪除

然而dy默認我可以拖放文件到WebBrowser控件。除此之外,似乎我不能禁用這個據稱非默認行爲。例如,如果我的財產價值明確設置爲false XAML

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

..和/或代碼隱藏,即

webBrowser1.AllowDrop = false; 

然後我還可以將文件拖放到控制。如何禁用此行爲並消除其創建的安全風險?

回答

3

好經過數小時和數小時的玩這個我已經想出了一個解決方案。因爲我使用的是標準WPF瀏覽器,我知道我也可以使用Microsoft爲Internet Explorer推出的「擴展事件屬性」。

我用來禁用將文件放到控件上的事件是ondragover。基本上,我只是在事件發生時取消事件。

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

這不是真正的理想 - 但什麼是好關於這項技術的是,它允許並非來自託管代碼直接提供其他屬性被設置一大堆。對於未在託管代碼中公開的滾動條狀態,可以通過這種方式進行設置。

<body scroll="no"> 
+0

恩,你把那個身體標記放在哪裏? – 2014-03-21 08:03:02

+0

@Steffen Winkler - 在加載到web瀏覽器控件的html中。 – Fraser 2014-04-08 00:57:01

+0

啊,抱歉沒看到網頁瀏覽器的標籤。 – 2014-04-08 08:09:41

1

我嘗試了幾件事情,但它看起來像WebBrowser控件聲明其優先於佈局引擎想要的任何東西。除了控制選址外,它不服從甚至真正坐在視覺樹上。 Panel.ZIndex沒有效果等

也許不同的HTML佈局控制將是秩序,一種行爲比IE的ActiveX接口6/7/8這裏更好:

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

+0

我需要該控件是IE瀏覽器,因爲我在託管代碼和加載文檔中的COM組件之間進行互操作。 COM組件僅適用於IE。 wpf網頁瀏覽器有這樣一個安全漏洞的事實是瘋狂的! – Fraser 2010-07-16 16:55:48

0

有一個有點棘手的方式通過反射來做到這一點:

1)通過對非公共實例屬性調用的getter「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」 是你的web瀏覽器WPF實例(System.Windows.Controls.WebBrowser)。