我的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>
我将我的itemsource绑定到。如果您需要更多信息,请询问!!!
更新
这是我的xaml代码的链接.. http://pastebin.com/UA777LjW
答案 0 :(得分:1)
您正在混合逻辑来构建数据和渲染操作。 将这一个与另一个隔离以确定哪个花费时间。
例如,不要在与linq查询相同的for循环中影响MeasureCharacteristicsByType
。
然后使用StopWatch
实例测量时间。
如果渲染花费的时间最多,请逐个(不是同时)在MeasureCharacteristicsByType
中插入项目,并使用这种指令一个接一个地渲染它们:
foreach(var charMeasureByType in CharacteristicMeasureGroupedByType.GetExpanderViewProductItems(characteristicsMeasures))
{
Dispatcher.BeginInvoke(new Action<OneTypeHere>((OneTypeHere item) =>
{
MeasureCharacteristicsByType.Add(item)
}), DispatcherPriority.Background, charMeasureByType);
}
修改:OneTypeHere
是charMeasureByType
的类型。