xamarin.forms - 扫描条码时使用手电筒
问题描述
我正在使用 ZXing.Mobile.Forms 来扫描条形码。我想在扫描条形码时打开手电筒。我试过 ToggleTorch() 但我没有看到手电筒灯。请帮助克服这种情况。这是我的代码:
var scanner = new ZXing.Mobile.MobileBarcodeScanner();
scanner.ToggleTorch();
var option = new ZXing.Mobile.MobileBarcodeScanningOptions { UseCode39ExtendedMode = true, TryHarder = true, PureBarcode = true, };
var result = await scanner.Scan(option);
if (result != null)
await Application.Current.MainPage.DisplayAlert(title, result.Text, "Cancel");
await Application.Current.MainPage.Navigation.PopAsync(true);
解决方案
好的,这里是以 MVVM 方式做你想做的事情的主要思想:
XAML:
<zxing:ZXingScannerView x:Name="ScannerView"
IsTorchOn="{Binding IsTorchOn}"
IsScanning="{Binding IsScanning}"
IsAnalyzing="{Binding IsAnalyzing}"
ScanResultCommand="{Binding OnScanResult}"/>
代码隐藏:
public partial class BarcodeScannerPage
{
private BarcodeScannerPageModel _pageModel;
public BarcodeScannerPage()
{
InitializeComponent();
}
protected override void OnAppearing()
{
base.OnAppearing();
if(_pageModel == null) return;
_pageModel.IsScanning = true;
_pageModel.IsAnalyzing = true;
_pageModel.IsTorchOn= true;
}
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
_pageModel = BindingContext as BarcodeScannerPageModel;
}
}
页面模型:
public class BarcodeScannerPageModel
{
#region instance variables
private bool _isScanning;
private bool _isAnalyzing;
private bool _isTorchOn;
#endregion
public BarcodeScannerPageModel()
{
IsTorchOn = true;
}
public bool IsScanning
{
get => _isScanning;
set
{
_isScanning = value;
RaisePropertyChanged();
}
}
public bool IsAnalyzing
{
get => _isAnalyzing;
set
{
_isAnalyzing = value;
RaisePropertyChanged();
}
}
public ICommand OnScanResult
{
get
{
return new Command(async (result) =>
{
if (result.ToString().IsNullOrEmpty()) return;
Device.BeginInvokeOnMainThread(async () =>
{
IsAnalyzing = false;
//your code here...
});
});
}
}
public bool IsTorchOn
{
get => _isTorchOn;
set
{
_isTorchOn = value;
RaisePropertyChanged();
}
}
}
在这里,我假设 MVVM 已正确设置和使用,包括“PropertyChanged”事件和设置“BindingContext”。更多信息:
使用一些 MVVM 框架,例如FreshMvvm可以让事情变得更简单。
推荐阅读
- rspec - 如果没有断言,有没有办法让 RSpec 失败?
- c# - C# Timer 检查多线程是否完成失败
- html - 使用 CSS 在图像上绘制圆圈
- django - 在 Django 频道消费者中使用 asyncio.create_subprocess_shell
- php - HTML POST 表单不向 PHP 脚本发送任何数据
- javascript - 从已解决的 Promise 对象中检索值
- python - 测试请求 Modbus TCP
- javascript - 如何在没有帮助的情况下更新 Meteor 中的 div?
- javascript - 角度材料对话框预填充的输入字段未验证
- python-3.x - 串口通信编码