У меня есть приложение WPF & C #, которое содержит большую сетку DataGrid, около 35 столбцов х 50 строк, чтобы отслеживать кучу часто меняющихся значений.Беда в том, что когда вся сетка видна, то при ее обновлении пользовательский интерфейс зависает почти на секунду.Я обновляю его явно каждые две секунды, что хорошо для того, что я делаю, но отключение остальной части пользовательского интерфейса - это настоящая боль.
ОК, поэтому я решил запустить остальныепользовательский интерфейс в отдельном окне в отдельном потоке с отдельным диспетчером.Я написал игрушечное окно, содержащее только textBlock с возрастающим счетчиком, который обновляется 10 раз в секунду, используя DispatcherTimer.Однако вместо того, чтобы счетчик плавно увеличивался, он делает паузу, пока сетка обновляется, затем возобновляет отображение со счетом примерно на 10 больше, чем был, когда он приостанавливал , поэтому события таймера обрабатываются.Я просто не вижу обновления.
WPF только рисует все свои элементы в одном потоке?Любой способ обойти это?
Вот мой второй код создания окна:
private void Window_Loaded( object sender, RoutedEventArgs e )
{
ThreadStart ts = new ThreadStart( RunSpareThread );
m_spare_thread = new Thread( ts );
m_spare_thread.IsBackground = true;
m_spare_thread.Priority = ThreadPriority.Highest;
m_spare_thread.SetApartmentState( ApartmentState.STA );
m_spare_thread.Start();
Dispatcher.Thread.Priority = ThreadPriority.Lowest;
}
void RunSpareThread()
{
m_spare_window = new SpareWindow();
m_spare_window.Show();
Dispatcher.Run();
}
К вашему сведению Я пытался реализовать сетку несколькими различными способами - в виде ListView, как Canvas, который переопределяет OnRenderи рисует целую кучу GlyphRunDrawings - WPF просто невероятно медленно рисует этот материал.