2

ItemsControlその中に がExpanderあり、その中にExpanderはビューが含まれていProgressBarsます。私の問題は、データをロードしているときです (これは私のパフォーマンスの問題ではありません)。その後、ItemSource私の GUI の PropertyChanged を更新すると、レンダリングに時間がかかるため、長い間フリーズします。

私のGUIがフリーズしないように、GUI要素を非同期に赤くする方法はありますか??? すでに少し検索しましたが、検索結果が問題を解決するかどうかはわかりません。だから私はここで質問しています。良い解決策を期待しています。

彼らのGUIはこのように見えます..通常、 ここに画像の説明を入力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>アイテムソースをバインドするものです。さらに情報が必要な場合は、お問い合わせください!!!

アップデート

これが私のxamlコードへのリンクです.. http://pastebin.com/UA777LjW

4

1 に答える 1

1

ロジックを混合してデータとレンダリング操作を構築しています。1 つを他のものから分離して、どちらが時間がかかっているかを特定します。

たとえばMeasureCharacteristicsByType、linq クエリと同じ for ループには影響しません。次に、インスタンスで時間を測定しStopWatchます。

レンダリングに最も時間がかかる場合は、項目をMeasureCharacteristicsByType1 つずつ (同時にではなく) 挿入し、次のような命令で 1 つずつレンダリングします。

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

編集:OneTypeHereのタイプですcharMeasureByType

于 2013-03-26T11:37:26.827 に答える