我希望能从网格中将每个图表导出为系统中的图像文件。
以下是XAML和C#的代码。
问题在于,当我导出时,只有第一个图表能够正确地导出,而第二个图表无法导出,因为它没有映射到第二个图表上。
以下是屏幕截图。
XAML:
<TabItem x:Name="Charts" Header="Company Charts " TabIndex="0" IsSelected="True">
<ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" Background="Transparent" telerik:StyleManager.Theme="Expression_Dark">
<Grid>
<Grid x:Name="ChartGrid" Margin="10" Background="Black">
<Grid.Resources>
<telerik:RadContextMenu x:Key="context" Width="100" telerik:StyleManager.Theme="Expression_Dark">
<telerik:RadContextMenu.Background>
<LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
<GradientStop Color="#FF515151" Offset="0.021"/>
<GradientStop Color="#FF212020" Offset="0.979"/>
<GradientStop Color="#FF222121" Offset="0.115"/>
</LinearGradientBrush>
</telerik:RadContextMenu.Background>
<telerik:RadMenuItem Header="View Data" Foreground="White" Command="{Binding ViewData}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}" telerik:StyleManager.Theme="Expression_Dark"></telerik:RadMenuItem>
<telerik:RadMenuItem Header="Edit Chart" Foreground="White" Command="{Binding EditChartCmd}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}" telerik:StyleManager.Theme="Expression_Dark"></telerik:RadMenuItem>
</telerik:RadContextMenu>
<DataTemplate x:Key="EmptyContentTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="N.A." Margin="5,15,0,0" VerticalAlignment="Center" Height="30" Foreground="{Binding LabelFG}"></TextBlock>
</StackPanel>
</DataTemplate>
<!--<DataTemplate x:Key="LegendOrientation">
<StackPanel Orientation="Horizontal" />
</DataTemplate>-->
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
</Grid>
</Grid>
</ScrollViewer>
</TabItem>
C# 代码:
private void ExportCHARTtoBMP(RadCartesianChart chartx, string p)
{
chartx.Measure(new System.Windows.Size(double.PositiveInfinity, double.PositiveInfinity));
int chartW = (int)Math.Round(chartx.ActualWidth);
int chartH = (int)Math.Round(chartx.ActualHeight);
chartW = chartW == 0 ? 1 : chartW;
chartH = chartH == 0 ? 1 : chartH;
RenderTargetBitmap rtbmp = new RenderTargetBitmap(chartW + 32, chartH + 20, 96d, 96d, PixelFormats.Default);
rtbmp.Render(chartx);
BmpBitmapEncoder encoder = new BmpBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtbmp));
FileStream chartFS = File.Create(tempPath + "" + p + ".bmp");
encoder.Save(chartFS);
chartFS.Close();
rtbmp.Clear();
}
private void charttoimageprocess(List<string> axisdata1, List<string> axisdata2)
{
for (int row = 0; row < (chartgridimage.RowDefinitions.Count()); row++)
{
for (int column = 0; column < chartgridimage.ColumnDefinitions.Count(); column++)
{
RadCartesianChart chart = chartgridimage.ChildrenOfType<RadCartesianChart>().FirstOrDefault(e => Grid.GetRow(e) == row && Grid.GetColumn(e) == column);
chart.UpdateLayout();
chart.Arrange(new Rect(new System.Windows.Size(chart.ActualWidth, chart.ActualHeight)));
chart.UpdateLayout();
ExportCHARTtoBMP(chart, "chart" + row + "" + column);
chart_names.Add("chart" + row + "" + column + ".bmp");
StackPanel stackpan1 = chartgridimage.ChildrenOfType<StackPanel>().FirstOrDefault(e => Grid.GetRow(e) == row && Grid.GetColumn(e) == column && e.Name.Equals("stackpan1"));
Telerik.Windows.Controls.Label label1 = stackpan1.ChildrenOfType<Telerik.Windows.Controls.Label>().FirstOrDefault(e => e.Name.Equals("label1"));
StackPanel stackpan2 = chartgridimage.ChildrenOfType<StackPanel>().FirstOrDefault(e => Grid.GetRow(e) == row && Grid.GetColumn(e) == column && e.Name.Equals("stackpan2"));
Telerik.Windows.Controls.Label label2 = stackpan2.ChildrenOfType<Telerik.Windows.Controls.Label>().FirstOrDefault(e => e.Name.Equals("label2"));
axisdata1.Add(label1.Content.ToString());
axisdata2.Add(label2.Content.ToString());
if (row == 7)
{
if (column == 0)
break;
}
}
}
}
ExportCHARTtoBMP()
被调用在哪里?请展示代码的这一部分。 - DrKoch