我有相当大的用户控件,它没有显示在主屏幕上,但用户几乎总是在以后使用它。第一次加载需要一些时间(解析 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 线程没有发生阻塞。
我希望这些步骤也能帮助您。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)