我在 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] 删除。
我来说两句