Zxing.Net.Mobile Forms Scanner не работает на TabControl - PullRequest
0 голосов
/ 24 июня 2019

У меня есть одна страница с 3 вкладками. Одна из этих вкладок (BasketVM.cs) имеет Scannerview (с Zxing) и отлично работает, когда эта страница вызывается впервые. Но когда я попытался изменить вкладку и вернулся на BasketVM.cs, сканер с открытым кодом завис.

Я пробовал использовать свойство "IsScanning", и значение работает, но камера всегда останавливается.

Проблема с барабаном - это свойство IsScanning. Когда я ставлю false, камера останавливается, но когда я пытаюсь поставить true, камера всегда останавливается. Я думаю, что он contentview это не обновлять должным образом ...

Моя главная страница с 3 вкладками:

 public SaleVM(BasketVM basketVM, ProductSearchVM productSearchVM, 
 CustomerVM customerVM) : base(customerHeaderVM)
    {
        BasketVM = basketVM;
        ProductSearchVM = productSearchVM;
        CustomerVM = customerVM;


    }
 public override void OnViewAppearing()
    {
        BasketVM.Navigation = Navigation;
        ProductSearchVM.Navigation = Navigation;
        CustomerVM.Navigation = Navigation;

        CallOnViewAppearing(SelectedTabIndex);
    }

  public override void OnViewDisappearing()
    {
        CallOnViewDisappearing(SelectedTabIndex);
    }
  #region SelectedTabIndex property
    int _SelectedTabIndex;

    public int SelectedTabIndex
    {
        get { return _SelectedTabIndex; }
        set { SetProperty(ref _SelectedTabIndex, value); }
    }
    #endregion

    #region TabChange Command

    Command _TabChangeCommand;
    int previousTabIndex;

    public Command TabChangeCommand
    {
        get { return GetProperty(ref _TabChangeCommand, () => new 
Command(TabChange)); }
    }

    void TabChange()
    {
        Log.Debug("Tab change {previousTabIndex} => {SelectedTabIndex}", 
  previousTabIndex, SelectedTabIndex);
        if (previousTabIndex == SelectedTabIndex)
            return;

        CallOnViewDisappearing(previousTabIndex);
        CallOnViewAppearing(SelectedTabIndex);

        previousTabIndex = SelectedTabIndex;
    }

    #endregion

    #region Children VM
    public BasketVM BasketVM { get; private set; }
    public ProductSearchVM ProductSearchVM { get; private set; }
    public CustomerVM CustomerVM { get; private set; }
    #endregion


    void CallOnViewDisappearing(int tabIndex)
    {
        switch (tabIndex)
        {
            case 0:
                BasketVM.OnViewDisappearing();
                break;
            case 1:
                ProductSearchVM.OnViewDisappearing();
                break;
            case 2:
                CustomerVM.OnViewDisappearing();
                break;
            default:
                break;
        }
    }

    void CallOnViewAppearing(int tabIndex)
    {
        switch (tabIndex)
        {
            case 0:
                BasketVM.OnViewAppearing();
                break;
            case 1:
                ProductSearchVM.OnViewAppearing();
                break;
            case 2:
                CustomerVM.OnViewAppearing();
                break;
            default:
                break;
        }
    }

работает отлично.

My BasketView.xaml:

     <control:BarcodeScanner x:Name="scanner" Grid.Row="0" Text="{Binding ScanText}" ScanCommand="{Binding ScanCommand}" IsScanning="{Binding IsScanning}" IsTabStop="True"  />

BasketVM.cs:

 public override void OnViewAppearing()
    {

        Log.Debug("Enabling scanner");
        IsScanning = true;

        Device.BeginInvokeOnMainThread(
                         // We need to run this on UI Thread for iOS, 
 because it causes a scrolling on the view
                         () =>
                         { foreach (var item in Items)
            item.Navigation = Navigation;
    }
                     );

        // Set up child VM Navigation, necessary form VM initialized in 
   the constructor

    }

  public override void OnViewDisappearing()
    {
        Log.Debug("Disabling scanner");
        IsScanning = false;
    }


  #region IsScanning property
    private bool _IsScanning;
    public bool IsScanning
    {
        get { return _IsScanning; }
        set {
            SetProperty(ref _IsScanning, value);
        }
    }
    #endregion


  #region ScanText property
    private string _ScanText;
    public string ScanText
    {
        get { return _ScanText; }
        set { SetProperty(ref _ScanText, value); }
    }
    #endregion

Мой контроль BarecodeScanner.cs

  public class BarcodeScanner : ContentView
  {
    ZXingScannerView scannerView;
    Label label;
    public BarcodeScanner()
    {
        var grid = new Grid();

        scannerView = new ZXingScannerView
        {
            Options = new MobileBarcodeScanningOptions
            {
                PureBarcode = true,
                TryHarder = true,
                UseNativeScanning = true,
                PossibleFormats = new List<BarcodeFormat>
                {
                   BarcodeFormat.EAN_8,
                    BarcodeFormat.EAN_13,
                    BarcodeFormat.CODE_128,
                    BarcodeFormat.QR_CODE
                },
                DelayBetweenContinuousScans = 2000,

            },
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand,
            IsAnalyzing = true,
            AutomationId= "zxingScannerView",
            IsScanning =true

        };
        scannerView.OnScanResult += ScannerView_OnScanResult;

        label = new Label
        {
            TextColor = Color.White,
            BackgroundColor = Color.FromRgba(0, 0, 0, 100),
            FontSize = 20,
            VerticalOptions = LayoutOptions.Center,
            HorizontalOptions = LayoutOptions.FillAndExpand,
            HorizontalTextAlignment = TextAlignment.Center,
            VerticalTextAlignment = TextAlignment.Center,
            Opacity = 0,
        };

        grid.Children.Add(scannerView);
        grid.Children.Add(label);


        Content = grid;
    }

    static void OnTextChanged(BindableObject bindable, object oldValue, 
   object newValue)
    {
        BarcodeScanner scanner = (BarcodeScanner)bindable;
        string text = (string)newValue;

        scanner.label.Text = text;
        Task.Run(() => scanner.ShowText());

    }

    #endregion

    #region IsScanningProperty
    public static readonly BindableProperty IsScanningProperty = 
  BindableProperty.Create("IsScanning", typeof(bool), 
  typeof(BarcodeScanner), defaultValue: false, propertyChanged: 
  OnIsScanningChanged);

    public bool IsScanning
    {
        get { return (bool)GetValue(IsScanningProperty); }
        set { SetValue(ScanCommandProperty, value); }
    }

    static void OnIsScanningChanged(BindableObject bindable, object 
oldValue, object newValue)
     {
        BarcodeScanner scanner = (BarcodeScanner)bindable;
        bool isScanning = (bool)newValue;

        scanner.scannerView.IsScanning = isScanning;
    }
    #endregion




    private void ScannerView_OnScanResult(Result result)
    {
        ScanCommand.Execute(result.Text);
    }
...