private void MeatureNodeLabel(SankeyNode node) { var size = MeasureHepler.MeasureString(node.Name, diagram.LabelStyle, CultureInfo.CurrentCulture); node.LabelHeight = size.Height; node.LabelWidth = size.Width; }
public void UpdateLabelAdjustY() { if (diagram.NodeLabelStyle != null) { LabelAdjustedY = MeasureHepler.MeasureString("5", diagram.NodeLabelStyle, CultureInfo.CurrentCulture).Height; } }
public void RemeatureLabel() { if (currentNodes == null || currentNodes.Count < 2) { return; } if (diagram.SankeyFlowDirection == FlowDirection.TopToBottom) { currentNodes[0][0].Label.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); measuredLabelHeight = currentNodes[0][0].Label.DesiredSize.Height; } else { measuredFirstLevelLabelWidth = currentNodes[0].Max(n => MeasureHepler.MeasureString(n.Name, diagram.LabelStyle, CultureInfo.CurrentCulture).Width); measuredLastLevelLabelWidth = currentNodes.Last().Value.Max(n => MeasureHepler.MeasureString(n.Name, diagram.LabelStyle, CultureInfo.CurrentCulture).Width); } foreach (var levelNodes in currentNodes.Values) { foreach (var node in levelNodes) { MeatureNodeLabel(node); } } }
public MainViewModel() { random = new Random(); bubbleColor = (Brush)Application.Current.FindResource("BubbleColor"); bubbleLabelStyle1 = (Style)Application.Current.FindResource("BubbleLabelStyle1"); bubbleLabelStyle2 = (Style)Application.Current.FindResource("BubbleLabelStyle2"); BubbleLabelStyle = bubbleLabelStyle2; Label = "finish the fight"; Diameter = 55; BubbleGap = 55; //BubbleBrush = bubbleColor; //AnticipateMinRadius = 1; // random datas var datas = new List <BubbleData>(); var count = 10; for (var index = 0; index < count; index++) { var name = "word" + index.ToString(); var weight = 5 * (index + 1); datas.Add(new BubbleData() { Name = name, Weight = weight, //Color = bubbleColor, LabelSizes = new Dictionary <string, Size>() { { "Name", MeasureHepler.MeasureString(name, bubbleLabelStyle1, CultureInfo.CurrentCulture) }, { "Weight", MeasureHepler.MeasureString(weight.ToString(), bubbleLabelStyle2, CultureInfo.CurrentCulture) } } }); } Datas = datas; BubbleBrushes = new Dictionary <string, Brush>() { { "word1", bubbleColor } }; }
private Dictionary <int, List <SankeyNode> > UpdateNodeLayout(List <SankeyNode> nodes, double nodeThickness) { var tempNodes = new Dictionary <double, List <SankeyNode> >(); var remainNodes = nodes; var nextNodes = new List <SankeyNode>(); var length = 0.0; var levelIndex = 0; var linkLength = 0.0; while (remainNodes.Count > 0) { nextNodes = new List <SankeyNode>(); var nodeIndex = 0; var nodeCount = remainNodes.Count; for (; nodeIndex < nodeCount; nodeIndex++) { var node = remainNodes[nodeIndex]; if (diagram.SankeyFlowDirection == FlowDirection.TopToBottom) { node.Y = levelIndex; } else { node.X = levelIndex; } var linkIndex = 0; var linkCount = node.OutLinks.Count; for (; linkIndex < linkCount; linkIndex++) { nextNodes.Add(node.OutLinks[linkIndex].ToNode); } } remainNodes = nextNodes; levelIndex++; } // move all the node without outLinks to end foreach (var node in nodes) { if (node.OutLinks.Count == 0) { if (diagram.SankeyFlowDirection == FlowDirection.TopToBottom) { node.Y = levelIndex - 1; } else { node.X = levelIndex - 1; } } } if (diagram.FirstAndLastLabelPosition == FirstAndLastLabelPosition.Outward) { if (diagram.SankeyFlowDirection == FlowDirection.TopToBottom) { if (!(measuredLabelHeight > 0)) { measuredLabelHeight = MeasureHepler.MeasureString(nodes[0].Name, diagram.LabelStyle, CultureInfo.CurrentCulture).Height; } if (!CheckInsufficientArea(measuredLabelHeight * 2, DiagramCanvas.ActualHeight)) { return(null); } DiagramCanvas.Margin = new Thickness(0, measuredLabelHeight, 0, measuredLabelHeight); } else { if (!(measuredFirstLevelLabelWidth > 0)) { measuredFirstLevelLabelWidth = nodes.FindAll(n => n.X == 0).Max(n => MeasureHepler.MeasureString(n.Name, diagram.LabelStyle, CultureInfo.CurrentCulture).Width); } if (!(measuredLastLevelLabelWidth > 0)) { measuredLastLevelLabelWidth = nodes.FindAll(n => n.X == levelIndex - 1).Max(n => MeasureHepler.MeasureString(n.Name, diagram.LabelStyle, CultureInfo.CurrentCulture).Width); } if (!CheckInsufficientArea(measuredLastLevelLabelWidth + measuredFirstLevelLabelWidth, DiagramCanvas.ActualWidth)) { return(null); } DiagramCanvas.Margin = new Thickness(measuredFirstLevelLabelWidth, 0, measuredLastLevelLabelWidth, 0); } diagram.UpdateLayout(); } else { DiagramCanvas.Margin = new Thickness(0); } if (diagram.SankeyFlowDirection == FlowDirection.TopToBottom) { length = DiagramCanvas.ActualHeight; } else { length = DiagramCanvas.ActualWidth; } linkLength = (length - nodeThickness) / (levelIndex - 1); foreach (var node in nodes) { var max = Math.Max(node.InLinks.Sum(l => l.Weight), node.OutLinks.Sum(l => l.Weight)); if (diagram.SankeyFlowDirection == FlowDirection.TopToBottom) { if (tempNodes.Keys.Contains(node.Y)) { tempNodes[node.Y].Add(node); } else { tempNodes.Add(node.Y, new List <SankeyNode>() { node }); } node.Y *= linkLength; node.Shape.Width = max; node.Shape.Height = diagram.NodeThickness; } else { if (tempNodes.Keys.Contains(node.X)) { tempNodes[node.X].Add(node); } else { tempNodes.Add(node.X, new List <SankeyNode>() { node }); } node.X *= linkLength; node.Shape.Height = max; node.Shape.Width = diagram.NodeThickness; } } return(tempNodes.OrderBy(n => n.Key).ToDictionary(item => (int)item.Key, item => item.Value)); }