【问题标题】:Using Xamarin.Forms.Behaviors in XAML causes TargetInvocationException in iOS but not in Android在 XAML 中使用 Xamarin.Forms.Behaviors 在 iOS 中会导致 TargetInvocationException,但在 Android 中不会
【发布时间】:2025-12-01 21:25:01
【问题描述】:

我正在做一个 Xamarin.Forms 应用程序,我需要使用行为。我已经将 Xamarin.Forms.Behaviors 包添加到项目中,并在一个页面的 XAML 中添加了一个行为,因此当ListView 的选择发生变化时会执行一个命令:

<b:Interaction.Behaviors>
    <b:BehaviorCollection>
        <b:EventToCommand Command="{Binding ItemSelectedCommand}" EventName="ItemSelected" />
    </b:BehaviorCollection>
</b:Interaction.Behaviors>

这在 Android 上运行良好,但同一项目在 iOS 下导航到同一页面时会抛出 TargetInvocationException。这可能是什么原因造成的?

【问题讨论】:

    标签: xaml xamarin xamarin.ios xamarin.forms


    【解决方案1】:

    Xamarin 的 iOS 链接器在剥离它认为未使用或未引用的符号/类型时更具侵略性;而 Xamarin.Forms XAML 通常是这个过程的受害者。

    有两种方法可以解决此问题: - 更改链接器的剥离模式(右键单击 Xamarin.iOS 项目 -> Properties -> iOS Build 选项卡 -> 将 Linker behavior 设置为 Link SDK assemblies onlyDon't link)。这将确保在创建应用程序包时删除最少数量的符号(或根本不删除),缺点是应用程序大小将急剧增加。 - 创建一个手动引用这些类型的代码文件(例如创建未使用的实例),这样它们就不会被自动剥离。 MvvmCross use this approach 之类的库。

    后一种方法是推荐的,尽管它需要做更多的工作。当您使用具有大量类型的第三方库时,应该使用前一个库,并且要引用所有这些类型需要更多的工作。

    【讨论】: