На всякий случай, если кто-то задается вопросом об окончательном решении:
Сначала я использовал WindowManager для создания диалогового окна Splashscreen и позволяю SplashscreenViewModel выполнять всю работу.
Оказалось, что этот подход требуетвозраст для загрузки.Поэтому, когда я попытался выполнить это, потребовалось около 8 секунд, чтобы появился Dailog.Это слишком долго для моих нетерпеливых пользователей.Я думаю, это произошло потому, что я использовал IoC для введения большого количества зависимостей в SplashscreenViewModel.
windowManager.ShowDialog(new AnimatedSplashViewModel(locationEndpoint, userEndpoint, applicationEndpoint, adUser, clientInfo, locationInfo, loggedInUser));
Второй подход заключался в создании Splashscreen в качестве диалога и использовании BackgroundWorker для всех вычислений и API-интерфейсов внутри Bootstrapper.,Хотя это работало довольно быстро, я чувствовал, что должен быть лучший подход.
Третье и окончательное решение: Bootstrapper вызывает ShellViewModel.
public Bootstrapper()
{
Initialize();
DisplayRootViewFor<ShellViewModel>();
}
В методе OnInitialize, который я создалBackgroundWorker, который выполняет все длительные задачи при отображении SplashScreen в виде диалога с помощью WindowManager.
protected override void OnInitialize()
{
var windowManager = new WindowManager();
using (BackgroundWorker bw = new BackgroundWorker())
{
bw.DoWork += InitializeApplication;
bw.RunWorkerCompleted += InitializationCompleted;
bw.RunWorkerAsync();
windowManager.ShowDialog(new AnimatedSplashViewModel(_events));
}
}
Теперь для AnimatedSplashscreenViewModel требуется только одна зависимость - EventAggregator.Я позволил ему обрабатывать пользовательское событие с именем SplashMessageChangedEvent.
public class SplashMessageChangedEvent
{
public string Content { get; set; }
public bool CloseDialog { get; set; } = false;
public SplashMessageChangedEvent(string content)
{
Content = content;
}
public SplashMessageChangedEvent(bool closeDialog)
{
CloseDialog = closeDialog;
}
}
В событии InitializationCompleted в ShellViewModel я публикую следующее событие, чтобы закрыть диалог:
private void InitializationCompleted(object sender, RunWorkerCompletedEventArgs e)
{
_events.PublishOnUIThread(new SplashMessageChangedEvent(true));
}
Теперь этот последний подходнамного быстрее, чем два других.Экран-заставка отображается сразу после запуска исполняемого файла.