2013-05-22 2 views
0

Я знаю, что есть несколько потоков об инициализации материала в другом потоке, поэтому вам не нужно замораживать свой интерфейс. Но в моем случае эта инициализация включает в себя создание множества графиков (полилиний в холсте), поэтому, похоже, необходимо заморозить пользовательский интерфейс.WPF запускает интерфейсы без замораживания GUI

Это может быть достаточно хорошо, чтобы скрыть рамку, где объекты инициализируются (я уже дал сообщение «loading ..» ниже) и затем заморозил пользовательский интерфейс (пару секунд), а затем снова отобразил рамку.

Это то, что у меня есть до сих пор. Но он не работает ... он замораживает пользовательский интерфейс перед тем, как скрывать ничего, и он размораживается после загрузки полностью инициализируемого кадра. В противном случае вещь работает как шарм.

void Historics_showExperimentResults(object sender, EventArgs e) 
    { 
     aepPage = new AEPPage(); 
     resultsPage = new AEPResultSet(); 

     // I try to hide the frame. Below there is a "Loading..." nice text. 
     // not sure if it's the best way but it works if I dont show anything at the end 
     ParadigmFrame.Dispatcher.Invoke((Action)delegate 
     { 
      ParadigmFrame.Content = null; 
      ParadigmFrame.UpdateLayout(); 
     }); 

     // This is the initialization that needs to have the GUI thread 
     //because it draw some plots and polylines 
     aepPage.Dispatcher.Invoke((Action)delegate 
     { 
      aepPage.init(resultSet); 
     }); 

     //Then I want to go and visualize the initialized page with the plots 
     ParadigmFrame.Dispatcher.Invoke((Action)delegate 
     { 
      ParadigmFrame.Navigate(aepPage); 
     }); 
    } 

Любые подсказки ??? Как я уже сказал, я попытался поместить init в другой поток и добавить событие, когда закончил, но эти потоки нуждаются в контроле над пользовательским интерфейсом для инициализации полилиний на холсте, поэтому .. он не работает :(

! заранее спасибо

ответ

0

похоже Historics_showExperimentResults уже работает на UI потоке Попробуйте это:.

void Historics_showExperimentResults(object sender, EventArgs e) 
     { 
      aepPage = new AEPPage(); 
      resultsPage = new AEPResultSet(); 

      new Thread(_ => 
      { 
       // I try to hide the frame. Below there is a "Loading..." nice text. 
       // not sure if it's the best way but it works if I dont show anything at the end 
       ParadigmFrame.Dispatcher.Invoke((Action)delegate 
       { 
       ParadigmFrame.Content = null; 
       ParadigmFrame.UpdateLayout(); 
       }); 

       // This is the initialization that needs to have the GUI thread 
       //because it draw some plots and polylines 
       aepPage.Dispatcher.Invoke((Action)delegate 
       { 
        aepPage.init(resultSet); 
       }); 

       //Then I want to go and visualize the initialized page with the plots 
       ParadigmFrame.Dispatcher.Invoke((Action)delegate 
       { 
        ParadigmFrame.Navigate(aepPage); 
       }); 
      }).Start(); 
     } 
+0

Hum .. Я пробовал .. ничего не произошло :(Как я уже сказал, aepPage.init (resultSet), создает кучу полилиний и графиков, поэтому он должен работать в потоке пользовательского интерфейса, и это отнимающая много времени/блокирующая часть кода Моя основная забота - убедиться, что выполнено ParadigmFrame.Content = null (поэтому оно исчезает, и сообщение «Загрузка ..» становится видимым) Использование вашего решения не разрешило его :( – javirs

+0

hmm интересный - я понимаю вашу проблему. Dispatcher.Invoke() запустит делегат в потоке пользовательского интерфейса. Я ввел «новый поток», так что после первого 'dispatcher.invoke', поток пользовательского интерфейса должен получить некоторый передышку для запуска других событий в виде перерисовки UI и т. Д. Является ли поведение точно таким же, как без запуска в этой «новой теме»? Можете ли вы попытаться поместить Thread.Sleep после первый «диспетчер.Инвоке»? – YK1

+0

т.е.Я попытался добавить некоторый сон, чтобы дать немного воздуха в пользовательском интерфейсе, на самом деле я также пробовал это раньше, но ничего не изменилось :( – javirs

0

Я won't отметить это как ответ, так как это не .. но все еще есть обходной путь я

Что я делаю, это sp зажгли затухание, иницию и затухание в кусочки.

Я создал раскадровку, исчезать и прикрепить следующий шаг к законченному событию так, в какой-то псевдокод было бы:

StoryBoard sb = new StoryBoard; 
OnClick(object sender blabla) 
{ 
    storyBoard.add(fade out animation over ParadigmFrame); 
    storyBoard.Completed += performInit; 
    storyBoard.Begin(); 
} 

Так эта часть выполнена и paradigmFrame исчезает, показывающий ¨ Загрузка ... ¨ сообщение, которое ниже. Тогда ..

private blabla performInit() 
{ 
    aepPage.Dispatcher.Invoke((Action)delegate 
      { 
       aepPage.Finished += initFinished; 
       aepPage.init(resultSet); 
      }); 
} 

Конечно, я создал Готовое событие в моем классе aepPage и выстрелил, когда инициализация завершена. Поэтому во время всего этого процесса пользовательский интерфейс блокируется. «Loading ...» видно сообщение, и это не ужасно, но реальное решение не должно заморозить UI здесь ... А потом я показываю его

private void initFinished() 
{ 
    storyBoard.add(fade in animation over ParadigmFrame); 
    storyBoard.Completed -= performInit; 
    storyBoard.Begin(); 
} 

Это мой длинный и уродливые обходной путь ... Я все еще готов к новым решениям !!!

Спасибо!

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