如何通过WebView2获取下载进度?BytesReceivedChanged事件不触发如何解决
问题解决方法
核心问题是你错误尝试自行声明下载进度相关事件,且未正确绑定WebView2内置的下载状态变更事件,才会导致事件无法触发,可按照以下规则修正:
- 不要在代码中自行定义
BytesReceivedChanged、StateChanged事件,这两个是CoreWebView2DownloadOperation类的原生内置事件 - 在
DownloadStarting事件触发时,从参数中获取当前下载任务的DownloadOperation实例,再给这个实例绑定对应的进度、状态变更事件 - 修正事件处理方法的参数类型,两个变更事件的发送者
sender本身就是当前的CoreWebView2DownloadOperation实例
修正后的完整可运行代码如下:
async void InitializeAsync() { var env = await CoreWebView2Environment.CreateAsync(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Microsoft\EdgeCore\92.0.887.0"); await webView.EnsureCoreWebView2Async(env); webView.CoreWebView2.DownloadStarting += webView_DownloadStarting; webView.CoreWebView2.Navigate("downloadURL"); } private void webView_DownloadStarting(object sender, CoreWebView2DownloadStartingEventArgs e) { e.ResultFilePath = filename; // 拿到当前下载任务实例,绑定内置事件 var downloadOp = e.DownloadOperation; downloadOp.BytesReceivedChanged += webView_BytesReceivedChanged; downloadOp.StateChanged += webView_StateChanged; } private void webView_BytesReceivedChanged(object sender, object e) { // sender就是当前的下载任务实例 var downloadOp = sender as CoreWebView2DownloadOperation; Console.WriteLine(downloadOp.BytesReceived); // 已接收字节数 Console.WriteLine(downloadOp.TotalBytesToReceive); // 待接收总字节数 } private void webView_StateChanged(object sender, object e) { var downloadOp = sender as CoreWebView2DownloadOperation; Console.WriteLine(downloadOp.State); // 2=已完成,1=进行中,0=出错 // 下载结束(完成/失败/取消)后取消事件绑定,避免内存泄漏 if (downloadOp.State != CoreWebView2DownloadState.InProgress) { downloadOp.BytesReceivedChanged -= webView_BytesReceivedChanged; downloadOp.StateChanged -= webView_StateChanged; } }
额外注意:你使用的WebView2版本要对应,低于1.0.865的预览版不支持上述下载相关API;路径里的EdgeCore版本要和你实际安装的WebView2运行时版本匹配,否则初始化会失败。
内容的提问来源于stack exchange,提问作者Ondrashek
相关产品推荐
相关产品推荐

