Событие UWP BarcodeScanner DataRecced не запускается в приложении WPF - PullRequest
0 голосов
/ 14 июля 2020

У меня есть приложение WPF для точек продаж, которое я недавно портировал с net48 на netcore3.1 (какая работа!). В приложении я использую Honeywell Voyager 1200g через служебный объект POS 4NET (HHSO 4NET .dll) для сканирования простых штрих-кодов, и все прошло хорошо. Однако в новом мире netcore3.1 я больше не мог открывать устройство. Я получил следующую ошибку: -

Инициализатор типа для `Microsoft.Pointofservice.management.Explorer

Метод не найден: 'Void System.AppDomainSetup. set_ApplicationBase (System.String) '.

Я предполагаю, что сейчас что-то недоступно в основной среде выполнения do tnet, что раньше было в структуре net. Итак, я решил обратиться к Windows .Devices.PointOfService в мире UWP, чтобы помочь мне интегрировать сканер (который является поддерживаемой моделью).

Чтобы иметь возможность ссылаться на эти библиотеки UWP, я следовал следующему руководству, в котором описывается добавление некоторых дополнительных ссылок

https://blogs.windows.com/windowsdeveloper/2017/01/25/calling-windows-10-apis-desktop-application/

Теперь я могу найти, потребовать и открыть сканер просто отлично! Но вроде бы никакие события не обрабатываются. Мой код почти идентичен образцу UWP: -

string selector = BarcodeScanner.GetDeviceSelector();
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);
var device = deviceCollection.FirstOrDefault();

if (device != null)
{
    barcodeScanner = await BarcodeScanner.FromIdAsync(device.Id);

    if (barcodeScanner != null)
    {
        //after successful creation, claim the scanner for exclusive use
        var claimedBarcodeScanner = await barcodeScanner.ClaimScannerAsync();

        if (claimedBarcodeScanner != null)
        {
            //Subscribe to the events
            claimedBarcodeScanner.ReleaseDeviceRequested += ClaimedBarcodeScanner_ReleaseDeviceRequested;
            claimedBarcodeScanner.DataReceived += WhenScannerDataReceived;
            claimedBarcodeScanner.IsDecodeDataEnabled = true;

            //after successful claim, enable scanner for data events to fire
            await claimedBarcodeScanner.EnableAsync();
        }
        else
        {
            FrameworkDI.Logger.LogErrorSource("Failure to claim barcodeScanner");
        }
    }
    else
    {
        FrameworkDI.Logger.LogErrorSource("No Barcode Scanner Present");
    }
}
else
{
    FrameworkDI.Logger.LogErrorSource("No Barcode Scanner Present");
}
private void WhenScannerDataReceived(object sender, DataEventArgs args)
{
    string symbologyName = BarcodeSymbologies.GetName(args.Report.ScanDataType);
    var scanDataLabelReader = DataReader.FromBuffer(args.Report.ScanDataLabel);
    string barcode = scanDataLabelReader.ReadString(args.Report.ScanDataLabel.Length);
}

С точкой останова в обработчике я не могу попасть в событие. Я загрузил образец приложения UWP и запустил его, используя тот же компьютер / сканер, и он захватил все события и отлично прочитал данные, поэтому я предполагаю, что сканер генерирует события. Это должно быть связано с тем, что приложение WPF не получает события так же, как приложение UWP.

Что-то мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 15 июля 2020

Очень простая c ошибка программирования.

При копировании образца кода UWP я не осознавал, что локально ограничил область действия объекта requiredBarcodeScanner до метода инициализации.

После Метод инициализации завершен, ссылка была потеряна, и события не записывались.

Спасибо kunif за важный совет: «имеет смысл попробовать его с хорошо написанным приложением WPF, а не с консольным приложением. "

... и я могу подтвердить, эта библиотека POS работает с net framework, net core framework и UWP.

0 голосов
/ 14 июля 2020

Переписано на основе диалога в комментариях:

Похоже, что следующие комментарии, приложенные к статье с вопросом, были действительными.

Кстати, это (Windows .Devices.PointOfService) естественно работает с. NET 4.8 WPF (никогда не UWP) вместо. NET Core? Если он не работает с. NET 4.8 WPF, вероятно, он не работает с. NET Core. Было бы лучше понемногу исследовать такие небольшие изменения.

Может быть, это просто воспроизведение той же ситуации. Но имеет смысл попробовать это с хорошо написанным приложением WPF, а не с консольным приложением.

Вероятно, потому что вы не сделали claimedBarcodeScanner.IsDecodeDataEnabled = true; в обработчике событий DataReceived. Данные буферизуются в сервисе сканера штрих-кода, хотя это не так. Это будет тот же механизм, что и свойство DataEventEnabled POS для. NET и OPOS.

пс Обращаем ваше внимание, что комментарии к предыдущей статье будут удалены.

С другой стороны, пакет NuGet, упомянутый в статье с вопросом, создан третьей стороной и завершен в ноябре 2016 года, поэтому, возможно, лучше переключиться на этот продукт Microsoft.

Windows 10 выпущенных пакетов API WinRT Microsoft. Windows .SDK.Contracts 10.0.19041.1 Версия адаптивного кода Windows API среды выполнения, доступные для настольных приложений

И. NET 5 будут выпущены этой осенью или зимой, и механизм будет изменен. Поддержка API WinRT в. NET 5 # 35318 C # / WinRT

...