1
App.cs.xでスプラッシュ画面を作成しています。私が使用するときSplashWorker.RunWorkerAsync();
DataTemplateは現れません。
このコードに注釈を付けると、DataTemplateが表示されました....DataTemplateがApplication_Startupに表示されない
ViewModelとResourceDictionaryが正しく登録されています。
App.xaml
<Application .......... Startup="Application_Startup">
App.cs
private void Application_Startup(object sender, StartupEventArgs e)
{
this.ShutdownMode = ShutdownMode.OnExplicitShutdown;
SplashWindow sw = new SplashWindow();
sw.Closed += (ss, ee) =>
{
if (ServiceLocator.Current.GetInstance<SplashViewModel>().ClosedByUser)
{
this.Shutdown();
}
ServiceLocator.Current.GetInstance<SplashViewModel>().Cleanup();
sw = null;
};
if ((bool)sw.ShowDialog())
{
this.ShutdownMode = ShutdownMode.OnMainWindowClose;
MainWindow = new MainWindow();
MainWindow.Show();
}
}
SplashViewModel.cs
public SplashViewModel()
{
SplashWorker = new BackgroundWorker();
SplashWorker.WorkerSupportsCancellation = true;
SplashWorker.DoWork += SplashWorker_DoWork;
SplashWorker.RunWorkerCompleted += SplashWorker_RunWorkerCompleted;
Result = null;
SplashWorker.RunWorkerAsync();
}
private void Application_Startup(object sender, StartupEventArgs e)
{
this.ShutdownMode = ShutdownMode.OnExplicitShutdown;
SplashWindow sw = new SplashWindow();
sw.Closed += (ss, ee) =>
{
if (ServiceLocator.Current.GetInstance<SplashViewModel>().ClosedByUser)
{
this.Shutdown();
}
ServiceLocator.Current.GetInstance<SplashViewModel>().Cleanup();
sw = null;
};
sw.Loaded += (ss, ee) =>
{
ServiceLocator.Current.GetInstance<SplashViewModel>().RunWorker();
};
if ((bool)sw.ShowDialog())
{
this.ShutdownMode = ShutdownMode.OnMainWindowClose;
MainWindow = new MainWindow();
MainWindow.Show();
}
}
DataTemplateはバインディング中に動作しますが、これはInitializeComponentメソッドの後に発生します。ですから、あなたのSplashWorkerコードをアプリケーションの 'Startup'イベントに入れてください。 – AnjumSKhan
私は形式的に適切なクレジットを持つ正式な回答を追加しました –