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

我的想法是在启动时构造用例:

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

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

最佳答案

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

  • 使它以不可见模式加载。将所有绑定(bind)更改为基于可见性触发器。这样,UI线程既不会阻塞也不会花费时间在不可见模式下执行渲染。
    <Style TargetType="TextBlock">
            <Style.Triggers>
                    <Trigger Property="IsVisible" Value="True">
                            <Setter Property="Text" Value="{Binding Value}"/>
                    </Trigger>
            </Style.Triggers>
    </Style>
    
  • 将数据上下文( View 模型)加载与UI加载分开。这意味着可以将由用户控件表示的任何数据加载到工作线程上,然后必须使用Dispatcher.BeginInvoke()通知UI。确保在UI可见时发生这种情况,否则绑定(bind)将由于步骤1而生效。
  • 当实际“查看” UI时,请编排UI区域的加载...例如使用扩展器并默认折叠它们...但是在查看UI时,开始使用滑动动画和内容不透明动画滑动扩展器以显示其中的内容,等等...

  • 在我们的应用程序中,我们采用了此类技术来实现复杂的UI,以快速加载并做出响应。一个这样的UI(当被查看时是地理 map )不仅会阻塞UI线程,而且还需要20秒的加载时间。使用上述步骤,负载减少到4秒,并且UI线程没有阻塞。

    希望这些步骤对您也有帮助。

    10-02 09:57
    查看更多