我有非常大的UserControl,它没有在主屏幕上显示,但用户几乎总是在以后使用它。首次加载需要一些时间(解析BAML等),然后构建其他实例的速度非常快。问题是如何在启动画面期间让它在app启动时预加载?
我的想法是在启动时构建usused实例:
void Startup()
{
//....
new MyCustomControl();
//....
}
然后我必须处理特殊情况构造(它没有没有args的默认构造函数)。我认为应该有更方便的方式。
答案 0 :(得分:3)
要预先加载复杂的用户界面以便他们在屏幕上实际“查看”时花费更少的时间,我们必须遵循以下步骤...
将其加载到Invisible模式。将所有绑定更改为基于可见性触发器。这样,UI线程既不会阻塞也不会花时间在不可见模式下执行渲染。
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="IsVisible" Value="True">
<Setter Property="Text" Value="{Binding Value}"/>
</Trigger>
</Style.Triggers>
</Style>
从UI加载中分离数据上下文(viewmodel)加载。这意味着用户控件表示的任何数据都可以加载到工作线程上,然后必须使用Dispatcher.BeginInvoke()通知UI。确保在UI可见时发生这种情况,否则绑定将因步骤1而生效。
当UI实际上被“查看”时,编排UI区域的加载...例如使用Expanders并默认折叠它们......但是当查看UI时,使用滑动动画和内容不透明度动画开始滑动扩展器以显示其中的内容等...
在我们的应用程序中,我们采用这些技术来实现复杂的UI,以便快速加载并做出响应。一个这样的UI,在查看时是地理地图,不仅会阻止UI线程,还需要20秒才能加载。使用上述步骤,加载减少到4秒,UI线程没有阻塞。
我希望这些步骤对您也有所帮助。
答案 1 :(得分:0)
您可以使用App ctor或Startup
App()
{
System.Diagnostics.Debug.WriteLine("App ctor");
//ctor
}
private void Application_Startup(object sender, StartupEventArgs e)
{
System.Diagnostics.Debug.WriteLine("App Startup");
}