2013-07-12 4 views
1

창 안의 백그라운드에서 다른 창을로드하려고했습니다. 부모 창이 스플래시 화면으로 작용합니다. 내 경우에는입니다. 다른백그라운드에서 다른 창을로드하십시오. 렌더링 될 때 부모 창을 닫습니다.

InitWindow I = null; 
    public InitWindow() 
    { 
     InitializeComponent(); 
     I = this; 

     Thread T = new Thread(() => 
     { 
      MainWindow M = new MainWindow(); 
      M.Show(); 
      M.ContentRendered += M_ContentRendered; 
      System.Windows.Threading.Dispatcher.Run(); 
      M.Closed += (s, e) => M.Dispatcher.InvokeShutdown(); 

     }) { IsBackground = true, Priority = ThreadPriority.Lowest }; 

     T.SetApartmentState(ApartmentState.STA); 
     T.Start(); 
    } 

    void M_ContentRendered(object sender, EventArgs e) 
    { 
     I.Close(); 
    } 

모든 것이 잘 작동하지만에서 잘못된 연산 예외를 throw : 다른 스레드가 그것을 소유하고 있기 때문에이 개체에 액세스 할 수 없습니다

I.Close(); 

호출 스레드.

1) 어떻게 스레드를 전환/동기화합니까?

2) 더 좋은 해결책이 있습니까?

+0

대화 형 스플래시 화면의 경우 백그라운드에서로드 및 설정을 수행 한 다음 작업을 완료 한 후에 창 내용을 전환하십시오. –

+1

@ PatrykĆwiek 사용해야하는 두 개의 창 대신 하나 하나? – Umayr

+3

예, 내용을 먼저 표시하고로드를 한 다음 기본 창 내용을 표시하려는 내용으로 전환하십시오. 물론 인터랙티브 * 스플래시 화면에 유용합니다. 이미지가있는 경우 빌드 액션을 '스플래시 화면'으로 설정하면 문제없이 마술을 해결할 수 있습니다. –

답변

2

변경된 코드에 :

InitWindow I = null; 
    Thread C = null; 

    public InitWindow() 
    { 
     InitializeComponent(); 
     I = this; 
     C = Thread.CurrentThread; 

     Thread T = new Thread(() => 
     { 
      MainWindow M = new MainWindow(); 
      M.Show(); 
      M.ContentRendered += M_ContentRendered; 
      System.Windows.Threading.Dispatcher.Run(); 
      M.Closed += (s, e) => M.Dispatcher.InvokeShutdown(); 

     }) { IsBackground = true, Priority = ThreadPriority.Lowest }; 

     T.SetApartmentState(ApartmentState.STA); 
     T.Start(); 
    } 

    void M_ContentRendered(object sender, EventArgs e) 
    { 
     // Making the parent thread background 
     C.IsBackground = true; 
     // foreground the current thread 
     Thread.CurrentThread.IsBackground = false; 
     // Abort the parent thread 
     C.Abort(); 
    } 

지금 현재 잘 작동하지만 나는 그것이 신뢰할 수있는 솔루션 생각하지 않습니다.

관련 문제