internal ScrollTraceRecord(ScrollTraceOp op, VirtualizingStackPanel vsp, int vspDepth, int itemIndex, int opDepth, string detail) { Op = op; VSP = vsp; VDepth = vspDepth; ItemIndex = itemIndex; OpDepth = opDepth; Detail = detail; }
private static bool ShouldIgnore(ScrollTraceOp op, ScrollTracingInfo sti) { return (op == ScrollTraceOp.NoOp); }
private void AddTrace(VirtualizingStackPanel vsp, ScrollTraceOp op, ScrollTracingInfo sti, params object[] args) { ScrollTraceRecord record = new ScrollTraceRecord(op, vsp, sti.Depth, sti.ItemIndex, _depth, BuildDetail(args)); _traceList.Add(record); switch (op) { default: break; case ScrollTraceOp.BeginMeasure: Push(); break; case ScrollTraceOp.EndMeasure: Pop(record); record.Snapshot = vsp.TakeSnapshot(); Flush(sti.Depth); break; case ScrollTraceOp.BeginArrange: Push(); break; case ScrollTraceOp.EndArrange: Pop(record); record.Snapshot = vsp.TakeSnapshot(); Flush(sti.Depth); break; case ScrollTraceOp.BSetAnchor: Push(); break; case ScrollTraceOp.ESetAnchor: Pop(record); break; case ScrollTraceOp.BOnAnchor: Push(); break; case ScrollTraceOp.ROnAnchor: Pop(record); break; case ScrollTraceOp.SOnAnchor: Pop(); break; case ScrollTraceOp.EOnAnchor: Pop(record); break; case ScrollTraceOp.RecycleChildren: case ScrollTraceOp.RemoveChildren: record.RevirtualizedChildren = args[2] as List<String>; break; } if (_flushDepth < 0) { Flush(_flushDepth); } }
internal static void Trace(VirtualizingStackPanel vsp, ScrollTraceOp op, params object[] args) { ScrollTracingInfo sti = ScrollTracingInfoField.GetValue(vsp); ScrollTracer tracer = sti.ScrollTracer; Debug.Assert(tracer != null, "Trace called when not tracing"); if (ShouldIgnore(op, sti)) return; tracer.AddTrace(vsp, op, sti, args); }