在XAML中使用Xamarin.Forms.Behaviors会在iOS中导致TargetInvocationException,但在Android中不会

r2d*_*igo 0 xaml xamarin.ios xamarin xamarin.forms

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

<b:Interaction.Behaviors>
    <b:BehaviorCollection>
        <b:EventToCommand Command="{Binding ItemSelectedCommand}" EventName="ItemSelected" />
    </b:BehaviorCollection>
</b:Interaction.Behaviors>
Run Code Online (Sandbox Code Playgroud)

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

r2d*_*igo 5

Xamarin的iOS链接器在删除其认为未使用或未引用的符号/类型时更具攻击性。Xamarin.Forms XAML通常是此过程的受害者。

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

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