C# 如何正确等待我的条形码扫描
目前我正在努力等待我的二维码:C# 如何正确等待我的条形码扫描,c#,xamarin.forms,async-await,zxing.net,C#,Xamarin.forms,Async Await,Zxing.net,目前我正在努力等待我的二维码: private async Task<string> ScanQRCode() { try { var options = new MobileBarcodeScanningOptions { AutoRotate = false, UseFrontCameraIfAvailable = false,
private async Task<string> ScanQRCode()
{
try
{
var options = new MobileBarcodeScanningOptions
{
AutoRotate = false,
UseFrontCameraIfAvailable = false,
TryHarder = true,
DelayBetweenContinuousScans = 1
};
var scanPage = new ZXingScannerPage(options)
{
DefaultOverlayTopText = "Align the barcode within the frame",
DefaultOverlayBottomText = string.Empty,
DefaultOverlayShowFlashButton = true
};
string barcodestring = string.Empty;
// Navigate to our scanner page
Device.BeginInvokeOnMainThread(async () =>
{
await _navigation.PushModalAsync(scanPage);
});
scanPage.OnScanResult += (result) =>
{
if (result.Text.IsValidJson<DeviceSetup>())
{
// Stop scanning
scanPage.IsScanning = false;
// Pop the page and show the result
Device.BeginInvokeOnMainThread(async () =>
{
await _navigation.PopModalAsync(true);
});
barcodestring = result.Text;
}
};
return barcodestring;
}
catch (System.Exception ex)
{
Device.BeginInvokeOnMainThread(async () =>
{
await _navigation.PopModalAsync(true);
await _page.DisplayAlert("Error", ex.Message, "OK");
});
return "Error";
}
}
专用异步任务ScanQRCode()
{
尝试
{
var选项=新的MobileBarcodeScanningOptions
{
自动旋转=错误,
UseFrontCameraIfAvailable=false,
TryHarder=true,
DelayBetweenContinuousScans=1
};
var scanPage=新ZXingScannerPage(选项)
{
DefaultOverlayTopText=“在框架内对齐条形码”,
DefaultOverlyBottomText=string.Empty,
DefaultOverlyShowFlashButton=true
};
string barcodestring=string.Empty;
//导航到我们的扫描仪页面
Device.beginInvokeMainThread(异步()=>
{
wait_navigation.PushModalAsync(scanPage);
});
scanPage.OnScanResult+=(结果)=>
{
if(result.Text.IsValidJson())
{
//停止扫描
scanPage.IsScanning=false;
//弹出页面并显示结果
Device.beginInvokeMainThread(异步()=>
{
wait_navigation.PopModalAsync(true);
});
barcodestring=result.Text;
}
};
返回条码字符串;
}
catch(System.Exception-ex)
{
Device.beginInvokeMainThread(异步()=>
{
wait_navigation.PopModalAsync(true);
等待页面显示警报(“错误”,例如消息“确定”);
});
返回“错误”;
}
}
调用方法继续执行,不等待QR结果
为什么?我想你的问题是你的
await _navigation.PushModalAsync(scanPage)
当扫描页被可视化时结束。那么你的
return barcodestring;
我认为返回的总是空字符串
你应该使用信息中心
if (result.Text.IsValidJson<DeviceSetup>())
{
// Stop scanning
scanPage.IsScanning = false;
// Pop the page and show the result
Device.BeginInvokeOnMainThread(async () =>
{
await _navigation.PopModalAsync(true);
});
// Here send a message
MessagingCenter.Send<MyPage, string>(this, "BarcodeRead", result.Text);
//barcodestring = result.Text;
}
if(result.Text.IsValidJson())
{
//停止扫描
scanPage.IsScanning=false;
//弹出页面并显示结果
Device.beginInvokeMainThread(异步()=>
{
wait_navigation.PopModalAsync(true);
});
//给你发个信
MessagingCenter.Send(这是“条形码读取”,result.Text);
//barcodestring=result.Text;
}
而且你的MyPage应该(在OnAppearing中)有如下内容
MessagingCenter.Subscribe<MyPage, string> (this, "BarcodeRead", (sender, arg) => {
// arg should have your barcode...
});
MessagingCenter.Subscribe(此“条形码读取”(发件人,arg)=>{
//arg应该有您的条形码。。。
});
我创建了一个小演示。这是对上演示的重拍,因为您订阅了
OnScanResult
事件并立即返回barcodestring
?看,要不然就完蛋了。。谢谢你的链接。我将努力实现这一点!