什么时候可以调用`BarcodeScanner.GetDefaultAsync()`?

我正在尝试使用新的Windows 8.1 Point of Service API进行条形码扫描,如果我从以下任何位置调用GetDefaultAsync() ,它将返回null

  • App.OnLaunched
  • 第一页。 .Loaded
  • 第一页OnNavigatedTo
  • 第一页构造函数

这似乎不是DeviceCapabilities或驱动程序的问题,因为如果我从以下地方调用它,它将完美地工作:

  • 按钮Click事件处理程序
  • 第一页的OnGotFocus
  • 第一页的构造函数如果包含在:
    this.Dispatcher.RunIdleAsync(e => { var res = await BarcodeScanner.GetDefaultAsync(); Assert(res != null); });
  • 后续页面的构造函数

这让我怀疑你必须专注于访问POS设备,以及构造函数等。 在收到焦点之前被调用。

问题:是否有关于何时可以调用GetDefaultAsync()

松散地关注Microsoft Sample BarcodeScanner我在OnNavigatedTo连接条形码扫描器没有任何困难,尽管BarcodeScanner.GetDefaultAsync()调用有点嵌套。

我声称OnNavigatedTo的扫描仪,因为这个特定页面的点是扫描条形码,如果由于某种原因没有找到/声称扫描仪我想要预先出错,我不希望页面看起来和感觉function,如果不是和我不想强迫用户在发现条形码扫描器不工作之前尝试扫描。

我不能告诉你为什么在没有看到更多你的代码的情况下,在你的特定情况下在不同地点打电话不起作用,但我建议你尝试以下方法。

 protected override void OnNavigatedTo(NavigationEventArgs e) { EnableScanner(); } private async void EnableScanner() { if (await CreateDefaultScannerObject()) { // after successful creation, claim the scanner for exclusive use and enable it so that data reveived events are received. if (await ClaimScanner()) { Task AsyncSuccess = EnableClaimedScanner(); bool x = await AsyncSuccess; if (x) { HookUpEventsClaimedScanner(); } } } } private async Task CreateDefaultScannerObject() { if (scanner == null) { UpdateOutput("Creating Barcode Scanner object."); scanner = await BarcodeScanner.GetDefaultAsync(); if (scanner != null) { UpdateOutput("Default Barcode Scanner created."); UpdateOutput("Device Id is:" + scanner.DeviceId); } else { UpdateOutput("Barcode Scanner not found. Please connect a Barcode Scanner."); return false; } } return true; } private async Task EnableClaimedScanner() { bool result = false; try { await claimedScanner.EnableAsync(); if (claimedScanner.IsEnabled) { claimedScanner.IsDecodeDataEnabled = true; UpdateOutput("ClaimedScanner is now Enabled."); result = true; } else UpdateOutput("ClaimedScanner wasn't Enabled."); } catch (Exception ex) { UpdateOutput( ex.Message); } return result; } public void HookUpEventsClaimedScanner() { claimedScanner.DataReceived += ScannerDataReceived; claimedScanner.ReleaseDeviceRequested += ScannerReleaseRequest; } 

编辑:我意识到这个问题已经超过一年了,但我发现它在我自己的Windows 8.1嵌入式条形码扫描仪的研究中,所以我想确保它没有引导任何其他人走错路径认为GetDefaultAsync在某些呼叫情况下不起作用。