You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms中SwipeView嵌套引发调用目标异常问题求助

解决Xamarin.Forms 4.7中SwipeView嵌套CollectionView的Android异常问题

首先,从你的错误日志和布局代码来看,这个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:27:39