Xamarin 表单选项卡式页面选项卡正在初始化

Posted

技术标签:

【中文标题】Xamarin 表单选项卡式页面选项卡正在初始化【英文标题】:Xamarin Forms Tabbed Page Tabs Initializing 【发布时间】:2021-12-30 06:40:01 【问题描述】:

我正在 Xamarin 中开发一个选项卡式页面,其中包含 3 个选项卡(Tab1= "Home" , Tab2= "Chat" ,Tab3="Menu" )

当应用程序启动 (MainPage = new TabbedPage()) 时,它首先将所有选项卡一起初始化 (InitializeComponent();)。

我的问题是,是否有办法在按下选项卡时单独初始化每个组件?

【问题讨论】:

您是否试图通过延迟那些 InitializeComponent 调用来加快应用程序加载速度?你能改变 XAML 看到的内容,一开始就快速吗?有时它不是 XAML 本身 (InitializeComponent),而是被引用的数据。如果是数据,请参阅How to load data in TabbedPage when a tab is clicked?。例如,如果一个页面有一个ListViewCollectionView,你从一个 empty 项目源(零项目)开始。单击页面时,将项目添加到项目源。 无论如何,请出示您的代码。并说明您要解决的问题。尽可能地隔离问题。例如,如果您的目标是加快应用启动速度,那么就这么说吧。尽可能具体。如果您发现Tab2="Chat" 页面需要很长时间才能加载,那么请说出来。这些对您问题的改进使人们可以提供有用的建议。 是的,你的权利我应该清楚地说明我的问题。是的,正如你所说,我的目标是加快我的应用程序,因为我在选项卡中的页面很重,并且在集合视图中有许多绑定和控件。所以我的应用程序向我发送警告说它在主线程上负载很重并且跳过了 100 多帧。我正在考虑的是在单击选项卡时单独为每个选项卡加载 xaml 部分。 根据需要显式加载 xaml 确实可以让您完全控制。请注意,根据我的经验,它(首次加载)并不比我展示的(这很容易实现)快得多。另一个值得了解的好选择是DataTemplateDataTemplateSelector。你从一个琐碎或空洞的DataTemplate开始;这应该与手动加载 XAML 一样快(并且更容易编码)。 底线: - XAML 加载非常快。仅仅推迟加载是微不足道的。直到 XF 进行测量和布局,它才会变慢。 【参考方案1】:

根据我的经验,大部分时间不是加载 XAML,而是 “测量和布局” 的组合,然后是 “加载数据”(例如列表中的项目)。

这个例子展示了如何推迟“测量和布局”。就像在你想推迟的任何 XAML 上设置 IsVisible="False" 一样简单。然后在需要的时候设置IsVisible="True"。我展示了最简单的情况,没有数据绑定。

延迟数据加载取决于您的数据。最简单的技术是使用零元素开始所有列表(ListViewCollectionView)。当需要数据时,添加元素。我没有在下面显示。见How to load data when a tab is clicked。

注意:在 Android 上,如果您有 Visual Studio 2019 EnterpriseInitializeComponent 可以进一步加速。在您的MyProjectName.android 项目中,在项目属性/Android 选项(用于配置"Release")/代码生成和运行时中,选中“AOT 编译”。和“启用启动跟踪”。您可能还需要检查“使用 LLVM 优化编译器”。这些选项可能会增加应用程序包的大小。 在实际设备上测试加载时间 - 模拟器可能会给出关于哪种组合加载速度最快的误导性结果。 (这些选项可能会给 Android 模拟器带来非常缓慢的负载。)

(不幸的是,我的经验是 Xamarin Forms Android 初始应用程序加载仍然明显慢于加载 Xamarin(本机)Android 应用程序(我认为这是加载 Xamarin Forms 库本身的时间)。我建议创建一个本机 Activity 以立即加载,以便在 XF 加载时显示一个页面。这是一个不同的主题。)

TabbedPage1.xaml:

<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:local="clr-namespace:TabbedPage1.Views"
            x:Class="TabbedPage1.TabbedPage1">
    <local:StartPage Title="Start" />
    <local:SlowPage Title="Slow Load" />
</TabbedPage>

TabbedPage1.xaml.cs:

using Xamarin.Forms;

namespace TabbedPage1

    public partial class TabbedPage1 : TabbedPage
    
        public TabbedPage1()
        
            InitializeComponent();
        
    

SlowPage.xaml:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TabbedPage1.Views.SlowPage">
    <ContentPage.Content>
        <StackLayout x:Name="MyContents" IsVisible="False">
            <Label Text="This text should appear after a 3 second delay."
                VerticalOptions="CenterAndExpand" 
                HorizontalOptions="CenterAndExpand" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

SlowPage.xaml.cs:

using System.Threading.Tasks;
using Xamarin.Forms;

namespace TabbedPage1.Views

    public partial class SlowPage : ContentPage
    
        public SlowPage()
        
            InitializeComponent();
        

        protected override async void OnAppearing()
        
            base.OnAppearing();

            if (!MyContents.IsVisible) 
                // Simulate a page that is slow to layout or load.
                await Task.Delay(3000);
                
                MyContents.IsVisible = true;
            
        
    

StartPage.xaml:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TabbedPage1.Views.StartPage">
    <ContentPage.Content>
        <StackLayout>
            <Label Text="Welcome!" FontSize="32"
                VerticalOptions="CenterAndExpand" 
                HorizontalOptions="CenterAndExpand" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

StartPage.xaml.cs:

using Xamarin.Forms;

namespace TabbedPage1.Views

    public partial class StartPage : ContentPage
    
        public StartPage()
        
            InitializeComponent();
        
    

【讨论】:

以上是关于Xamarin 表单选项卡式页面选项卡正在初始化的主要内容,如果未能解决你的问题,请参考以下文章

为啥我更改的字符串没有出现在使用选项卡式表单 xamarin 的其他页面上

如何在 Xamarin.Forms 的 TabbedPage 的选项卡中放置一个按钮?

Xamarin - 从按钮更改选项卡式页面

HTML 选项卡式表单滑动

如何在 Xamarin Forms 中更改选项卡式页面指示器的颜色

自定义选项卡式页面渲染器 Xamarin Android