[WPF] Show/Hide "Please Wait..."-window in new thread
От: AHgpeu Украина  
Дата: 23.05.11 09:37
Оценка:
Отдельная формочка с кое-какой анимацией и текстом "Please wait..."
Как ее правильно показывать и прятать?
Причем показ и "прятанье" это два метода которые вызываются принудительно.
Я так понимаю что вариант с BackgroundWorker мне не подходит.
Потому что в нем сразу задаются
  • DoWork — сюда кладется все ЧТО нужно выполнить (различные вычисления бизнес логики), включая показ Wait window
  • RunWorkerCompleted — здесь (когда все вызовется) прячется Wait window
    но у меня не стоит сейчас задача делать какие-то вычисления в новом потоке. — Только показать когда нужно Wait-window
    что-то вроде такого:
    ShowWaitWindow();
    try
    {
      DoSomeCalculations();
      InitializeNecessaryControlsInView();
      ShowNecessaryView();
    }
    finally
    {
      HideWaitWindow();
    }


    Пробовал такой подход:

        public class WaitViewHandler
        {
            private Thread StatusThread;
    
            private WaitView waitView;
    
            public void Start(string aText)
            {
                //create the thread with its ThreadStart method
                StatusThread = new Thread(() =>
                {
                    try
                    {
                        waitView = new WaitView();
                        waitView.textblockText.Text = aText;
                        waitView.ShowInTaskbar = false;
                        waitView.ShowDialog();                    
                        waitView.Closed += (lsender, le) =>
                        {
                            //when the window closes, close the thread invoking the shutdown of the dispatcher
                            waitView.Dispatcher.InvokeShutdown();
                            waitView = null;
                            StatusThread = null;
                        };
    
                        //this call is needed so the thread remains open until the dispatcher is closed
                        System.Windows.Threading.Dispatcher.Run();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace);
                    }
                });
    
                //run the thread in STA mode to make it work correctly
                StatusThread.SetApartmentState(ApartmentState.STA);
                StatusThread.Priority = ThreadPriority.Normal;
                StatusThread.Start();
            }
    
            public void Stop()
            {
                if (waitView != null)
                {
                    //need to use the dispatcher to call the Close method, because the window is created in another thread, and this method is called by the main thread
                    waitView.Dispatcher.BeginInvoke(new System.Action(() =>
                                                                          {
                                                                              waitView.Close();
                                                                          }));
                }
            }
        }

    Но что-то Wait-window не всегда прячется.
    Бывает что висит по несколько окон.
    А иногда при попытке показать(или спрятать) вылетает Exception

    Есть решение для такой тривиальной задачи?
    Спасибо!
  • Re: [WPF] Show/Hide "Please Wait..."-window in new thread
    От: _Raz_  
    Дата: 23.05.11 09:46
    Оценка:
    Здравствуйте, AHgpeu, Вы писали:

    AH>
  • DoWork — сюда кладется все ЧТО нужно выполнить (различные вычисления бизнес логики), включая показ Wait window
    Показ Wait window не должен вызываться из DoWork

    AH>Есть решение для такой тривиальной задачи?

    Вынести создание и инициализацю окна из потока.
    ... << RSDN@Home 1.2.0 alpha 5 (M6) rev. 1511>>
  •  
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.