2013-03-08 139 views
1

我需要將圖表導出爲圖像,而不是先在WPF中顯示它。所以我建立了圖表代碼:visifire自定義軸標籤不顯示

public void CreateHistogram(CalcRepository cr, int i) 
    { 
     Chart chart = new Chart(); 

     chart.Width = 300; 
     chart.Height = 200; 
     chart.ScrollingEnabled = false; 
     chart.AnimationEnabled = false; 
     chart.TrendLines.Add(new TrendLine{Value = cr.Mean,Orientation = System.Windows.Controls.Orientation.Vertical}); 
     chart.TrendLines.Add(new TrendLine{Value = cr.ChartTrippleNegativeStdDeviation,Orientation = System.Windows.Controls.Orientation.Vertical,LineStyle = LineStyles.Dashed});chart.TrendLines.Add(new TrendLine{Value = cr.ChartTripplePositiveStdDeviation,Orientation = System.Windows.Controls.Orientation.Vertical,LineStyle = LineStyles.Dashed}); 
     chart.TrendLines.Add(new TrendLine{Value = cr.UpperSpecificationLimit,Orientation = System.Windows.Controls.Orientation.Vertical}); 
     chart.TrendLines.Add(new TrendLine{Value = cr.LowerSpecificationLimit,Orientation = System.Windows.Controls.Orientation.Vertical}); 
     chart.TrendLines[0].SetValue(Canvas.ZIndexProperty, 40); 
     chart.TrendLines[1].SetValue(Canvas.ZIndexProperty, 40); 
     chart.TrendLines[2].SetValue(Canvas.ZIndexProperty, 40); 
     chart.TrendLines[3].SetValue(Canvas.ZIndexProperty, 40); 
     chart.TrendLines[4].SetValue(Canvas.ZIndexProperty, 40); 



     chart.DataPointWidth = cr.DataPointWidth; 
     chart.Visibility = Visibility.Visible; 
     Axis x = new Axis(); 
     x.AxisMaximum = cr.VisUpperBound; 
     x.AxisMinimum = cr.VisLowerBound; 
     x.AxisType = AxisTypes.Primary; 

     CustomAxisLabels cal = new CustomAxisLabels(); 
     cal.Labels.Add(new CustomAxisLabel {From = cr.Mean, To = cr.Mean, Text = "Mean"}); 
     cal.Labels.Add(new CustomAxisLabel {From = cr.ChartTrippleNegativeStdDeviation,To = cr.ChartTrippleNegativeStdDeviation,Text = "LCL"}); 
     cal.Labels.Add(new CustomAxisLabel{From = cr.ChartTripplePositiveStdDeviation,To = cr.ChartTripplePositiveStdDeviation,Text= "UCL"}); 
     cal.Labels.Add(new CustomAxisLabel {From = cr.UpperSpecificationLimit, To = cr.UpperSpecificationLimit , Text = "USL"}); 
     cal.Labels.Add(new CustomAxisLabel {From = cr.LowerSpecificationLimit, To = cr.LowerSpecificationLimit, Text = "LSL"}); 

     cal.FontSize = 10; 
     cal.Angle = 0; 
     cal.FontColor = new SolidColorBrush(Colors.Black); 
     cal.Enabled = true; 


     x.CustomAxisLabels.Add(cal); 
     chart.AxesX.Add(x); 

     var ds = new DataSeries(); 
     var dpc = new DataPointCollection(cr.HistogramValues); 
     ds.DataPoints = dpc; 

     chart.Series.Add(ds); 


     ds.ZIndex = 1; 
     ds.Bevel = false; 
     ds.ShadowEnabled = false; 
     ds.LightingEnabled = false; 
     ds.Color = new SolidColorBrush(Colors.SteelBlue); 


     chart.BeginInit(); 
     chart.EndInit(); 
     chart.Measure(new Size(300, 200)); 
     chart.Arrange(new Rect(0, 0, 300, 200)); 
     chart.UpdateLayout(); 

     ExportToPng(new Uri("C:\\" + i + ".png"), chart); 
    } 

一切工作正常,除了自定義軸標籤丟失。這是輸出的樣子:

Chart Output

正如你所看到的,甚至還有分配給CustomAxis標籤空間,但它們沒有顯示。任何人有想法?

提示:AnimationEnabled已被設置爲false,否則,拍照時的一系列尚未呈現 - 我花了很長時間才明白這一點。

+0

您能否告訴我CustomAxisLabel的「From」和「To」屬性中設置了哪些值? – 2013-03-11 10:18:39

回答

1

我已經找到了解決方案:

當超過界限,將值設置爲Double.NaN。我發現,所有標籤的創建都會失敗,如果集合Double.Nan或Double.Infinity中有任何值 - 似乎是visifire中的一個bug。

我解決了它通過在其單獨的集合中添加每個標籤。