【问题标题】:How to preload XAML at app startup?如何在应用启动时预加载 XAML?
【发布时间】:2011-07-27 14:06:33
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c# .net wpf xaml


【解决方案1】:

要预加载复杂的 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 线程没有阻塞。

我希望这些步骤也能帮助到你。

【讨论】:

    【解决方案2】:

    您可以使用 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");
        }
    

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 2021-02-08
      • 2018-11-22
      相关资源
      最近更新 更多