Я хочу отобразить экран-заставку в своем приложении, поскольку мне нужно прочитать некоторые данные на диске и соответствующим образом настроить интерфейс. Если бы я этого не делал, эффект был бы таков, что интерфейс загружался, а затем настраивался, и эффект был бы хорошо виден. Итак, моя идея - определить окно заставки globla и:

  1. В конструкторе.

    WindowState = WindowState.Minimized;  // <---- for the mainWindow
    splashScreen.Show();
    
  2. в событии WindowViewBase_Loaded

    SetInterfaceElements(); // <-------interface customization (1)    
    splashScreen.Close();  
    WindowState = WindowState.Maximized; // (2)
    Activate(); // <------------------------to put focus on
    

В конце концов, эффект всегда один и тот же, поэтому существует разрыв между (1) и (2).

Итак, я подумал о проблеме с обновлением. Я попытался заставить его с помощью UpdateLayout, но безуспешно. Итак, здесь другое решение, но всегда то же самое. Я что-то упускаю??

1
Luca 18 Апр 2016 в 10:57

3 ответа

Лучший ответ

В конструкторе mainView

public MainView()
{
  SplashScreen splashScreen = new SplashScreen();
  splashScreen.Show();
  ...
}

Затем

Action emptyDelegate = delegate { };
bool IsContentRendered = false;
private void WindowViewBase_Loaded(object sender, RoutedEventArgs e)
{
        SetInterfaceElements();
        Dispatcher.Invoke(emptyDelegate, DispatcherPriority.Render);<---to refresh
        IsContentRendered = true;
}

Ну наконец то

private void WindowViewBase_ContentRendered(object sender, EventArgs e)
{
 if (IsContentRendered)
    {
        if (splashScreen != null)
         splashScreen.Close();
        WindowState = WindowState.Maximized;
        Activate();
    }
}
1
Patrick 30 Апр 2016 в 15:25

Что вам нужно сделать, так это создать класс экрана-заставки и инкапсулировать все его функции. Кроме того, вам нужно активировать заставку через поток, например:

public static class SplashScreenView
{
    public static Show()
    {
    Thread thread = new Thread(() =>
            {
                splashScreenView = new SplashScreenView();
                ....
            }
            // you code
            thread.Start();
    }

    public static Close()
    {
     // close splash screen code
    }
}

После этого ваш код должен быть таким:

SplashScreenView.Show();
// all your code
SplashScreenView.Close();

Таким образом, вам не нужно увеличивать или уменьшать окно.

2
israel altar 18 Апр 2016 в 08:17

Лично я бы пошел с установкой Splash в качестве MainWindow при инициализации приложения, выполняя необходимую загрузку в загруженном обратном вызове окна-заставки, а затем открывая + изменяя фактическое MainWindow. Таким образом, вам не придется беспокоиться о зависаниях потоков / пользовательского интерфейса.

1
Dbl 18 Апр 2016 в 08:35