Перетаскивание в форму (но не веб-браузерный элемент управления в форме)

#.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 может сработать.