0

レポート中に生成されたチャートを印刷しようとしています。グラフをDocumentPaginatorドキュメントに配置することはできますが、ページに合わせてグラフのサイズを変更するのに問題があります。レポートプログラムのサイズを変更すると、グラフのサイズが変更され、グラフのスケーリングに影響することに気付きました。この認識は、チャートActualWidthActualHeightがスケーリングに直接リンクされていることを私に示しました。

私は試した:

myChart.Width = newWidth;
myChart.Height = newHeight;

Measure(myChart.RenderSize);
Arrange(new Rect(0, 0, newWidth, newHeight));

しかし、これにより、レポートプログラムの視覚的なグラフのサイズが変更され、印刷可能なグラフは2回目の印刷まで新しいサイズに変更されませんでした。

myChartがreportChartに接続されていることに気づき、reportChartをmyChartにコピー/クローン化しようとしました。

私は試した:

public class Copy<T>
{
    public static T DeepCopy<T>(T element)
    {
        string xaml = XamlWriter.Save(element);
        StringReader xamlString = new StringReader(xaml);
        XmlTextReader xmlTextReader = new XmlTextReader(xamlString);
        var DeepCopyobject = (T)XamlReader.Load(xmlTextReader);
        return DeepCopyobject;
    }

}

また

myChart = XamlReader.Parse(XamlWriter.Save(reportChart.DataContext)) as Chart

ただし、string xaml = XamlWriter.Save(element);時間がかかりすぎて、両方ともスタックオーバーフローが発生します。

使ってます

myChart = new Chart() { DataContext = reportChart.DataContext }

コピーを作成しますが、ActualWidthとActualHeightが「0」に遭遇するため、グラフのDataContextが正しくコピーされたかどうかがわかりません。

を使用してチャートのサイズを変更しました

myChart.Width = newWidth;
myChart.Height = newHeight;

myChart.Measure(new System.Windows.Size(newWidth, newHeight));
myChart.Arrange(new Rect(0, 0, newWidth, newHeight));

または、グラフのActualWidthとActualHeightを言って、希望のサイズに更新しますが、グラフのあるべき場所に黒い画像が表示されます。

では、選択した用紙サイズに適切に拡大縮小されたグラフを印刷するにはどうすればよいですか?

4

1 に答える 1

1

だから私は自分に合ったものを見つけました。それが最もクリーンな方法だとは思いません。

印刷しようとしているグラフを拡大縮小する必要があるため、グラフをコピー/複製する必要があります。

myNewChart = new Chart() { DataContext = myOldChart.DataContext }は前に述べたように使用しました。

プロジェクトに新しいウィンドウを追加し、そこに新しいグラフをレンダリングして、そこから黒い画像が表示されないようにしました。

ConvertingWindow.xamlコード。このコードは、元のチャートのコードと一致します。

<Window x:Class="QScanReportPrinting.ConvertingWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="ConvertingWindow"
    xmlns:cht="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit">

<Grid>
    <Grid.Resources>
        <!-- CutomColumnStyle Style -->
        <Style x:Key="CutomColumnStyle" TargetType="cht:ColumnDataPoint">
            <!--Background Color-->
            <Setter Property="Background" Value="{Binding barColor}"/>

            <!--Annotations, or column value labels-->
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="cht:ColumnDataPoint">
                        <Grid>
                            <Rectangle Fill="{TemplateBinding Background}" Stroke="Black"/>
                            <Grid Margin="0 -20 0 0" HorizontalAlignment="Center" VerticalAlignment="Top">
                                <TextBlock Text="{TemplateBinding FormattedDependentValue}" FontWeight="Bold" Margin="2">
                                    <TextBlock.RenderTransform>
                                        <RotateTransform Angle="-60" />
                                    </TextBlock.RenderTransform>
                                </TextBlock>
                            </Grid>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>

    <!--Chart for Graph-->
    <cht:Chart x:Name="UI_Chart" Title="{Binding GraphTitle}" Background="White">
        <cht:Chart.Series>
            <cht:ColumnSeries Title="{Binding ChartKey}" ItemsSource="{Binding GraphDataCollection}" IndependentValueBinding="{Binding Path=X}" DependentValueBinding="{Binding Path=Y}"
                              DataPointStyle="{StaticResource CutomColumnStyle}">
                <cht:ColumnSeries.IndependentAxis>
                    <cht:CategoryAxis Orientation="X">
                        <cht:CategoryAxis.AxisLabelStyle>
                            <Style TargetType="cht:AxisLabel">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="cht:AxisLabel">
                                            <TextBlock Text="{TemplateBinding FormattedContent}">
                                            <TextBlock.LayoutTransform>
                                                <RotateTransform Angle="-60"/>
                                            </TextBlock.LayoutTransform>
                                            </TextBlock>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </cht:CategoryAxis.AxisLabelStyle>
                    </cht:CategoryAxis>
                </cht:ColumnSeries.IndependentAxis>
            </cht:ColumnSeries>
        </cht:Chart.Series>
    </cht:Chart>
</Grid>

次に、VMで呼び出します。

    private void GetChartVisual()
    {
        // Initialize variable
        cw = new ConvertingWindow();

        cw.UI_Chart.DataContext = myNewChart.DataContext;

        // Set MainWindow to be the owner of this window
        cw.Owner = Application.Current.MainWindow;
        // Set DataContext to this DataContext 
        // Allows binding with variables already loaded
        cw.DataContext = this;

        cw.Show();

        myNewChart = cw.UI_Chart;

        cw.Close();
    }

これを行うことにより、それは私の視覚をレンダリングします。次に、元のグラフに影響を与えずに、必要なサイズにサイズ変更できます。最も美しいものではありませんが、機能します。

于 2012-11-05T16:29:37.760 に答える