如何在应用启动时预加载XAML

本文关键字:加载 XAML 启动 应用 | 更新日期: 2023-09-27 18:03:47

我有一个相当大的UserControl,它没有显示在主屏幕上,但用户几乎总是在以后使用它。第一次加载需要一些时间(解析BAML等),然后构建其他实例非常快。问题是如何让它在应用启动时预加载?

我的想法是在启动时构建usused实例:

void Startup()
{
    //....
    new MyCustomControl();
    //....
} 

,但是我必须处理特殊情况的构造(它没有没有参数的默认构造函数)。我想应该有更方便的方法。

如何在应用启动时预加载XAML

要预加载复杂的ui,以便在屏幕上实际"查看"它们时花费更少的时间,我们必须遵循以下步骤…

  1. 让它以不可见模式加载。将所有绑定更改为基于可见性触发器的绑定。这样UI线程既不会阻塞也不会花费时间在不可见模式下执行渲染。

    <Style TargetType="TextBlock">
            <Style.Triggers>
                    <Trigger Property="IsVisible" Value="True">
                            <Setter Property="Text" Value="{Binding Value}"/>
                    </Trigger>
            </Style.Triggers>
    </Style>
    
  2. 将数据上下文(视图模型)加载与UI加载分开。这意味着用户控件表示的任何数据都可以加载到工作线程上,然后必须使用Dispatcher.BeginInvoke()通知UI。请确保在UI可见时发生此操作,否则绑定将由于步骤1而生效。

  3. 当UI实际被"查看"时,编排UI区域的加载…默认情况下使用扩展器并折叠它们…但是当UI被查看时,开始滑动扩展器,使用滑动动画和内容不透明度动画来显示其中的内容等…

在我们的应用程序中,我们使用这些技术来实现复杂的ui,以快速加载和响应。一个这样的UI,如果在查看时是一个地理地图,不仅会阻塞UI线程,而且需要20秒才能加载。使用以上步骤,加载时间减少到4秒,UI线程没有阻塞发生。

你可以使用App或Startup

    App()
    {
        System.Diagnostics.Debug.WriteLine("App ctor");
        //ctor
    }
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("App Startup");
    }