Навигация по Xamarin.Forms не будет работать при вызове из события - PullRequest
0 голосов
/ 07 декабря 2018

Я использую Prism Unity для приложения для управления запасами со сканером Bluetooth.Сначала я использовал сканер в режиме HID, но после того, как сканер находился в спящем режиме, инициализация HID была мучительно медленной.Поэтому я решил использовать Bluetooth SPP, который работает намного лучше.Но я запускаю эту ошибку и не могу понять, почему она не работает.

Служба Bluetooth работает в фоновом режиме и запускает событие, на которое подписан мой ViewModel.Затем вызывается функция, которая проверяет штрих-код и, в случае успеха, переходит на другую страницу.

Когда вы вводите штрих-код вручную, вызывается та же функция для проверки и навигации.Интересные части кода ниже:

Конструктор ViewModel с подпиской на событие штрих-кода:

public ArtikelScannenPageViewModel(INavigationService navigationService, IPageDialogService pageDialog, IEventAggregator eventAggregator)
        : base(navigationService)
    {
        Title = "Artikel scannen";
        _navigationService = navigationService;
        _pageDialog = pageDialog;
        _eventAggregator = eventAggregator;
        SubmitCommand = new DelegateCommand(OnSubmit);
        System.Diagnostics.Debug.WriteLine("BTDevice:" + (string)App.Current.Properties["BTDevice"]);
        _eventAggregator.GetEvent<ScannerEvent>().Subscribe(OnBarcode);
    }

Вызывается при сканировании штрих-кода:

private IEventAggregator _eventAggregator;
    void OnBarcode(string param)
    {
        checkArtikel(param);
    }

Thisвызывается, когда штрих-код вводится вручную:

        public DelegateCommand SubmitCommand { protected set; get; }
    public async void OnSubmit()
    {
        if (!string.IsNullOrEmpty(Artikelnr))
        {
            checkArtikel(Artikelnr);
        }
        else
        {
            await _pageDialog.DisplayAlertAsync("Eingabe", "Bitte Artikelnummer eingeben!", "OK");
        }
    }

Оба, OnSubmit и OnBarcode, используют эту функцию:

public async void checkArtikel(string _barcode)
    {
        DataOperations dop = new DataOperations();
        APIOperations.ValidationResponse vr = await dop.GetArtikel(_barcode);
        if (vr.Successful)
        {
            Artikel artikel = (Artikel)vr.Response;
            NavigationParameters p = new NavigationParameters();
            p.Add("artikel", artikel);
            await _navigationService.NavigateAsync(_nextPage, p);
            System.Diagnostics.Debug.WriteLine("Navigation fired!");
        }
        else
        {
            await _pageDialog.DisplayAlertAsync("Fehler", "Falsche Artikel-Nr. oder Artikel tot!", "OK");
        }
    }

Когда он вводится вручную, все работает нормально.Но когда вызывается OnBarcode, навигация не работает!Это просто остается на странице.Функция checkArtikel вызывается.DataOperation возвращает правильный «Артикель» и даже «Навигация сработала!»появляется в журнале.Как это могло быть возможно?Я немного использую ту же функцию?Что мне здесь не хватает?

Редактировать: опечатка

1 Ответ

0 голосов
/ 07 декабря 2018

Похоже, что навигация и pagedialog не вызывались из основного потока при вызове через OnBarcode.Я исправил это, поместив навигацию и pagedialog в Device.BeginInvokeOnMainThread ().Теперь это выглядит так:

public async void CheckArtikel(string _barcode)
        {
            DataOperations dop = new DataOperations();
            APIOperations.ValidationResponse vr = await dop.GetArtikel(_barcode);
            if (vr.Successful)
            {
                Artikel artikel = (Artikel)vr.Response;
                NavigationParameters p = new NavigationParameters
                {
                    { "artikel", artikel }
                };
                Device.BeginInvokeOnMainThread(async() => await _navigationService.NavigateAsync(_nextPage, p));
            }
            else
            {
                Device.BeginInvokeOnMainThread(async () => await _pageDialog.DisplayAlertAsync("Fehler", "Falsche Artikel-Nr. oder Artikel tot!", "OK"));
            }
        }
...