You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ZXing CameraBarcodeReaderView识别条码后跳转页面抛COMException

问题解答

需要关闭扫描器,跳转页面时扫描器若仍在运行,会持续占用相机资源或执行UI相关操作,和页面导航时的Toolbar更新逻辑冲突,进而引发COMException。

具体操作步骤如下:

  1. 在条码检测回调中先停止扫描
    在OnBarcodesDetected方法里,优先停止扫描器的检测逻辑,再执行页面导航。根据ZXing.Net.Mobile的版本,可通过以下两种方式实现:

    • 设置控件的IsScanning属性为false:
      private async void OnBarcodesDetected(BarcodeReaderView sender, BarcodeDetectionEventArgs args)
      {
          // 立即停止扫描
          sender.IsScanning = false;
          // 更新绑定的检测状态
          IsDetectingInternal = false;
          // 短暂延迟确保资源释放(可选,视情况调整)
          await Task.Delay(100);
          // 执行页面跳转
          await Navigation.PushAsync(new ResultPage(args.Result[0].Text));
      }
      
    • 调用控件的StopScanning()方法(部分ZXing版本支持):
      private async void OnBarcodesDetected(BarcodeReaderView sender, BarcodeDetectionEventArgs args)
      {
          sender.StopScanning();
          IsDetectingInternal = false;
          await Task.Delay(100);
          await Navigation.PushAsync(new ResultPage(args.Result[0].Text));
      }
      
  2. 确保操作在UI线程执行
    若OnBarcodesDetected回调运行在后台线程,需切换到UI线程处理扫描停止和导航操作,避免跨线程UI冲突:

    private async void OnBarcodesDetected(BarcodeReaderView sender, BarcodeDetectionEventArgs args)
    {
        await MainThread.InvokeOnMainThreadAsync(async () =>
        {
            sender.IsScanning = false;
            IsDetectingInternal = false;
            await Navigation.PushAsync(new ResultPage(args.Result[0].Text));
        });
    }
    
  3. 页面离开时兜底停止扫描
    可在MainPage的OnDisappearing方法中添加扫描停止逻辑,确保页面切换时资源完全释放:

    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        // 替换为你的CameraBarcodeReaderView实例名
        barcodeReaderView.IsScanning = false;
    }
    

内容的提问来源于stack exchange,提问作者MPelletier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:23:10