Xamarin.Forms中SwipeView嵌套引发调用目标异常问题求助
首先,从你的错误日志和布局代码来看,这个TargetInvocationException主要由两个核心问题引发,同时可能伴随依赖库版本的小问题,下面一步步来解决:
1. 修复Grid布局的明显错误
你的ItemTemplate里的Grid存在一个致命的布局问题:你定义了ColumnSpan="2",但只声明了1列,同时多个Label绑定了Grid.Column="1"——这在Android布局渲染时会直接触发异常,因为没有对应的列可以放置这些控件。
修改Grid的列定义,添加第二列:
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <!-- 用于放置标题Label --> <ColumnDefinition Width="*" /> <!-- 用于放置绑定内容的Label --> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <!-- 剩下的控件保持不变,现在Grid.Column="1"就有对应的列了 --> <BoxView Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" BackgroundColor="Teal" HeightRequest="1" VerticalOptions="End" HorizontalOptions="FillAndExpand"/> <Label Grid.Row="1" Grid.Column="0" Text="Number:" FontAttributes="Bold"/> <Label Grid.Row="1" Grid.Column="1" Text="{Binding MyBinding}"/> <!-- ... 其他Label保持不变 --> </Grid>
2. 移除多余的外层ScrollView,解决滚动冲突
CollectionView本身已经内置了滚动功能,你把它嵌套在ScrollView里会导致Android底层的RecyclerView(CollectionView的Android实现)和ScrollView产生滚动冲突,进而触发布局测量异常,这也是TargetInvocationException的常见诱因。
直接去掉最外层的<ScrollView>,让CollectionView自己处理滚动:
<!-- 移除原来的ScrollView,保留里面的内容 --> <StackLayout Margin="10,5,10,5"> <Frame BorderColor="Teal"> <StackLayout> <Label Text="Deine Vokabel" HorizontalTextAlignment="Center" FontSize="Large" TextColor="Teal"/> <CollectionView x:Name="VList"> <!-- ItemTemplate保持修改后的内容 --> </CollectionView> </StackLayout> </Frame> </StackLayout>
3. 检查并统一Xamarin.Android.Support库版本
从你的日志可以看到,Mono在加载Xamarin.Android.Support.v7.RecyclerView.dll时依赖Xamarin.Android.Support.CustomView,如果这些库的版本不匹配,也会引发反射调用异常。
- 打开Visual Studio的NuGet包管理器,查看所有
Xamarin.Android.Support.*开头的包版本,确保它们的版本号完全一致; - 如果存在版本不一致的情况,将所有相关包更新到同一版本(Xamarin.Forms 4.7对应的Support库版本通常是
28.0.0.3左右,你可以根据Forms的版本匹配); - 清理项目的bin/obj文件夹,然后重新编译。
4. 调试技巧:查看InnerException
TargetInvocationException只是一个包装异常,真正的错误信息在它的InnerException属性里。下次调试触发断点时,在VS的“异常详情”窗口里展开InnerException,可以直接看到具体的错误原因(比如布局错误、控件初始化失败等),能更快定位问题。
修改后的完整布局示例
<StackLayout Margin="10,5,10,5"> <Frame BorderColor="Teal"> <StackLayout> <Label Text="Deine Vokabel" HorizontalTextAlignment="Center" FontSize="Large" TextColor="Teal"/> <CollectionView x:Name="VList"> <CollectionView.ItemTemplate> <DataTemplate> <SwipeView> <SwipeView.LeftItems> <SwipeItems> <SwipeItem Text="Delete" BackgroundColor="LightPink"/> <SwipeItem Text="Edit" BackgroundColor="LightGreen"/> </SwipeItems> </SwipeView.LeftItems> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <BoxView Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" BackgroundColor="Teal" HeightRequest="1" VerticalOptions="End" HorizontalOptions="FillAndExpand"/> <Label Grid.Row="1" Grid.Column="0" Text="Number:" FontAttributes="Bold"/> <Label Grid.Row="1" Grid.Column="1" Text="{Binding MyBinding}"/> <Label Grid.Row="2" Grid.Column="0" Text="MYText:" FontAttributes="Bold"/> <Label Grid.Row="2" Grid.Column="1" Text="{Binding MyBinding}"/> <Label Grid.Row="3" Grid.Column="0" Text="MyText:" FontAttributes="Bold"/> <Label Grid.Row="3" Grid.Column="1" Text="{Binding MyBinding}"/> <Label Grid.Row="4" Grid.Column="0" Text="MyText1:" FontAttributes="Bold"/> <Label Grid.Row="4" Grid.Column="1" Text="{Binding MyBinding}"/> <Label Grid.Row="5" Grid.Column="0" Text="MyText2:" FontAttributes="Bold"/> <Label Grid.Row="5" Grid.Column="1" Text="{Binding MyBinding}"/> <Label Grid.Row="6" Grid.Column="0" Text="MyText:" FontAttributes="Bold"/> <Label Grid.Row="6" Grid.Column="1" Text="{Binding MyBinding}"/> <BoxView Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="2" BackgroundColor="Teal" HeightRequest="1" VerticalOptions="End" HorizontalOptions="FillAndExpand"/> </Grid> </SwipeView> </DataTemplate> </CollectionView.ItemTemplate> </CollectionView> </StackLayout> </Frame> </StackLayout>
按照上面的步骤处理后,你的Android端异常应该就能解决了。
内容的提问来源于stack exchange,提问作者BiSaM

