Xamarin.Forms 从事件调用时导航将不起作用
Xamarin.Forms navigation won't work when called from event
我正在使用 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 函数被调用。 DataOperationreturns右边"Artikel"甚至"Navigation fired!"出现在日志中。这怎么可能?我随便使用相同的功能?我在这里错过了什么?
编辑:打字错误
似乎在通过 OnBarcode 调用时,导航和页面对话框不是从主线程调用的。我通过将导航和页面对话框放在 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"));
}
}
我正在使用 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 函数被调用。 DataOperationreturns右边"Artikel"甚至"Navigation fired!"出现在日志中。这怎么可能?我随便使用相同的功能?我在这里错过了什么?
编辑:打字错误
似乎在通过 OnBarcode 调用时,导航和页面对话框不是从主线程调用的。我通过将导航和页面对话框放在 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"));
}
}