[英]Download file with CefSharp WinForms
我正在嘗試使用 CefSharp WinForms 從我的應用程序下載一些文件(圖像、音頻文件或其他文件)。 我閱讀了許多其他帖子,但似乎沒有任何效果。 你有任何實現 CefSharp 下載器的示例代碼嗎?
我嘗試下載一些文件,沒有任何反應。
2天后,我終於做到了。 對於有同樣問題的人,這里是簡單的解決方案。 如果您使用的是 MinimalExample,則必須下載 Cefsharp 示例 (cefsharp-master) 解壓縮它並執行以下操作:
進入你的 BrowserForm.cs 類並輸入:
browser.DownloadHandler = new 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);
}
}
}
要解決此問題,只需下載此處找到的類 DownloadHandler.cs。
之后,將其導入到您的 Visual Studio 項目中,並將此行添加到主窗體的代碼中:
MyBrowser.DownloadHandler = new DownloadHandler();
並將其添加到代碼的頂部:
using CefSharp.Example;
然后嘗試從您的瀏覽器下載一些東西,它應該可以工作!
我之所以包含以下內容,是因為 OnBeforeDownloadFired() 的實現未在許多有關如何使用 DownloadHandler 類的在線示例中顯示,並且在引用的 DownloadHandler.cs 中也沒有。
如果下載鏈接的目標是“_blank”,這有助於解決下載文件(例如 .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);
}
}
}
// ...
將此添加到您的 MainForm 中
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;
只需創建類 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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.