2010-07-16 3 views
0

System.Windows.Controls.WebBrowser에서 파일 삭제를 어떻게 비활성화 할 수 있습니까? 설명서에서이 동작은 UIElement.AllowDrop 속성에서 상속되므로 기본적으로 사용하지 않도록 설정해야합니다.wpf webbrowser 컨트롤 드롭 해제 방법

그러나 기본적으로 WebBrowser 컨트롤에 파일을 끌어다 놓을 수 있습니다. 이것에 더해서 나는 아마도이 기본이 아닌 행동을 사용하지 않을 수 없다. 예를 들어 내가 명시 적으로, 즉 다음

webBrowser1.AllowDrop = false; 

나는 여전히 드래그 앤에 파일을 드롭 할 수 있습니다,

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

.. 그리고/또는 코드 숨김에서 XAML

에서 false로 속성 값을 설정하는 경우 제어. 이 동작을 비활성화하고 생성하는 보안 위험을 제거하려면 어떻게합니까?

답변

3

확인 : Panel.ZIndex 등 영향, 아마도

다른 HTML 레이아웃 제어 순서에있을 것입니다, 액티브 X IE 6/7/8 여기에 인터페이스보다 더 나은 동작 하나 없었다 이 작업을 몇 시간과 몇 시간 만에 끝낸 후에 나는 작동하는 하나의 솔루션을 생각해 내었습니다. 나는 표준 WPF 웹 브라우저를 사용하고 있기 때문에 Microsoft가 Internet Explorer에 도입 한 "Extended Event Attributes"도 사용할 수 있다는 것을 알고 있습니다.

컨트롤에 파일을 놓지 못하게하는 이벤트는 ondragover입니다. 본질적으로 이벤트가 발생할 때마다 이벤트를 취소합니다.

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

이 정말 적합하지 않습니다 -하지만이 기술에 대한 좋은 것은 관리 코드에서 직접 사용할 수없는 설정해야 할 다른 속성의 전체 호스트 수 있다는 것입니다. 관리 코드에 표시되지 않는 스크롤 막대 상태의 경우이 방법으로 설정할 수 있습니다.

<body scroll="no"> 
+0

어, 그 시체 태그는 어디에 두시겠습니까? –

+0

@Steffen Winkler - 웹 브라우저 컨트롤에로드되는 HTML 내. – Fraser

+0

아, 죄송합니다 웹 브라우저 태그를 보지 못했습니다. –

1

나는 두 가지 시도를했지만 WebBrowser 컨트롤이 레이아웃 엔진이 원하는 모든 것보다 우선 순위를 주장하는 것처럼 보입니다. 컨트롤 위치 지정을 제외하고는 시각적 트리에 순종하거나 실제로 앉아 있지 않습니다.

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

+0

로드 된 문서에서 관리 코드와 COM 구성 요소 사이에 interop을 수행 할 때 컨트롤이 IE가되어야합니다. COM 구성 요소는 IE에서만 작동합니다. wpf webbrowser에 보안 구멍이 있다는 사실은 미친 짓입니다! – Fraser

0

반영하여이 작업을 수행 할 수있는 조금 까다로운 방법이 있습니다 :

1) "AxIWebBrowser2"비 공공 인스턴스 속성에 대한 게터를 호출하여 기저의 브라우저 COM 인스턴스 (SHDocVw.IWebBrowser2를) 가져가 .

2) 브라우저 COM 개체에서 속성 setter를 호출하여 속성 "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의 웹 브라우저 인스턴스 (System.Windows.Controls.WebBrowser)입니다.

관련 문제