#.net #winforms #drag-and-drop #webbrowser-control
#.net #winforms #перетаскивание #веб-браузерный элемент управления
Вопрос:
Я пишу приложение Windows Forms (C #), в котором есть веб-браузерный элемент управления (среди нескольких других кнопок и текстовых полей). Я хочу иметь возможность перетаскивать файл в любое место формы. Проблема в том, что по умолчанию веб-браузер попытается отобразить любой файл, помещенный в его элемент управления; я не хочу этого, поскольку сначала я должен выполнить некоторую предварительную обработку файла. Веб-браузерный элемент управления предоставляет свойство с именем AllowWebBrowserDrop, которому я присвоил значение false, чтобы отключить это поведение. Однако в результате я ничего не могу перенести в веб-браузерный элемент управления (отзыв «не разрешено»). Веб-браузерный элемент управления занимает большую часть пространства, поэтому было бы неубедительно, если бы вам пришлось удалять файл где-нибудь в свободном пространстве. Как я могу включить удаление файла в любом месте моей формы без того, чтобы веб-браузерный элемент управления пытался его отобразить?
Я думаю, я должен добавить, что у меня есть AllowDrop для моей формы, установленный в true, и есть обработчики для DragEnter и DragDrop. Для параметра AllowWebBrowserDrop в моем веб-браузере установлено значение false. Все остальное имеет настройки по умолчанию.
Ответ №1:
В зависимости от того, что вы делаете с WebBrowser
, вы можете обработать Navigating
событие, которое срабатывает перед переходом браузера. Затем определите, хотите ли вы обработать удаление, проверив URL. Например:
private void browser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
if (e.Url.IsFile)
{
// Prevent navigation
e.Cancel = true;
// Fire your other OnDrop code
}
}
Чтобы это сработало, вы хотели бы оставить AllowWebBrowserDrop
set равным true
.
Если это работает для вашего бизнес-примера, отлично; в противном случае вы, вероятно, застряли, обрабатывая оконные сообщения напрямую, как уже упоминалось, что не очень весело.
Комментарии:
1. Это не совсем то, что я хочу, но для моих целей этого достаточно.
Ответ №2:
Не могли бы вы добавить прозрачный фон, окрашенный Panel
в более высокий z-порядок, чем веб-браузер над ним, и позволить панели обрабатывать перетаскивание?
Комментарии:
1. imo, это, вероятно, сработает для отслеживания события drop, но также, вероятно, приведет к поломке приложения, поскольку winforms только «подделывает» прозрачный фон. Это также, вероятно, исключит другие важные события.
2. возможно, перезапишите WndProc и перенаправьте все события в базовый веб-браузер, за исключением того, что событие Drop может сработать.