关于 Xamarin Forms - Xaml 编译

斯泰兹宠物

我在 App.xaml.cs 中添加了以下代码行,以便在所有页面中启用 xaml 编译。

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace MyApp
{
}

此外,我在我的一个 xaml 视图中添加了这行代码,以在 Android 的特定控件中启用 ZIndex。

xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"
android:VisualElement.Elevation="10"

所以我的疑问是,它会影响 Xaml 编译吗?如果我添加上面的代码行会影响我的视图性能吗?

寿司宿醉

注意:我假设您使用 .NetStd 库项目而不是共享代码项目作为 XAML 代码的“容器”,并且您还使用最新版本的 Xamarin.Forms

android:VisualElement.Elevation="10"

VisualElement.Elevation 当通过 XAMLC 编译成 IL 时,将成为附加到每个控件的基于表单的可绑定属性,即

IL_0085:  ldsfld     [Xamarin.Forms.Core]Xamarin.Forms.BindableProperty [Xamarin.Forms.Core]Xamarin.Forms.PlatformConfiguration.AndroidSpecific.VisualElement::ElevationProperty

所以我的疑问是,它会影响 Xaml 编译吗?如果我添加上面的代码行会影响我的视图性能吗?

所以它被编译成 IL,XAML 没有嵌入到程序集中,当然存在于部署这个跨平台 NetStd/PCL 程序集的所有平台上(这就是使用基于平台的绑定属性的原因)。在运行时,属性被分配,是的,有一个关联的“开销”:

IL_008a:  ldc.r4     10
IL_008f:  newobj     instance void [netstandard]System.Nullable`1<float32>::.ctor(!0)
IL_0094:  box        [netstandard]System.Nullable`1<float32>
IL_0099:  callvirt   instance void [Xamarin.Forms.Core]Xamarin.Forms.BindableObject::SetValue([Xamarin.Forms.Core]Xamarin.Forms.BindableProperty,object)

注意:这个“开销”适用于所有平台,它只会在 Android 上设置“本机”字段的高度实际上可以做任何事情。

在自定义 Android 渲染器中直接分配 Elevation 是否会更快、内存效率更高,是的,但只有您才能确定(小)增益是否值得您的代码库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章