Как использовать сканер ZXing.Net в формах Xamarin вместе с другими элементами пользовательского интерфейса?

Я просматриваю образец для ZXing.net для Xamarin.Forms и использует только код для сканирования штрих-кода.

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

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:zx="clr-namespace:ZXing.Net.Mobile.Forms;assembly=ZXing.Net.Mobile.Forms"
             xmlns:zxcm="clr-namespace:ZXing.Common;assembly=zxing.portable"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="WebOfTrust.Views.Client.MyPeople.ScanNewOrUpdateContact">
    <ContentPage.Content>
        <StackLayout>


            <zx:ZXingDefaultOverlay
                TopText= " Hold your phone up to the barcode"
                BottomText=" Scanning will being automatically">
            </zx:ZXingDefaultOverlay>


            <!--     BarcodeValue="{Binding QrCode}"    -->
            <zx:ZXingScannerView
                HorizontalOptions="FillAndExpand"
                VerticalOptions="FillAndExpand"> 
            </zx:ZXingScannerView>

        </StackLayout>
    </ContentPage.Content>
</ContentPage>

Мой вопрос в том, как мне создать страницу, чтобы я мог поймать OnScanResult, как показано в образце (скопировано ниже)

        zxing.OnScanResult += (result) => 
            Device.BeginInvokeOnMainThread (async () => {

                // Stop analysis until we navigate away so we don't keep reading barcodes
                zxing.IsAnalyzing = false;

                // Show an alert
                await DisplayAlert ("Scanned Barcode", result.Text, "OK");

                // Navigate away
                await Navigation.PopAsync ();
            });

person TLDR    schedule 02.10.2018    source источник
comment
с чем конкретно у вас возникли проблемы? Это создание пользовательского интерфейса? Или связывать события с PRISM вместо использования обработчиков событий в программном коде? Или что-то совсем другое?   -  person Jason    schedule 03.10.2018
comment
Я не знаю, как заставить ViewModel слушать OnScanResult, предпочтительно объявленный в Xaml @Jason   -  person TLDR    schedule 03.10.2018
comment
вместо OnScanResult используйте ScanResultCommand, чтобы связать его с командой в вашей виртуальной машине.   -  person Jason    schedule 03.10.2018
comment
Вы решили проблему?   -  person Lucas Zhang    schedule 09.10.2018


Ответы (1)


См. следующий код:

в xaml

<zx:ZXingScannerView
    x:Name="zxing"
    IsAnalyzing="{Binding IsAnalyzing,Mode=TwoWay}" 
    Result="{Binding Result, Mode=TwoWay}"
    ScanResultCommand="{Binding ScanResultCommand}"                
    HorizontalOptions="FillAndExpand"
    VerticalOptions="FillAndExpand"> 
</zx:ZXingScannerView> 

в ViewModel

public ZXing.Result Result { get; set; }

public bool IsAnalyzing { get;set }

public Command ScanResultCommand
{
   get
    {
       return new Command(() =>
        {

          Device.BeginInvokeOnMainThread(async () =>
            {
              IsAnalyzing = false;

              Console.WriteLine(Result.Text);

              //...

             });
            });
     }
}
person Lucas Zhang    schedule 03.10.2018
comment
Это сработало идеально для меня;) Хотя он запускает ScanResult каждую секунду ^^ - person Ashallar; 22.10.2020