Я создал приложение Winforms, используя .NET 4.7.2 и CEFSharp 84.4.10.
У меня загружен веб-сайт со ссылками на различные файлы PDF, TXT, DOCX и т. д. HTML для ссылок выглядит следующим образом:
<a href="relative_url/filename.ext" target="_blank">icon_here</a>
Поэтому, когда я, например, нажимаю ссылку на docx, CEFSharp открывает пустое окно поверх моего приложения, а затем открывает диалоговое окно сохранения файла. Когда вы нажимаете «Сохранить» в диалоговом окне файла, оно закрывается, но пустое окно остается открытым.
Я хочу сделать следующее:
Не открывайте пустое окно.
Определить загружаемый тип/мим файла (мое приложение загружает только мой сайт), и если они имеют формат PDF, TXT или DOCX, то автоматически загружаются во временную папку, не отображая диалоговое окно сохранения, и открываются в средстве просмотра ОС по умолчанию.
Если нет ни одного из вышеперечисленных типов, покажите диалоговое окно «Сохранить файл» и позвольте пользователю загрузить его туда, куда он хочет.
Я могу отдельно разобраться, как открыть файл в средстве просмотра ОС по умолчанию, здесь я хочу сосредоточиться на автоматической загрузке определенных типов файлов.
Я часами искал примеры того, как это сделать, и пришел с пустыми руками.
Я думал, что смогу определить тип файла в DownloadHandler.OnBeforeDownload, а затем, основываясь на следующем сообщении, просто установите для showDialogue значение false в обратном вызове, а затем в DownloadHandler.OnDownloadUpdated определите downloadItem.IsComplete, а затем запустите файл, если это правильный тип.
Принудительно загрузить CEFSharp без отображения диалогового окна
Однако, когда я попробовал это, я столкнулся со следующими проблемами:
Пустое окно по-прежнему открывается и остается открытым.
Я обнаружил, что если я устанавливаю точку останова в DownloadHandler.OnDownloadUpdated, я вижу, что ReceivedBytes переходят от нуля к TotalBytes, а InProgress является истинным, а затем, когда я продолжаю нажимать F5, чтобы продолжить, ReceivedBytes возвращается к нулю, а InProgress имеет значение false , но IsComplete и IsCanceled все время остаются ложными. Я ожидал, что после завершения загрузки IsComplete будет правдой.
Мне нравится работать с CEFShap, и любые указания или примеры, которые могут быть предоставлены, будут высоко оценены.
Спасибо за ваше время.
ОБНОВЛЕНИЕ 1:
Код, который я пробовал, выглядит следующим образом:
ПРИМЕЧАНИЕ. Я обнаружил, что после назначения пути к обратному вызову. Продолжить в OBeforeDownload исправлено, что IsComplete не устанавливается на истинную проблему. Однако проблема глухого оконного проема остается.
В хостинге winform CEFSharp я инициализировал элемент управления следующим образом:
browser = new ChromiumWebBrowser("https://localhost:44393/Default.aspx");
var downloadHandler = new DownloadHandler();
browser.DownloadHandler = downloadHandler;
В DownloadHandler.cs:
public class DownloadHandler : IDownloadHandler
{
public event EventHandler<DownloadItem> OnBeforeDownloadFired;
public event EventHandler<DownloadItem> OnDownloadUpdatedFired;
public void OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
{
OnBeforeDownloadFired?.Invoke(this, downloadItem);
if (!callback.IsDisposed)
{
using (callback)
{
//TODO: Detect file Type/Mime and auto download or show Save File dialogue as needed here
callback.Continue(Path.Combine(@"C:\Temp", downloadItem.SuggestedFileName), showDialog: false); // set to false so we don't show
}
}
}
public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
{
OnDownloadUpdatedFired?.Invoke(this, downloadItem);
if (downloadItem.IsComplete)
{
//TODO: Detect File Type/Mime and automatically open in default OS viewer
}
}
}
Github
(бесплатно для проектов с открытым исходным кодом). Ваша ссылка указывает цель _blank, поэтому она открывает всплывающее окно по запросу. Если вам вообще не нужно иметь всплывающее окно, то проще всего изменить HTML-код, иначе вам нужно закрыть всплывающее окно, см. magpcss.org/ceforum/viewtopic.php?f=6&t=16516#p40729 - person amaitland   schedule 09.09.2020IDownloadHandler
, что и обычно. - person amaitland   schedule 09.09.2020return false
. Это интерфейс, поэтому базовой реализации нет. - person amaitland   schedule 09.09.2020