안녕하세요 wpf에서 Splash Window 만들다가 머리가 깨질거같아 여쭙습니다.
internal class App : PrismApplication
  {
      protected override Window CreateShell()
      {
          return Container.Resolve<MainWindow>();
      }
      protected override void RegisterTypes(IContainerRegistry containerRegistry)
      {
          base.RegisterTypes(containerRegistry);
      }
      protected override void InitializeModules()
      {
          SplashWindow splashWindow = new SplashWindow();
          Task task = new Task(() =>
          {
              splashWindow.Dispatcher.BeginInvoke(() =>
              {
                  splashWindow.ShowDialog();
              });
          });
          task.Start();
          splashWindow.ChangeState(ConnectState.Fail);
          Task.Delay(3000).ContinueWith(_ =>
          {
              splashWindow.Dispatcher.Invoke(() => splashWindow.Close());
          }, TaskScheduler.FromCurrentSynchronizationContext());
          base.InitializeModules();
      }
코드를 이것저것 주워와서 넣다 보니 App.cs에 이렇게 코딩되어 있습니다. 현재는 3초뒤에 종료되게끔 해놓았습니다.
             
            
              2개의 좋아요 
            
                
           
          
            
            
              넵 비슷하지만 스플래시 윈도우를 띄우고 끝나기 전까지 MainWindow가 오픈 안됐으면 합니다. app.cs에서 SplashWindow.Close() 됐을때 MainWindow가 오픈될수있게 하고싶습니다. ㅜ
             
            
              2개의 좋아요 
            
           
          
            
              
                그라목손  
              
                  
                    3월 22, 2023,  5:24오전
                   
                  4 
               
             
            
              메인윈도우 Hide 상태로 띄우고 스플래쉬 닫을 때 Show하면 안 되나요?
             
            
              2개의 좋아요 
            
           
          
            
              
                도깨비  
              
                  
                    3월 22, 2023,  6:55오전
                   
                  5 
               
             
            
              전 MainWindow를 교체하는 방식으로 사용합니다.
App.xaml.cs 에 OnStartup 함수에서 교체합니다.
protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            //스플래시 윈도우 띄움
            var splashWindow = new SplashWindow();
            this.MainWindow = splashWindow;
            this.MainWindow.Show();
            Task.Factory.StartNew(() =>
            {
                //잘 실행되는지 확인하기 위해 Delay
                System.Threading.Thread.Sleep(1000);
                this.Dispatcher.Invoke(() =>
                {
                    // 아래 new MainWindow를 호출하면서 MainViewModel이 실행되는데
                    // MainViewModel 생성자에서 초기화작업이 끝나면 MainWindow를 교체하면서 SplashWindow를 닫음.
                    var mainWindow = new MainWindow();
                    this.MainWindow = mainWindow;
                    mainWindow.Show();
                    splashWindow.Close();
                });
            });
        }
예제코드를 보니 헷갈릴수 있어 덧붙이자면 this.MainWindow와 new MainWindow()의 MainWindow는 다른 객체입니다.
             
            
              3개의 좋아요 
            
           
          
            
            
              감사합니다. 뭔가 오기가 생겨서 해보고 있습니다…!
             
            
              2개의 좋아요 
            
           
          
            
            
              감사합니다. 혹시 CreateShell에서 생성하는 윈도우는 어떻게 처리하셨나요??
             
            
              2개의 좋아요 
            
           
          
            
              
                hask  
              
                  
                    3월 28, 2023,  2:23오전
                   
                  9 
               
             
            
              어떻게 처리하셨나요 ? 저는 진행하다보니 SplashWindow.Close() 처리를 하면 Main이 같이 Close 되고 있습니다,
             
            
              2개의 좋아요 
            
           
          
            
            
              혹쉬 ShutdownMode 를 설정해보셨을까용?
             
            
              1개의 좋아요 
            
           
          
            
              
                hask  
              
                  
                    3월 28, 2023,  3:23오전
                   
                  11 
               
             
            
              protected override void OnStartup(StartupEventArgs e)
        var splashScreen = new LoadingWindow();
        this.MainWindow = splashScreen;
        splashScreen.Show();
        Task.Factory.StartNew(() =>
        {
            for (int i = 1; i <= 100; i++)
            {
                System.Threading.Thread.Sleep(30);
                splashScreen.Dispatcher.InvokeAsync(() => splashScreen.ProgressBar.Value = i);
            }
            this.Dispatcher.Invoke(() =>
            {
                ShutdownMode = ShutdownMode.OnMainWindowClose;
                splashScreen.Close();
            });
            var mainWindow = Container.Resolve<MainWindow>();/*new MainWindow();*/
            this.MainWindow = mainWindow;
            mainWindow.Show();
        });
    }
