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

C# Xamarin ZXing 将IsScanning属性从false改回true后无法扫描条码如何解决

解决方案

问题根因

  • ZXing.Net.Mobile的ZXingScannerView控件对IsScanning、IsAnalyzing的绑定变更存在响应延迟问题,若赋值时页面不在前台,控件不会实际执行启动扫描的逻辑
  • 你当前在OnScanResult跳转完成后立刻恢复扫描属性的操作执行时,页面已经被压入导航栈后台,赋值不会生效
  • 若属性值和上一次赋值相同,SetProperty不会触发属性变更通知,控件收不到更新信号

修复步骤

1. 修改BarcodeScannerViewModel逻辑

首先删除OnScanResult方法中跳转后无效的属性赋值,修改OnNavigatedTo方法强制触发属性变更通知:

private async void OnScanResult()
{
    IsAnalyzing = false;
    IsScanning = false;

    string barcode = BarcodeResult.Text;
    await m_NavigationService.NavigateAsync("RegisterGoodsView");
    // 删除此处的IsAnalyzing、IsScanning恢复逻辑,此时页面不在前台,赋值无效
}

public override void OnNavigatedTo(INavigationParameters parameters)
{
    base.OnNavigatedTo(parameters);
    // 先设为false再设为true,强制触发属性变更通知,避免值相同不触发更新
    IsAnalyzing = false;
    IsScanning = false;
    IsAnalyzing = true;
    IsScanning = true;
}

2. 在BarcodeScannerView后台代码中添加控件生命周期控制

在BarcodeScannerView.xaml.cs中重写页面显示/消失方法,手动控制扫描控件状态,解决绑定不生效的问题:

protected override void OnAppearing()
{
    base.OnAppearing();
    // 手动给控件赋值,确保扫描器启动
    scanner.IsScanning = true;
    scanner.IsAnalyzing = true;
}

protected override void OnDisappearing()
{
    base.OnDisappearing();
    // 页面隐藏时停止扫描,释放摄像头资源
    scanner.IsScanning = false;
    scanner.IsAnalyzing = false;
}

额外优化建议

可以给ScanResultCommand加上执行条件判断,避免重复触发:

// 构造函数中修改命令声明
ScanResultCommand = new DelegateCommand(OnScanResult, () => IsAnalyzing);

// 在IsAnalyzing属性变更时触发可执行状态更新
private bool m_IsAnalyzing = true;
public bool IsAnalyzing
{
    get { return m_IsAnalyzing; }
    set 
    { 
        SetProperty(ref m_IsAnalyzing, value); 
        ScanResultCommand.RaiseCanExecuteChanged();
    }
}

内容的提问来源于stack exchange,提问作者Ooi Yoong Khang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 17:51:01