代码之家  ›  专栏  ›  技术社区  ›  Alex

从事件调用时,Xamarin.Forms导航将无法工作

  •  0
  • Alex  · 技术社区  · 7 年前

    我正在使用Prism Unity开发一个带有蓝牙扫描仪的库存管理应用程序。 起初我在HID模式下使用扫描仪,但在扫描仪处于睡眠模式后,HID初始化速度非常慢。所以我决定使用蓝牙SPP,它工作得更好。但是我遇到了这个错误,我不明白为什么它不起作用。

    蓝牙服务在后台运行,并触发一个事件my 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");
            }
        }
    

    编辑:打字错误

    1 回复  |  直到 7 年前
        1
  •  1
  •   Alex    7 年前

    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"));
                }
            }