【问题标题】:Calling InitializeComponent in OnAppearing method in Xamarin Forms Project在 Xamarin Forms 项目的 OnAppearing 方法中调用 InitializeComponent
【发布时间】:2018-03-04 03:55:28
【问题描述】:

是否有任何原因或问题我无法在 xamarin 表单项目中页面的 OnAppearing 函数中调用 InitializeComponent 方法? 我知道我必须只调用一次 InitializeComponent 来创建实际页面。但是,如果我检查内容是否已创建并按如下方式执行,该怎么办。这是一个糟糕的实施或实践吗?因为据说没有基于 xaml 的应用程序会这样做并且总是在页面的构造函数中调用它。

我想这样做的原因如下,因为 xamarin.forms 启动时间在 Android 上运行缓慢,如果您使用 Masterdetail 页面(我认为标签页也是如此),您必须在启动时对其进行初始化,这会导致每个在要初始化的 masterdetail 页面中定义的导航页面,它会花费您 2-3 秒,具体取决于您的 UI 可能会更高的成本。对此有何想法或经验?

protected override void OnAppearing()
 {    
   if (Content == null)
    {
     InitializeComponent();
    }
}

【问题讨论】:

    标签: xamarin xamarin.forms xamarin.android


    【解决方案1】:

    我不推荐这种方法。来自 xamarin 文档。

    该类的构造函数调用 InitializeComponent,然后调用 LoadFromXaml 方法,该方法从 PCL 中提取 XAML 文件(或其编译的二进制文件)。 LoadFromXaml 初始化 XAML 文件中定义的所有对象,将它们以父子关系连接在一起,将代码中定义的事件处理程序附加到 XAML 文件中设置的事件,并将生成的对象树设置为页面的内容。

    https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/getting_started_with_xaml/

    如果您的表单在 Android 上太慢,我会改为启用快速渲染

    在主活动的 OnCreate 中,在 Xamarin.Forms.Init 之前添加这行代码

    Forms.SetFlags("FastRenderers_Experimental");
    

    https://xamarinhelp.com/xamarin-forms-fastrenderers-android/

    尝试使用已编译的 Xaml 也无妨

    using Xamarin.Forms.Xaml;
    ...
    [XamlCompilation (XamlCompilationOptions.Compile)]
    public class HomePage : ContentPage
    {
    

    https://developer.xamarin.com/guides/xamarin-forms/xaml/xamlc/

    【讨论】:

    • 快速渲染器已经启用,但它们对启动没有帮助。这是关于 masterdetail 和 tabbedpage 性能的。你不告诉我为什么它意味着在构造函数中。谁这么说的,出于什么原因?我什至觉得如果您使用 mvvm,使用 onAppearing 任何页面加载速度更快。
    • 更新了答案并添加了额外的建议
    • 嗨,Ken,感谢您为我提供与这些无关的问题。我已经使用它们并且知道所有这些。那些也无助于启动时间。 AOT 是启动时间的唯一单一解决方案,它会导致应用程序大小变大。我的问题是关于处理的代码,而不是关于 xamarin 渲染器。从逻辑上讲,您的第一段是一个公平的观点,但我的经验却相反。你可以自己试试看有什么不同。尝试使用复杂的 UI 进行调用,正如我所说的那样,它会稍微快一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2016-12-02
    • 2017-09-25
    • 2021-02-20
    相关资源
    最近更新 更多