Как отключить сброс на элемент управления веб-браузера wpf - PullRequest
1 голос
/ 16 июля 2010

Как я могу отключить сброс файлов на System.Windows.Controls.WebBrowser? Из документации может показаться, что это поведение должно быть отключено по умолчанию, поскольку оно наследуется от свойства UIElement.AllowDrop.

Однако по умолчанию я могу перетаскивать файлы на элемент управления WebBrowser. В дополнение к этому, кажется, я не могу отключить это, предположительно, поведение не по умолчанию. Например, если я явно установил значение свойства в false в XAML

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

.. и / или в выделенном коде, т.е.

webBrowser1.AllowDrop = false;

Тогда я все еще могу перетаскивать файлы на элемент управления. Как я могу отключить это поведение и устранить угрозу безопасности, которую оно создает?

Ответы [ 3 ]

4 голосов
/ 18 июля 2010

Хорошо, после нескольких часов игры с этим я придумал одно решение, которое работает.Поскольку я использую стандартный веб-браузер WPF, я знаю, что могу также использовать «Расширенные атрибуты событий», которые Microsoft представила для Internet Explorer.

Событие, которое я использую, чтобы отключить перетаскивание файлов на элемент управления, вызывается.По сути, я просто отменяю событие всякий раз, когда оно происходит так.

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

Это не совсем идеально, но что хорошо в этом методе, так это то, что он позволяет устанавливать целый ряд других свойств, которыенедоступно напрямую из управляемого кода.Для состояния полосы прокрутки, которое не отображается в управляемом коде, может быть установлено следующим образом.

<body scroll="no">
1 голос
/ 06 февраля 2018

Существует несколько хитрый способ сделать это с помощью Reflection:

1.) Получить нижележащий COM-экземпляр браузера (SHDocVw.IWebBrowser2), вызвав метод получения для не открытого свойства экземпляра "AxIWebBrowser2".

2.) Установите для свойства "RegisterAsDropTarget" значение false в COM-объекте браузера, также вызывая установщик свойств.

Вот и все.

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).

1 голос
/ 16 июля 2010

Я попробовал пару вещей, но похоже, что элемент управления WebBrowser отстаивает свое превосходство над всем, что хочет механизм компоновки. Он не подчиняется и даже не сидит в визуальном дереве, за исключением размещения элементов управления. Panel.ZIndex не имел никакого эффекта и т. Д.

Возможно, здесь будет использоваться другой элемент управления макетом HTML, который ведет себя лучше, чем интерфейс ActiveX IE 6/7/8:

Замена элемента управления .NET WebBrowser более совершенным браузером, таким как Chrome?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...