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
相关产品推荐
相关产品推荐

