0
은 내가 caliburn.micro WPF 응용 프로그램을 가지고, 나는이 함수를 호출 F 번호에서 그것을 시작 해요 :배경 스레드의 Caliburn.Micro 응용 프로그램에서 만든 GUI 창 액세스 중?
public void LaunchGUI()
{
if (_guiWindow == null)
{
var windowThread = new Thread(() =>
{
try
{
// Create our context, and install it:
SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher));
AppBootstrapper.Initialize();
var app = new App();
app.InitializeComponent();
//guiWindow = app.MainWindow;
//// When the window closes, shut down the dispatcher
//guiWindow.Closed += (s, e) =>
// Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
//guiWindow.Closed += (s, e) =>
// guiWindow = null;
//guiWindow.WindowState = WindowState.Minimized;
//guiWindow.Show();
//guiWindow.WindowState = WindowState.Normal;
//guiWindow.Activate();
// Start the Dispatcher Processing
Dispatcher.Run();
}
catch (Exception e)
{
LogMessage("error in gui thread: " + e);
//guiWindow.Close();
//guiWindow = null;
}
});
windowThread.SetApartmentState(ApartmentState.STA);
windowThread.IsBackground = true;
windowThread.Start();
}
else
{
_guiWindow.WindowState = WindowState.Minimized;
_guiWindow.Show();
_guiWindow.WindowState = WindowState.Normal;
_guiWindow.Activate();
}
}
}
문제는 내가 메인 윈도우에 대한 참조를 가질 필요가있다 그래서 여전히 열려 있는지 여부를 추적 할 수 있지만 항상 null입니다 (따라서 주석 코드).
public void ShowGui()
{
if (guiWindow == null)
{
var windowThread = new Thread(() =>
{
try
{
// Create our context, and install it:
SynchronizationContext.SetSynchronizationContext(
new DispatcherSynchronizationContext(
Dispatcher.CurrentDispatcher));
guiWindow = new MainWindow();
// When the window closes, shut down the dispatcher
guiWindow.Closed += (s, e) =>
Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
guiWindow.Closed += (s, e) =>
guiWindow = null;
guiWindow.WindowState = WindowState.Minimized;
guiWindow.Show();
guiWindow.WindowState = WindowState.Normal;
guiWindow.Activate();
// Start the Dispatcher Processing
Dispatcher.Run();
}
catch (Exception)
{
try
{
guiWindow.Close();
}
catch (Exception)
{
throw;
}
guiWindow = null;
}
});
windowThread.SetApartmentState(ApartmentState.STA);
windowThread.IsBackground = true;
windowThread.Start();
}
else
{
guiWindow.WindowState = WindowState.Minimized;
guiWindow.Show();
guiWindow.WindowState = WindowState.Normal;
guiWindow.Activate();
}
}
내 질문은 어떻게 만들어 메인 창에 접근 할있다 : "정상적인"MVVM 응용 프로그램을 실행하고, 비슷한 방법으로 그것을 초기화 할 때이 잘 작동합니다?
여기에서 만든 주 스레드 또는 GUI 스레드에서 액세스하려고하든 항상 null입니다. – odkken
신경 쓰지 마라. 스레딩 문제인 것 같다. (초기화하기 위해 잠시 기다려야한다.) 이제는 다른 스레드에서 얻으려는 문제가 있지만 다른 주제입니다. 감사. – odkken