Как предварительно загрузить XAML при запуске приложения?
У меня довольно большой UserControl, который не отображается на главном экране, но пользователь почти всегда использует его позже. Загрузка занимает некоторое время в первый раз (анализ BAML и т. Д.), Тогда как другие экземпляры создаются довольно быстро. Вопрос в том, как сделать так, чтобы он загружался при запуске приложения во время заставки?
Моя идея заключалась в том, чтобы создать используемый экземпляр при запуске:
void Startup()
{
//....
new MyCustomControl();
//....
}
но тогда мне приходится иметь дело со специальной конструкцией (у нее нет конструктора по умолчанию без аргументов). Я думаю, что должен быть более удобный способ.
2 ответа
Чтобы предварительно загрузить сложные пользовательские интерфейсы, чтобы они занимали меньше времени, когда они "просматриваются" на экране, нам нужно выполнить следующие шаги...
Заставь его загрузиться в невидимом режиме. Измените все привязки на триггер видимости. Таким образом, поток пользовательского интерфейса не будет блокировать или занимать время для выполнения рендеринга в невидимом режиме.
<Style TargetType="TextBlock"> <Style.Triggers> <Trigger Property="IsVisible" Value="True"> <Setter Property="Text" Value="{Binding Value}"/> </Trigger> </Style.Triggers> </Style>
Отделите загрузку контекста данных (viewmodel) от загрузки пользовательского интерфейса. Это означает, что любые данные, представленные пользовательским элементом управления, могут быть загружены в рабочий поток, а затем пользовательский интерфейс должен быть уведомлен с помощью Dispatcher.BeginInvoke(). Убедитесь, что это происходит, когда пользовательский интерфейс виден, иначе привязки вступят в силу из-за шага 1.
Когда пользовательский интерфейс фактически "просматривается", задайте хореографию загрузки регионов пользовательского интерфейса... например, используйте расширители и сверните их по умолчанию... но когда пользовательский интерфейс просматривается, начните скользить расширитель, используя скользящую анимацию и анимацию непрозрачности контента, чтобы показать содержимое внутри и т.д...
В нашем приложении мы использовали такие методы для создания сложных пользовательских интерфейсов для быстрой загрузки и быстрого реагирования. Один такой пользовательский интерфейс, который при просмотре представлял собой географическую карту, не только блокирует поток пользовательского интерфейса, но и загружается за 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");
}