Заставка WPF с собственным потоком копается за другими окнами

При запуске моего приложения WPF мне нужно загрузить некоторые данные. Это может занять несколько секунд, поэтому я создал заставку с текстом прогресса и полосой. Экран запускается в собственном потоке:

public static class SplashScreen
{
     public static void ShowSplash()
     {
         if (_SplashThread == null)
         {
             _SplashThread = new Thread(() =>
                          {
                             _Splash = new WISplash();
                             _Splash.Show();
                             _Splash.Closed += (sender1, e1) => _Splash.Dispatcher.InvokeShutdown();
                             System.Windows.Threading.Dispatcher.Run();
                          });
             _SplashThread.SetApartmentState(ApartmentState.STA);
             _SplashThread.IsBackground = true;
             _SplashThread.Start();
         }
     }
}

Базовый класс WISplash - Window.

Изменить. Я должен сказать точнее: на моем экране-заставке нет такой же кнопки на панели задач. Фактически, у него вообще нет кнопки. Я загрузил базовый проект, чтобы продемонстрировать, что происходит: MyApp.zip

Есть ли возможность присвоить заставке ту же кнопку панели задач, что и главное окно?


person Norbert    schedule 19.06.2011    source источник
comment
Вместо того, чтобы показывать заставку в отдельном потоке, почему бы не загрузить данные в фоновом потоке?   -  person Kent Boogaart    schedule 20.06.2011
comment
К сожалению, это не вариант, поскольку данные определяют часть графического интерфейса.   -  person Norbert    schedule 20.06.2011
comment
Что вы имеете в виду Bind?   -  person Navid Rahmani    schedule 20.06.2011
comment
Если я нажимаю на панели задач значок моей программы, я хочу, чтобы заставка находилась наверху.   -  person Norbert    schedule 20.06.2011
comment
Если бы вы могли создать минимальный рабочий пример, который мы могли бы загрузить (просто заполните основной экран примера фиктивными данными и используйте таймер, чтобы это заняло некоторое время), тогда мы могли бы помочь вам лучше.   -  person saunderl    schedule 25.06.2011
comment
@ Норберт: ShowDialog(Application.Current.MainWindow) недопустимо?   -  person user7116    schedule 26.06.2011
comment
@saunderl: Я точно указал свою проблему.   -  person Norbert    schedule 26.06.2011
comment
@Norbert: Я загрузил вашу демо-версию MyApp.zip и запустил ее - я работаю на xp sp3, если это важно -. Он начинается, как и ожидалось, с отображения окна с индикатором выполнения, которое выполняет шаги каждые 500 миллисекунд, а по завершении появляется главное окно MyApp. Итак, в чем проблема?   -  person Jalal Said    schedule 28.06.2011
comment
@Jalal Aldeen Saa'd: когда вы видите индикатор выполнения, вы не видите кнопку более поздней панели задач. Это без кнопок, и я хочу, чтобы и экран-заставка, и главное окно использовали одну и ту же кнопку панели задач.   -  person Norbert    schedule 28.06.2011
comment
Я согласен с Кентом, который уже заметил, что такой способ реализации всплеска довольно необычен. В любом случае, если вы хотите, чтобы окно прогресса отображалось при нажатии кнопки панели задач приложения, вам нужно будет сделать то, что было предложено шестизначными переменными (используйте ShowDialog и установите окно владельца). Только так вы можете быть уверены, что окно прогресса не будет отставать от окна приложения.   -  person Sebastian Edelmeier    schedule 30.06.2011
comment
Маленькая ошибка - в WPF ShowDialog нет параметров. Вы должны установить свойство владельца всплывающего окна - ›msdn.microsoft.com/en-us/library/   -  person Sebastian Edelmeier    schedule 30.06.2011


Ответы (1)


Я бы посоветовал не давать окну-заставке какую-либо кнопку на панели задач. Когда ваше приложение активируется (с событием Application.Current.Activated), вы можете сделать это: 1) Сделать всплывающее окно видимым 2) Сделать всплывающее окно самым верхним (временно) 3) Подождать короткое время (несколько миллисекунд) 4) Сделать всплывающее окно не самым верхним Это заставит всплывающее окно появляться поверх всех других окон при активации.

Когда ваше приложение деактивируется (с событиями Application.Current.Deactivated или Application.Curent.Exit), сделайте окно-заставку скрытым.

Я думаю, это должно дать вам то поведение, которое вы ищете.

person Ed Bayiates    schedule 30.06.2011