Как предварительно загрузить XAML при запуске приложения? - PullRequest
5 голосов
/ 27 июля 2011

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 30 июля 2011

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

  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 секунд, и блокировка потока пользовательского интерфейса не происходила.

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

0 голосов
/ 28 июля 2011

Вы можете использовать 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");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...