【问题标题】:Handling Slow Page Load Times in Xamarin Forms在 Xamarin 表单中处理缓慢的页面加载时间
【发布时间】:2020-01-06 12:39:18
【问题描述】:

在示例 Xamarin Forms Prism 应用程序中,我使用以下代码从 MainPage 导航到 Page2

await NavigationService.NavigateAsync("Page2");

如果Page2 包含一个 Syncfusion 控件(例如,选项卡视图之类的东西),我注意到在页面转换发生之前有相当长的延迟。这在旧硬件上肯定更明显。我还注意到导航栏中的标题会在页面呈现之前立即更改。

是什么导致了这种延迟?有没有办法让我在页面准备好呈现之前抛出某种类型的 loading 消息?

更新

这是一些代码...

MainPage.xaml

<?xml version="1.0" encoding="utf-8" ?>

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="StackOverflow.Views.MainPage" Title="{Binding Title}">
    <StackLayout>
        <Button Command="{Binding NavigateToPage2Command}" Text="Navigate to Page 2" />
    </StackLayout>
</ContentPage>

MainPageViewModel.cs

using Prism.Commands;
using Prism.Navigation;

namespace StackOverflow.ViewModels
{
    public class MainPageViewModel : ViewModelBase
    {
        public MainPageViewModel(INavigationService navigationService) : base(navigationService)
        {
            Title = "Main Page";

            NavigateToPage2Command = new DelegateCommand(NavigateToPage2CommandExecute);
        }

        public DelegateCommand NavigateToPage2Command
        {
            get;

            set;
        }

        public async void NavigateToPage2CommandExecute()
        {
            await NavigationService.NavigateAsync("Page2");

            return;
        }
    }
}

Page2.xaml

<?xml version="1.0" encoding="utf-8" ?>

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:sf="clr- namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="StackOverflow.Views.Page2" Title="{Binding Title}">
    <sf:SfTabView>
        <sf:SfTabItem Title="Tab 1" />
        <sf:SfTabItem Title="Tab 2" />
        <sf:SfTabItem Title="Tab 3" />
        <sf:SfTabItem Title="Tab 4" />
        <sf:SfTabItem Title="Tab 5" />
    </sf:SfTabView>
</ContentPage>

Page2ViewModel.cs

using Prism.Navigation;

namespace StackOverflow.ViewModels
{
    public class Page2ViewModel : ViewModelBase
    {
        public Page2ViewModel(INavigationService navigationService) : base(navigationService)
        {
            Title = "Page 2";
        }
    }
}

【问题讨论】:

    标签: xamarin.forms prism syncfusion


    【解决方案1】:

    你可以在你的视图模型中有一个加载属性,最初是这样的。然后有一个标签说正在加载,它的 IsVisible 绑定到 vms IsLoading。同样,您可以将同步融合 IsVisible 绑定到相同的 IsLoading,并使用否定布尔值的转换器。

    【讨论】:

      【解决方案2】:

      具体是什么导致延迟很难说,因为我们实际上没有来自您应用的代码。也就是说,通常会发生这种情况,因为您正在阻止某些东西。有几种方式可能会发生这种情况。

      假设您使用的是 Prism 7.2,您可能正在使用 IInitialize 和一些需要一段时间才能完成的同步代码。同样,您可能正在使用 IInitializeAsync 并且有一个长时间运行的任务导致 Page2 被推送到导航堆栈之前的延迟。

      如果您当前使用的是旧版本的 Prism,那么您可能正在使用 OnNavigatingTo(7.2 不再支持该功能),并且等效于 IInitialize。

      您可能还使用了 IConfirmNavigation/IConfirmNavigationAsync,这同样会导致延迟。

      至于如何正确处理这个问题,有几个选项...如果您在初始化后对可见的 UI 更新感到满意,您可以使用 async voidIInitialize.Initialize。您可能还想在 MainPageViewModel 中实现一个繁忙的属性并实现 IConfirmNavigation(假设您还没有)并将 IsBusy 设置为 true,以便您可以在 MainPage 上显示某种加载指示器。

      【讨论】:

      • 我更新了原始问题以包含一些代码。我没有使用任何fancy(还)。延迟似乎发生在我第一次从主页导航到第二页时。如果我导航回主页,然后再次导航到第二页,延迟会短得多,在更好的硬件上几乎不明显。我提到最后一点只是因为我们的目标设备使用的是旧硬件,而 Kit Kat 是它将支持的最新设备。这些设备上的延迟更为明显。
      • 继续我的最后一条评论,当我第一次导航到第二页时,调试输出中有 flurry 的活动。在随后导航到第二页时,调试输出中的此活动不会发生。
      • 如果您注释掉 SfTabView 问题是否仍然存在?
      • 没有。此外,如果我用类似股票按钮之类的东西替换选项卡视图,它会立即呈现而不会出现问题。这当然似乎与 Syncfusion 控件有关。查看调试输出,它似乎正在尝试在第一次导航上加载少量引用(这似乎是有道理的,为什么在后续导航中不会发生延迟)。我不确定这是否是 Syncfusion 的事情,或者是否可能与其他控件一起发生。不管怎样,我很好奇是否有推荐策略来处理这种情况。
      【解决方案3】:

      我是 syncfusion 员工。我尝试使用 Android sdk 19 在 Moto E 设备中复制该问题。加载时间非常短。我无法为此附加视频,因为 sdk 19 不支持屏幕录制应用程序。如果您的设备的加载时间很长,能否请您提供设备详细信息,以便我们更好地为您提供帮助。如果加载了繁重的 UI,Andy 的回答听起来也很有希望。

      【讨论】:

        猜你喜欢
        • 2021-10-09
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        • 2022-01-20
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多