이런 상태에요,
             
            
              1개의 좋아요 
            
           
          
            
            
              저는 이렇게 해결했어요.
protected override Window CreateShell()
{
        return splashWindow;
}
protected override void InitializeModules()
{
        Task.Run(async () =>
        {
                await Task.Delay(1000);
                this.Dispatcher.Invoke(() =>
                {
                        this.MainWindow = new MyWindow();
                        this.MainWindow.Show();
                        splashWindow.Close();
                });
        });
            
        base.InitializeModules();
}
 
            
              1개의 좋아요 
            
           
          
            
              
                hask  
              
                  
                    3월 28, 2023,  5:31오전
                   
                  13 
               
             
            
              protected override void InitializeModules()
            for (int i = 1; i <= 100; i++)
            {
                await Task.Delay(30);
                this.Dispatcher.Invoke(() =>
                {
                    SplashView.Progress = i;
                    SplashView.Rate = i.ToString() + "%";
                });
            }
            this.Dispatcher.Invoke(() => SplashView.Message = $"Load Complete !");
            await Task.Delay(500);
            this.Dispatcher.Invoke(() =>
            {
                this.MainWindow = Container.Resolve<MainWindow>();/*new MainWindow();*/
                this.MainWindow.Show();
                SplashView.Close();
            });
        }).ContinueWith(task =>
        {
            Console.WriteLine($"Load Complete !");
        }, TaskScheduler.FromCurrentSynchronizationContext());
        base.InitializeModules();
    }
저는 이렇게 처리하였는데, MainWindow 에서 ButtonClick Binding Command 로 MainPage를 바꿔주려고 하니 Display가 먹통이 되던데 혹시 이유를 아실까요 ?
Command Event도 정상적으로 들어오는데 Display Change가 안바뀌더라구요,
Command Event 함수는 이렇습니다.
    private void ExecuteNavigation(string key)
    {
        RegionManager.RequestNavigate(RegionName.MainWindow, key);
    }
 
            
              1개의 좋아요 
            
           
          
            
            
              저도 비동기 함수쪽을 잘 몰라서 답변드리기 힘들거같습니다 ㅠㅠ
             
            
              1개의 좋아요 
            
           
          
            
            
              ShutdownMode 를 ShutdownMode.OnMainWindowClose 로 설정하고 splashScreen.Close() 했으니 당연한 거 같은데요?
정확히 말하면 mainWindow 가 닫히는 게 아니라 프로세스가 종료되는 겁니다.
this.MainWindow = splashScreen;
한 상태에서
ShutdownMode = ShutdownMode.OnMainWindowClose;
splashScreen.Close();
했으니 splashScreen 이 Close 되면서 프로세스가 종료되는 거 같습니다.ShutdownMode 값을 바꿔서 해보는 게 어떤가 싶어요.
             
            
              2개의 좋아요 
            
           
          
            
              
                hask  
              
                  
                    3월 29, 2023, 12:13오전
                   
                  16 
               
             
            
              App 개체 안에서 MainWIndow <=> SplashWindow 교체 과정에 생겼던 문제였습니다.
해당 조언으로 잘 해결되었습니다 ~!
             
            
              2개의 좋아요 
            
           
          
            
            
              안녕하세요, 예전에 이 글을 봤엇는데, 그때는 실력이 안되서 그냥 지나갔었습니다.
WPF에서 처음 생성된 Window를 MainWindow로 잡고있습니다. 
InitializeModules는 CreateShell이전에 실행되기 때문에 SplashWindow 종료 시 프로세스가 종료됩니다. 
 
이를 해결하기 위해서는 아래 처럼 mainWindow를 먼저 Resolve하고 Splash를 진행하시면됩니다.
protected override DependencyObject CreateShell()
{
	InitializeModules();
			
	// 먼저 Resolve된 Window를 MainWindow로 생각함
	var mainWindow = Container.Resolve<MainWindow>();
			
	Splash();
	return mainWindow;
}
private void Splash()
{
	var splashwindow = Container.Resolve<SplashWindow>();
	splashwindow.Show();
	var bootstrapManager = Container.Resolve<IBootstrapManager>();
	bootstrapManager.Init();
	splashwindow.Close();
}
나중에 이 글을 보시는 분들께 도움이 됐으면 좋겠네요
             
            
              2개의 좋아요