Создание и изменение заставки в 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% нет причин делать это. Вы можете иметь несколько окон, работающих в одном потоке, и при этом выполнять некоторые длительные задачи в фоновом режиме.

Я предполагаю, что в вашем главном окне вы пытаетесь выполнить долгосрочную задачу в потоке пользовательского интерфейса. Просто переместите его в фоновый поток...

Другие вопросы по тегам