2009-09-27 2 views
8

Для моего приложения WPF я сохраняю несколько пользовательских настроек, таких как положение окна, состояние окна и отображение диалога приветствия. Проблема в том, что, пока все загружается, я вижу много мигания и мерцания, когда окна загружаются, а затем мерцает, когда окно максимизируется после чтения в настройках.Скрыть окно WPF до полной загрузки

Я уже использую встроенную функцию заставки всплывающего экрана WPF PNG, но есть ли способ полностью скрыть рендеринг всех окон, пока все не будет полностью загружено?

ответ

10

Отредактируйте Application.xaml, удалите StartUpUri, вместо этого установите обработчик события StartUp. В Application.xaml.cs отредактируйте обработчик события запуска, чтобы отобразить всплывающее окно, загрузите ресурсы, создайте все, затем создайте главное окно и покажите его.

<Application 
    ... 
    StartUp="OnStartUp" 
    /> 

И:

private void OnStartUp(Object sender, StartupEventArgs e) 
{ 
    var settings = LoadSettingsFrom... // Call your implementation of load user settings 

    // Example only, in real app do this if's section on a different thread 
    if (settings.doShowSplashScreen) 
    { 
     var splashScreen = new SplashScreen(); 
     splashScreen.Show(); 
    } 

    // Load and create stuff (resources, databases, main classes, ...) 

    var mainWindow = new mainWindow(); 
    mainWindow.ApplySettings(settings); // Call your implementation of apply settings 

    if (doShowSplashScreen) 
    { 
     // send close signal to splash screen's thread 
    } 

    mainWindow.Show(); // Show the main window 
} 
+0

Отлично, спасибо! –

+0

Не понимаю. Встроенная функция заставки настраивается с помощью ActionScript SplashScreen Build Action на ресурсе изображения. Этот встроенный заставку автоматически загружается перед запуском события запуска. В приведенном выше коде создается новый экземпляр. Как насчет автоматического - как вы его отключите? Также, doSplashScreen ссылается выше. Где это определено? Примечание. Я использую VB.NET. – CyberMonk

+0

Я не предполагал, что какой-либо встроенный заставку используется (функциональность 1. добавлена ​​в WPF 3.5 SP1). Настройка действия сборки на изображение на SplashScreen дает вам ограниченную функциональность, чтобы отключить его, просто не устанавливайте действие сборки изображений на SplashScreen. doSplashScreen - псевдокод - это может быть любая проверка на основе конфигурации (например, пользовательские настройки). –

3

Есть функции, BeginInit и EndInit, если изменить свойства внутри этих функций, как ..

BeginInit(); 
... 
... // Do your code Initialization here... 
... 
EndInit(); 

тогда ваше окно не будет оказывать до EndInit() вызывается, он не будет мерцать.

+0

Это приводит к его краху – user1034912

0

Когда происходит эта нагрузка? Код, выполняемый в главном конструкторе Window, должен выполняться до отображения окна; если вы загружаете там какие-либо необходимые ресурсы, вы не должны видеть мерцание.

1

Вы можете установить окна WindowState в Minimized, а затем обработать событие ContentRendered и установить WindowState в Normal или Maximumized.

+0

Простейший путь, спасибо! Вместо этого я использовал событие Window_Loaded, в котором я выполняю все инициализацию моего приложения. Когда это будет сделано, установите WindowState и хорошо пойдем. –

Смежные вопросы