Создание и изменение заставки в WPF
У меня есть следующий код:
Thread thread = new Thread(new ThreadStart(CreateSplashScrn));
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
OpenSplashScrn();
ChangeSplashScrnMessageText("String");
public void CreateSplashScrn()
{
splash = new SplashScreen(this);
System.Windows.Threading.Dispatcher.Run();
}
public void OpenSplashScrn()
{
splash.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(() => { splash.Show(); }));
}
public void ChangeSplashScrnMessageText(string messageText)
{
splash.messageLabel.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(() => { splash.messageLabel.Content = messageText; }));
}
Однако это возвращает исключение нулевой ссылки в OpenSplashScrn(). Как я могу открыть это в другой теме и изменить содержимое метки? Возможно ли это через задачу?
1 ответ
Вы не должны открывать разделительный экран в фоновом потоке и выполнять длительную инициализацию в потоке пользовательского интерфейса.
Вы должны открыть заставку в потоке пользовательского интерфейса и выполнить долгосрочную инициализацию в потоке без пользовательского интерфейса.
var splash = new SplashScreen(this);
splash.Show();
Thread thread = new Thread(new ThreadStart(Initialize));
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
public void Initialize()
{
//move your long running logic from your app here..
ChangeSplashScrnMessageText("Initialization Started");
Thread.Sleep(1000);
ChangeSplashScrnMessageText("Initialize finished");
}
public void ChangeSplashScrnMessageText(string messageText)
{
splash.messageLabel.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(() => { splash.messageLabel.Content = messageText; }));
}
РЕДАКТИРОВАТЬ: Почему вы не должны открывать Splash Screen в другой теме?
Потому что это усложняет логи, и на 99% нет причин делать это. Вы можете иметь несколько окон, работающих в одном потоке, и при этом выполнять некоторые длительные задачи в фоновом режиме.
Я предполагаю, что в вашем главном окне вы пытаетесь выполнить долгосрочную задачу в потоке пользовательского интерфейса. Просто переместите его в фоновый поток...