public override void GetData(object inObject, Stream outStream) { var wr = inObject as WeakReference; inObject = wr.Target; // Object -> string に変換 var converter = new ObjectToStringConverter(ObjectVisualizer.GetLanguageTypes()); var xmlString = string.Empty; if (inObject is Type) { xmlString = converter.CreateBaseTypeTree(inObject as Type); } else if (inObject is StackFrame[]) { xmlString = converter.CreateCallTree(inObject as StackFrame[]); } else { xmlString = converter.Convert(inObject); } // シリアライズして渡す var writer = new StreamWriter(outStream); writer.Write(xmlString); writer.Flush(); }
protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider) { // 今回渡ってきたデータを、いったん、テキストファイルに保存する var workDirectory = Path.Combine(GetDllDirectory(), "ObjectVisualization_Work"); var infoDirectory = Path.Combine(workDirectory, "ObjectInfo"); if (!Directory.Exists(infoDirectory)) { Directory.CreateDirectory(infoDirectory); } var xmlString = new StreamReader(objectProvider.GetData()).ReadToEnd(); var historyFile = Path.Combine(infoDirectory, $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss_fff")}.txt"); File.WriteAllText(historyFile, xmlString, new UTF8Encoding()); // 全過去履歴を読み込んで表示する var dlg = new ObjectWindow(); var converter = new StringToWPFViewConverter(ObjectVisualizer.GetLanguageTypes()); var observers = new Dictionary <CheckBox, string>(); var txtFiles = Directory.GetFiles(infoDirectory, "*.txt"); var previousXmlString = string.Empty; var previousElement = default(FrameworkElement); foreach (var txtFile in txtFiles) { var fileName = Path.GetFileNameWithoutExtension(txtFile); var datas = fileName.Split('_'); var createTime = $"{datas[0]}/{datas[1]}/{datas[2]} {datas[3]}:{datas[4]}:{datas[5]}.{datas[6]}"; var timeBlock = new TextBlock() { Text = createTime, Foreground = Brushes.Gray, HorizontalAlignment = HorizontalAlignment.Left }; var timeCheck = new CheckBox() { Content = "履歴に残しておき、次回も表示する", VerticalAlignment = VerticalAlignment.Center }; var timePanel = new StackPanel() { Orientation = Orientation.Horizontal }; timePanel.Children.Add(timeBlock); timePanel.Children.Add(timeCheck); xmlString = File.ReadAllText(txtFile, new UTF8Encoding()); var element = default(FrameworkElement); if (xmlString.StartsWith("BaseTypeTree:")) { element = converter.CreateBaseTypeTree(xmlString); } else if (xmlString.StartsWith("CallTree:")) { element = converter.CreateCallTree(xmlString); } else { element = converter.Convert(xmlString); } // ※MainWindow / Resources 内で中央に寄るように設定している、子コントロールの場合、中央に表示したいため // トップコントロールが TextBlock の場合、中央に寄ってしまうので、左寄せに調整 if (element is TextBlock) { var block1 = element as TextBlock; block1.HorizontalAlignment = HorizontalAlignment.Left; } var grid1 = new Grid(); grid1.ColumnDefinitions.Add(new ColumnDefinition()); grid1.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto }); grid1.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto }); grid1.Children.Add(timePanel); Grid.SetRow(timePanel, 0); Grid.SetColumn(timePanel, 0); grid1.Children.Add(element); Grid.SetRow(element, 1); Grid.SetColumn(element, 0); // 次の出力結果との間を開けて、見やすく調整する grid1.Margin = new Thickness(10, 5, 10, 55); dlg.AddData(grid1); observers.Add(timeCheck, txtFile); // 差異データチェック if (!xmlString.StartsWith("BaseTypeTree:") && !xmlString.StartsWith("CallTree:")) { if (previousXmlString != xmlString && IsSameTypeLayout(previousXmlString, xmlString)) { SetColorDifferenceData(previousElement, element); } // 次用にバックアップ。element 変数に色付けしてしまったので、色付け前をバックアップさせる var dummy = converter.Convert(xmlString); if (dummy is TextBlock) { var block1 = dummy as TextBlock; block1.HorizontalAlignment = HorizontalAlignment.Left; } previousElement = dummy; } previousXmlString = xmlString; } dlg.Closed += (s, e) => { // 履歴を消していいものは消す foreach (var key in observers.Keys) { if (!key.IsChecked.HasValue || !key.IsChecked.Value) { var txtFile = observers[key]; File.Delete(txtFile); } } }; dlg.ShowDialog(); }