2013-03-26 3 views
1

Я получил ItemsControl с Expander в нем и в Expander вид ProgressBars inclued. Моя проблема в том, что когда я загружаю данные (это не моя проблема с производительностью), а затем я обновляю PropertyChanged из своего ItemSource, мой gui зависает в течение длительного времени, потому что он так долго должен отображать.wpf render gui async

Есть ли способ, я могу redner элементы gui async, чтобы мой gui не замерзал ??? Я уже немного искал, хотя я не уверен, что мои результаты поиска решают мою проблему. Так что я прошу здесь, надеясь на хорошее решение.

Они гуй делает выглядеть примерно так .. хотя есть обычно больше элементов enter image description here вы можете imageine в XAML код позади ...

private void RefreshOverview(){ 
     ... 
     foreach (Characteristic c in characteristics) 
     { 
      Area a = c.Area; 

      Characteristic c1 = c; 
      foreach (Line l in lines.Where(l => l.Product.Id == c1.Product.Id)) 
      { 
       List<IMeasurementSchedule> measurementSchedules; 
       // take DefaultMeasurementSchedules if exists 
       if (c.DefaultMeasurementSchedules == null || c.DefaultMeasurementSchedules.Count == 0) 
        measurementSchedules = new List<IMeasurementSchedule>(l.LineMeasurementSchedules.ToArray()); 
       else 
        measurementSchedules = new List<IMeasurementSchedule>(c.DefaultMeasurementSchedules.ToArray()); 

       foreach (IMeasurementSchedule ms in measurementSchedules) 
       { 
        MeasureCharacteristic mc; 
        if (a.PeripheryEnabled) 
        { 
         Line l1 = l; 
         foreach (AreaItem ai in areaitems.Where(x => x.AreaId == a.Id && x.LineId == l1.Id)) 
         { 
          mc = (from cm in _context.CharacteristicMeasures.Local 
            where cm.Charge == null && 
             cm.Characteristic.Id == c.Id && 
             cm.Line.Id == l.Id && 
             cm.ShiftIndex.Id == actualShiftIndex.Id && 
             cm.AreaItem != null && 
             cm.AreaItem.Id == ai.Id && 
             cm.MeasureScheduleId == ms.Id 
            select cm).FirstOrDefault() ?? 
           new MeasureCharacteristic 
            { 
             Characteristic = c, 
             Line = l, 
             ShiftIndex = actualShiftIndex, 
             AreaItem = ai 
            }; 
          mc.MeasureSchedule = ms; 
          characteristicsMeasures.Add(AddMeasures(mc)); 
         } 
        } 
        else 
        { 
         mc = (from cm in _context.CharacteristicMeasures.Local 
           where cm.Charge == null && 
            cm.Characteristic.Id == c.Id && 
            cm.Line.Id == l.Id && 
            cm.ShiftIndex.Id == actualShiftIndex.Id && 
            cm.MeasureScheduleId == ms.Id 
           select cm).FirstOrDefault() ?? 
          new MeasureCharacteristic {Characteristic = c, Line = l, ShiftIndex = actualShiftIndex}; 
         mc.MeasureSchedule = ms; 
         characteristicsMeasures.Add(AddMeasures(mc)); 
        } 
       } 
      } 
     } 
     MeasureCharacteristics = characteristicsMeasures; 
     MeasureCharacteristicsByType = 
      CharacteristicMeasureGroupedByType.GetExpanderViewProductItems(characteristicsMeasures); 
    } 

тот мой код;) MeasureCharacteristicsByType является IEnumerable<CharacteristicMeasureGroupedByType> я делать свяжите мой источник товаров. если вам нужна дополнительная информация, просто спросите !!!

UPDATE

вот моя ссылка на мой XAML код .. http://pastebin.com/UA777LjW

+0

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

+0

только что обновил мое сообщение .. если вам нужно больше информации, тогда просто спросите isntead о downvoting;) – JuHwon

+0

FYI, это не я, который имеет downvoted. Более того, нам нужно, чтобы XAML понимал, где привязки. – JYL

ответ

1

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

Например, не влияют на MeasureCharacteristicsByType в том же цикле, что и на запросы linq. Затем измерьте время с помощью экземпляра StopWatch.

Если визуализация занимает больше всего времени, вставить элементы в MeasureCharacteristicsByType один за другим (не одновременно), с этим видом обучения, чтобы сделать их один за другим:

foreach(var charMeasureByType in CharacteristicMeasureGroupedByType.GetExpanderViewProductItems(characteristicsMeasures)) 
{ 
    Dispatcher.BeginInvoke(new Action<OneTypeHere>((OneTypeHere item) => 
    { 
     MeasureCharacteristicsByType.Add(item) 
    }), DispatcherPriority.Background, charMeasureByType); 
} 

Редактировать : OneTypeHere - тип charMeasureByType.

+0

Я уже проанализировал, какая часть занимает больше всего времени ... рендеринг делает ... i Я попытаюсь реализовать его по-своему. только чтобы проверить, понял ли я: просто получите данные в фоновом потоке .. и добавьте элементы через диспетчер один за другим?! – JuHwon

+0

Я только что закончил свой выбор. – JYL

+0

Я не понимаю. Я получаю сообщение об ошибке «Невозможно получить доступ к нестационарному методу« BeginInvoke »в статическом контексте. – JuHwon