我正在尝试使用CefSharp WinForms从我的应用程序下载一些文件(图像、音频文件或其他)。我阅读了许多其他帖子,但似乎都无法正常工作。
您有没有实现CefSharp下载程序的示例代码?
我尝试了下载一些文件,但什么都没发生。
我正在尝试使用CefSharp WinForms从我的应用程序下载一些文件(图像、音频文件或其他)。我阅读了许多其他帖子,但似乎都无法正常工作。
您有没有实现CefSharp下载程序的示例代码?
我尝试了下载一些文件,但什么都没发生。
经过两天的努力,我终于做到了。 对于有相同问题的人,这里有一个简单的解决方案。 如果你正在使用MinimalExample,你需要下载Cefsharp示例(cefsharp-master),解压缩并按照以下步骤操作:
进入BrowserForm.cs类并输入以下内容:
browser.DownloadHandler = new DownloadHandler();
完成!
DownloadHandler.cs
// Copyright © 2013 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
using System;
namespace CefSharp.Example.Handlers
{
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)
{
callback.Continue(downloadItem.SuggestedFileName, showDialog: true);
}
}
}
public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
{
OnDownloadUpdatedFired?.Invoke(this, downloadItem);
}
}
}
OnBeforeDownload
中 callback
被处理掉了,但是在 OnDownloadUpdated
中没有。难道不应该在两个地方都处理掉吗? - JuanIDownloadHandler
接口并且实现CanDownload
函数。 - Alex P.要解决这个问题,只需在此处下载DownloadHandler.cs类。
然后将其导入到您的Visual Studio项目中,并将以下行添加到主窗体的代码中:
MyBrowser.DownloadHandler = new DownloadHandler();
并将这段代码添加到顶部:
using CefSharp.Example;
然后尝试从您的浏览器下载一些东西,它应该可以工作!
我加入了以下内容,因为在线使用DownloadHandler类的示例中,很少展示OnBeforeDownloadFired()的实现,并且在引用的DownloadHandler.cs文件中也没有包含该实现。
这有助于解决下载文件(例如.mobi电子书)时遇到的问题,如果下载链接具有"_blank"目标,则必须阻止弹出窗口并在浏览器中打开一个新的自定义选项卡,但是当发生这种情况时,不会触发下载对话框。
我认为这是正确的。希望能够帮到您或者至少给您一个起点:
DownloadHandler downer = new DownloadHandler(this);
browser.DownloadHandler = downer;
downer.OnBeforeDownloadFired += OnBeforeDownloadFired;
downer.OnDownloadUpdatedFired += OnDownloadUpdatedFired;
private void OnBeforeDownloadFired(object sender, DownloadItem e)
{
this.UpdateDownloadAction("OnBeforeDownload", e);
}
private void OnDownloadUpdatedFired(object sender, DownloadItem e)
{
this.UpdateDownloadAction("OnDownloadUpdated", e);
}
private void UpdateDownloadAction(string downloadAction, DownloadItem downloadItem)
{
/*
this.Dispatcher.Invoke(() =>
{
var viewModel = (BrowserTabViewModel)this.DataContext;
viewModel.LastDownloadAction = downloadAction;
viewModel.DownloadItem = downloadItem;
});
*/
}
// ...
public class DownloadHandler : IDownloadHandler
{
public event EventHandler<DownloadItem> OnBeforeDownloadFired;
public event EventHandler<DownloadItem> OnDownloadUpdatedFired;
MainForm mainForm;
public DownloadHandler(MainForm form)
{
mainForm = form;
}
public void OnBeforeDownload(IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
{
var handler = OnBeforeDownloadFired;
if (handler != null)
{
handler(this, downloadItem);
}
if (!callback.IsDisposed)
{
using (callback)
{
callback.Continue(downloadItem.SuggestedFileName, showDialog: true);
}
}
}
public void OnDownloadUpdated(IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
{
var handler = OnDownloadUpdatedFired;
if (handler != null)
{
handler(this, downloadItem);
}
}
}
// ...
CefBrowser = new ChromiumWebBrowser("http://google.com", null);
CefBrowser.Margin = Padding.Empty;
// browsers.Size = new Size(900, 600);// note here
DownloadHandler downloadHandler = new DownloadHandler();
CefBrowser.DownloadHandler = downloadHandler;
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)
{
callback.Continue(downloadItem.SuggestedFileName, showDialog: true);
}
}
}
public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem,
IDownloadItemCallback callback)
{
OnDownloadUpdatedFired?.Invoke(this, downloadItem);
}
}