第二个Legend画布未在wpf图表中显示

时间:2018-03-05 17:43:56

标签: c# wpf xaml

我一直在努力解决这个问题。问题涉及在wpf图表中添加第二个图例画布。我正在引用Jack Yu的书“Practical WPF Charts and Graphics LineChartWithLegend.xaml”。在xaml文件中,我添加了名为“legendCanvas2”的新图例画布。我已经改变了代码,在AddChart()方法中添加了第二个图例实例。问题是第二个图例没有显示在chartCanvas里面。我怀疑这个问题与chartCanvas中的多个canvas容器有关,但不确定。任何有关替代方法的帮助我都可以在chartCanvas中显示两个图例。

XAML

<Window x:Class="LineCharts.LineChartWithLegend"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Line Chart with Legend" Height="400" Width="500">

    <Grid Name="grid1" Margin="10">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Name="column1" Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Name="row1" Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <TextBlock Margin="2" x:Name="tbTitle" Grid.Column="1" Grid.Row="0" 
                RenderTransformOrigin="0.5,0.5" FontSize="14" FontWeight="Bold" 
                HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextAlignment="Center" 
                Text="Title"/>

        <TextBlock Margin="2" x:Name="tbXLabel" Grid.Column="1" Grid.Row="2" 
               RenderTransformOrigin="0.5,0.5" TextAlignment="Center" 
               Text="X Axis"/>

        <TextBlock Margin="2" Name="tbYLabel" Grid.Column="0" Grid.Row="1" 
                RenderTransformOrigin="0.5,0.5" TextAlignment="Center" 
                Text="Y Axis">
            <TextBlock.LayoutTransform>
                <RotateTransform Angle="-90"/>
            </TextBlock.LayoutTransform>
        </TextBlock>
        <Grid  Margin="0" x:Name ="chartGrid" Grid.Column="1" Grid.Row="1"
               ClipToBounds="True" Background="Transparent" SizeChanged="chartGrid_SizeChanged" />
        <Canvas Margin="2" Name="textCanvas" ClipToBounds="True" Grid.Column="1" Grid.Row="1">
            <Canvas Name="chartCanvas" ClipToBounds="True">
                <Canvas Name="legendCanvas" Background="Transparent" />
                <Canvas Name="legendCanvas2" Background="Transparent" />
            </Canvas>
        </Canvas>       
    </Grid>
</Window>

代码隐藏

    private void AddChart()
    {
        cs = new ChartStyleGridlines();
        lg = new Legend();
        lg2 = new Legend();
        dc = new DataCollection();
        ds = new DataSeries();

        cs.ChartCanvas = chartCanvas;
        cs.TextCanvas = textCanvas;
        cs.Title = "Sine and Cosine Chart";
        cs.Xmin = 0;
        cs.Xmax = 7;
        cs.Ymin = -1.5;
        cs.Ymax = 1.5;
        cs.YTick = 0.5;
        cs.GridlinePattern = ChartStyleGridlines.GridlinePatternEnum.Dot;
        cs.GridlineColor = Brushes.Black;
        cs.AddChartStyle(tbTitle, tbXLabel, tbYLabel);

        // Draw Sine curve:
        ds.LineColor = Brushes.Blue;
        ds.LineThickness = 1;
        ds.SeriesName = "Sine";
        for (int i = 0; i < 70; i++)
        {
            double x = i / 5.0;
            double y = Math.Sin(x);
            ds.LineSeries.Points.Add(new Point(x, y));
        }
        dc.DataList.Add(ds);

        // Draw cosine curve:
        ds = new DataSeries();
        ds.LineColor = Brushes.Red;
        ds.SeriesName = "Cosine";
        ds.LinePattern = DataSeries.LinePatternEnum.DashDot;
        ds.LineThickness = 2;
        for (int i = 0; i < 70; i++)
        {
            double x = i / 5.0;
            double y = Math.Cos(x);
            ds.LineSeries.Points.Add(new Point(x, y));
        }
        dc.DataList.Add(ds);

        // Draw sine^2 curve:
        ds = new DataSeries();
        ds.LineColor = Brushes.DarkGreen;
        ds.SeriesName = "Sine^2";
        ds.LinePattern = DataSeries.LinePatternEnum.Dot;
        ds.LineThickness = 2;
        for (int i = 0; i < 70; i++)
        {
            double x = i / 5.0;
            double y = Math.Sin(x) * Math.Sin(x);
            ds.LineSeries.Points.Add(new Point(x, y));
        }
        dc.DataList.Add(ds);

        dc.AddLines(cs);

        lg.LegendCanvas = legendCanvas;
        lg.IsLegend = true;
        lg.IsBorder = true;
        lg.LegendPosition = Legend.LegendPositionEnum.NorthWest;
        lg.AddLegend(cs.ChartCanvas, dc);

        lg2 = new Legend();
        lg2.LegendCanvas = legendCanvas2;
        lg2.IsLegend = true;
        lg2.IsBorder = true;
        lg2.LegendPosition = Legend.LegendPositionEnum.NorthEast;
        lg2.AddLegend(cs.ChartCanvas, dc);
    }

    private void chartGrid_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        textCanvas.Width = chartGrid.ActualWidth;
        textCanvas.Height = chartGrid.ActualHeight;
        legendCanvas.Children.Clear();
        legendCanvas2.Children.Clear();
        chartCanvas.Children.RemoveRange(2, chartCanvas.Children.Count - 1); // changed index from 1 to 2
        textCanvas.Children.RemoveRange(1, textCanvas.Children.Count - 1);
        AddChart(); 
    }

0 个答案:

没有答案