我有一个普通的条形码阅读器应用程序,它尝试使用搜索结果导航到新页面,但我收到了这个奇怪的 COMException,我根本不明白。
MainPage.xaml:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyApp.App.MainPage"
xmlns:local="clr-namespace:MyApp.App"
xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
<ContentPage.BindingContext>
<local:BarcodeScannerBindingContext />
</ContentPage.BindingContext>
<VerticalStackLayout
Padding="30,0"
Spacing="25">
<zxing:CameraBarcodeReaderView
x:Name="cameraBarcodeReaderView"
BarcodesDetected="OnBarcodesDetected"
IsDetecting="{Binding IsDetectingInternal}"
IsEnabled="{Binding IsDetectingInternal}" />
</VerticalStackLayout>
</ContentPage>
MainPage.xaml.cs:
private async void OnBarcodesDetected(object sender, BarcodeDetectionEventArgs e)
{
if (e.Results.Count() > 0)
{
BindingContext.IsDetectingInternal = false;
string barcode = e.Results[0].Value;
await Navigation.PushAsync(new ResultsPage(barcode)); //Throws COMException
}
}
堆栈跟踪:
在 WinRT.ExceptionHelpers.g__Throw|39_0(Int32 小时) 在 ABI.Microsoft.UI.Xaml.Controls.ICommandBarMethods.get_PrimaryCommands(IObjectReference _obj) 在 Microsoft.UI.Xaml.Controls.CommandBar.get_PrimaryCommands() 在 Microsoft.Maui.Controls.Toolbar.UpdateMenu() 在 Microsoft.Maui.Controls.Toolbar.MapToolbarItems(IToolbarHandler arg1,工具栏 arg2) 在 Microsoft.Maui.PropertyMapperExtensions.c__DisplayClass2_0`2.b__0(TViewHandler h, TVirtualView v, Action`2 p) 在 Microsoft.Maui.PropertyMapperExtensions.c__DisplayClass1_0`2.g__newMethod|0(IElementHandler 处理程序,IElement 视图) 在 Microsoft.Maui.PropertyMapper`2.c__DisplayClass5_0.b__0(IElementHandler h, IElement v) 在 Microsoft.Maui.PropertyMapper.UpdatePropertyCore(字符串键,IElementHandler viewHandler,IElement virtualView) 在 Microsoft.Maui.PropertyMapper.UpdateProperty(IElementHandler viewHandler,IElement virtualView,字符串属性) 在 Microsoft.Maui.Handlers.ElementHandler.UpdateValue(字符串属性) 在 Microsoft.Maui.Controls.Toolbar.SetProperty[T](T& backingStore, T value, String propertyName) 在 Microsoft.Maui.Controls.Toolbar.set_ToolbarItems(IEnumerable`1 值) 在 Microsoft.Maui.Controls.NavigationPageToolbar.ApplyChanges(NavigationPage navigationPage) 在 Microsoft.Maui.Controls.NavigationPageToolbar.NavigationPageChildrenChanged(Object s, ElementEventArgs a) 在 Microsoft.Maui.Controls.Element.OnChildAdded(Element child) 在 Microsoft.Maui.Controls.VisualElement.OnChildAdded(元素子级) 在 Microsoft.Maui.Controls.Element.InsertLogicalChild(Int32 索引,Element 元素) 在 Microsoft.Maui.Controls.Page.InternalChildrenOnCollectionChanged(对象发送者,NotifyCollectionChangedEventArgs e) 在 System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e) 在 Microsoft.Maui.Controls.NavigationPage.PushPage(页面页面) 在 Microsoft.Maui.Controls.NavigationPage.MauiNavigationImpl.c__DisplayClass9_0.b__0() 在 Microsoft.Maui.Controls.NavigationPage.d__100.MoveNext() 在 MyApp\MyApp.App\MainPage.xaml.cs 中的 MyApp.App.MainPage.d__3.MoveNext() 处:第 45 行
P.S.:
BarcodeScannerBindingContext
的代码取自这里
问题:我需要关闭扫描仪吗?如果需要,如何关闭?
所以,这是一个线程问题。是什么解决了这个问题(感谢@IV.的输入):
private void OnBarcodesDetected(object sender, BarcodeDetectionEventArgs e)
{
if (e.Results.Count() > 0)
{
BindingContext.IsDetectingInternal = false;
string barcode = e.Results[0].Value;
Action action = () => {
Navigation.PushAsync(new ResultsPage(barcode));
};
App.Current.Mainpage.Dispatcher?.DispatchAsync(action);
}
}