Как предварительно загрузить XAML при запуске приложения?

У меня довольно большой UserControl, который не отображается на главном экране, но пользователь почти всегда использует его позже. Загрузка занимает некоторое время в первый раз (анализ BAML и т. Д.), Тогда как другие экземпляры создаются довольно быстро. Вопрос в том, как сделать так, чтобы он загружался при запуске приложения во время заставки?

Моя идея заключалась в том, чтобы создать используемый экземпляр при запуске:

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

но тогда мне приходится иметь дело со специальной конструкцией (у нее нет конструктора по умолчанию без аргументов). Я думаю, что должен быть более удобный способ.

2 ответа

Чтобы предварительно загрузить сложные пользовательские интерфейсы, чтобы они занимали меньше времени, когда они "просматриваются" на экране, нам нужно выполнить следующие шаги...

  1. Заставь его загрузиться в невидимом режиме. Измените все привязки на триггер видимости. Таким образом, поток пользовательского интерфейса не будет блокировать или занимать время для выполнения рендеринга в невидимом режиме.

    <Style TargetType="TextBlock">
            <Style.Triggers>
                    <Trigger Property="IsVisible" Value="True">
                            <Setter Property="Text" Value="{Binding Value}"/>
                    </Trigger>
            </Style.Triggers>
    </Style>
    
  2. Отделите загрузку контекста данных (viewmodel) от загрузки пользовательского интерфейса. Это означает, что любые данные, представленные пользовательским элементом управления, могут быть загружены в рабочий поток, а затем пользовательский интерфейс должен быть уведомлен с помощью Dispatcher.BeginInvoke(). Убедитесь, что это происходит, когда пользовательский интерфейс виден, иначе привязки вступят в силу из-за шага 1.

  3. Когда пользовательский интерфейс фактически "просматривается", задайте хореографию загрузки регионов пользовательского интерфейса... например, используйте расширители и сверните их по умолчанию... но когда пользовательский интерфейс просматривается, начните скользить расширитель, используя скользящую анимацию и анимацию непрозрачности контента, чтобы показать содержимое внутри и т.д...

В нашем приложении мы использовали такие методы для создания сложных пользовательских интерфейсов для быстрой загрузки и быстрого реагирования. Один такой пользовательский интерфейс, который при просмотре представлял собой географическую карту, не только блокирует поток пользовательского интерфейса, но и загружается за 20 секунд. Используя вышеперечисленные шаги, загрузка была уменьшена до 4 секунд, и поток UI не блокировался.

Я надеюсь, что эти шаги помогут вам тоже.

Вы можете использовать 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");
    }
Другие вопросы по тегам