从事件调用Xamarin.Forms导航将不起作用

时间:2018-12-07 10:41:55

标签: xamarin events navigation prism

我正在将Prism Unity用于带有蓝牙扫描仪的库存管理应用程序。 起初,我在HID模式下使用了扫描仪,但是在扫描仪进入睡眠模式后,HID初始化非常缓慢。因此,我决定使用蓝牙SPP,它的性能要好得多。但是我遇到了这个错误,无法弄清为什么它不起作用。

蓝牙服务在后台运行,并触发我的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);
    }

当手动输入条形码时会调用此方法:

        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返回正确的“ Artikel”,甚至返回“已触发导航!”出现在日志中。那怎么可能呢?我在乱用相同的功能吗?我在这里想念什么?

编辑:错字

1 个答案:

答案 0 :(得分:1)

在OnBarcode上调用时,似乎未从主线程调用导航和pagedialog。我通过将导航和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"));
            }
        }