using Profiler.Data; using Profiler.Controls.ViewModels; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Profiler.Controls { /// /// Interaction logic for SamlingThreadView.xaml /// public partial class SamplingThreadView : UserControl { public SamplingThreadView() { InitializeComponent(); DataContextChanged += SamplingThreadView_DataContextChanged; IsVisibleChanged += SamplingThreadView_IsVisibleChanged; } private void VM_OnLoaded(SamplingFrame frame) { InitThreadList(frame); } private void SamplingThreadView_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { VM = DataContext as SamplingViewModel; VM.OnLoaded += VM_OnLoaded; } SamplingViewModel VM { get; set; } private void SamplingThreadView_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { VM?.SetActive(IsVisible); } void BuildEntryList(List entries, SamplingNode node, double offset) { if (node.Description != null) entries.Add(new Entry(new EventDescription(node.NameWithModule), Durable.MsToTick(offset), Durable.MsToTick(offset + node.Duration))); offset += node.SelfDuration * 0.5; foreach (SamplingNode child in node.Children) { BuildEntryList(entries, child, offset); offset += child.Duration; } } private ThreadViewSettings Settings { get; set; } = new ThreadViewSettings(); void InitThreadList(SamplingFrame frame) { Frame = frame; List rows = new List(); if (frame != null) { List entries = new List(); SamplingNode root = frame.Root; BuildEntryList(entries, root, 0.0); EventFrame eventFrame = new EventFrame(new FrameHeader() { Start = 0, Finish = Durable.MsToTick(root.Duration) }, entries, frame.Group); ThreadData threadData = new ThreadData(null) { Events = new List { eventFrame } }; EventsThreadRow row = new EventsThreadRow(frame.Group, new ThreadDescription() { Name = "Sampling Node" }, threadData, Settings); row.LimitMaxDepth = false; row.EventNodeHover += Row_EventNodeHover; rows.Add(row); ThreadViewControl.Scroll.ViewUnit.Width = 1.0; ThreadViewControl.InitRows(rows, eventFrame.Header); } else { ThreadViewControl.InitRows(rows, null); } } private void Row_EventNodeHover(Point mousePos, Rect rect, ThreadRow row, EventNode node) { ThreadViewControl.ToolTipPanel = node != null ? new ThreadViewControl.TooltipInfo { Text = String.Format("{0} {1:0.#} ({2:0.#}%)", node.Description.FullName, node.Duration, 100.0 * node.Duration / Frame.Root.Duration), Rect = rect } : null; } private FrameGroup Group { get; set; } private EventDescription Description { get; set; } private SamplingFrame Frame { get; set; } } }