如何在应用启动时预加载XAML
本文关键字:加载 XAML 启动 应用 | 更新日期: 2023-09-27 18:03:47
我有一个相当大的UserControl,它没有显示在主屏幕上,但用户几乎总是在以后使用它。第一次加载需要一些时间(解析BAML等),然后构建其他实例非常快。问题是如何让它在应用启动时预加载?
我的想法是在启动时构建usused实例:
void Startup()
{
//....
new MyCustomControl();
//....
}
,但是我必须处理特殊情况的构造(它没有没有参数的默认构造函数)。我想应该有更方便的方法。
要预加载复杂的ui,以便在屏幕上实际"查看"它们时花费更少的时间,我们必须遵循以下步骤…
-
让它以不可见模式加载。将所有绑定更改为基于可见性触发器的绑定。这样UI线程既不会阻塞也不会花费时间在不可见模式下执行渲染。
<Style TargetType="TextBlock"> <Style.Triggers> <Trigger Property="IsVisible" Value="True"> <Setter Property="Text" Value="{Binding Value}"/> </Trigger> </Style.Triggers> </Style>
-
将数据上下文(视图模型)加载与UI加载分开。这意味着用户控件表示的任何数据都可以加载到工作线程上,然后必须使用Dispatcher.BeginInvoke()通知UI。请确保在UI可见时发生此操作,否则绑定将由于步骤1而生效。
-
当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");
}