1

このコードを使用して、「from」チャート シリーズを「to」チャートに再割り当てするオーバーレイ機能を持つチャート作成アプリケーションがあります。

chTo.Series.Add(chFrom.Series[s]); //Reassign series to new chart   
chTo.Legends.Add(chFrom.Legends[s]); //Reassign legend to new chart

よく働く。
ただし、凡例のツールヒントを実装しようとしていますが、チャートの最初の凡例のみがツールヒントを表示するという問題が発生しています。ヒットテストを実行すると、最初の凡例のみが認識されます。後続のすべての凡例は、グラフに表示されますが、最もヒットしたメソッドには「表示」されません。ツールチップのマウスオーバーイベントをトリガーするオブジェクトがないため、ツールチップが表示されないのはこのためだと思います。

これを機能させるために凡例領域を「拡張」する方法を見つけることができませんでした (hittest メソッドによって検出されます)。

誰にもアイデアはありますか?ありがとう!

4

1 に答える 1

0

キングキングへの対応 --

元の凡例は、チャートと同じ方法で次のように作成されます。

                //Create the series legend
                chartSel.Series[ySeries.Name].ChartArea = "ChartArea1";
                chartSel.Legends.Remove(chartSel.Legends.FindByName("Legend1"));
                chartSel.Legends.Add(ySeries.Name);
                chartSel.Legends[0].Name = ySeries.Name;

                //Format the series legend
                chartSel.Legends[ySeries.Name].Docking = Docking.Right;
                chartSel.Legends[ySeries.Name].DockedToChartArea = "ChartArea1";
                chartSel.Legends[ySeries.Name].Alignment = StringAlignment.Near;
                chartSel.Legends[ySeries.Name].IsDockedInsideChartArea = false;
                chartSel.Legends[ySeries.Name].LegendStyle = LegendStyle.Table; //.Row;
                chartSel.Legends[ySeries.Name].TableStyle = LegendTableStyle.Tall;
                chartSel.Legends[ySeries.Name].IsEquallySpacedItems = false;
                chartSel.Legends[ySeries.Name].Font = new Font("Segoe UI", 7, FontStyle.Bold);
                //chartSel.Legends[ySeries.Name].TextWrapThreshold = 17; // 19;
                chartSel.Legends[ySeries.Name].Position.Auto = false;
                chartSel.Legends[ySeries.Name].Position.X = 80;
                chartSel.Legends[ySeries.Name].Position.Y = 2;
                chartSel.Legends[ySeries.Name].Position.Width = 18;
                chartSel.Legends[ySeries.Name].Position.Height = 12;

                //Format series data point value cell
                chartSel.Legends[ySeries.Name].CellColumns.Add(new LegendCellColumn("", LegendCellColumnType.Text, ""));
                chartSel.Legends[ySeries.Name].CellColumns[0].Alignment = ContentAlignment.MiddleLeft; //.TopLeft;
                chartSel.Legends[ySeries.Name].CellColumns[0].Margins = new System.Windows.Forms.DataVisualization.Charting.Margins(10, 10, 1, 1);
                chartSel.Legends[ySeries.Name].CellColumns[0].MinimumWidth = 500;
                chartSel.Legends[ySeries.Name].CellColumns[0].MaximumWidth = 500;
                chartSel.Legends[ySeries.Name].CellColumns[0].BackColor = Color.FromArgb(120, chartSel.Series[ySeries.Name].Color);

                //Format legend cell spacer
                chartSel.Legends[ySeries.Name].CellColumns.Add(new LegendCellColumn("", LegendCellColumnType.Text, ""));
                chartSel.Legends[ySeries.Name].CellColumns[1].Alignment = ContentAlignment.TopLeft;
                chartSel.Legends[ySeries.Name].CellColumns[1].Margins = new System.Windows.Forms.DataVisualization.Charting.Margins(0, 0, 0, 0);
                chartSel.Legends[ySeries.Name].CellColumns[1].MinimumWidth = 25;
                chartSel.Legends[ySeries.Name].CellColumns[1].MaximumWidth = 25;
                chartSel.Legends[ySeries.Name].CellColumns[1].BackColor = Color.Black;

                //Format series title cell
                chartSel.Legends[ySeries.Name].CellColumns.Add(new LegendCellColumn("", LegendCellColumnType.Text, ySeries.Name));
                chartSel.Legends[ySeries.Name].CellColumns[2].Alignment = ContentAlignment.MiddleLeft;
                chartSel.Legends[ySeries.Name].CellColumns[2].Margins = new System.Windows.Forms.DataVisualization.Charting.Margins(0, 0, 1, 1);
                chartSel.Legends[ySeries.Name].CellColumns[2].MinimumWidth = 1475; //1500;
                chartSel.Legends[ySeries.Name].CellColumns[2].MaximumWidth = 1475; //1500;
                chartSel.Legends[ySeries.Name].CellColumns[2].ToolTip = ySeries.Name;

シリーズと凡例が再割り当てされた後 (元の投稿のコードを使用)、マウスダウン イベントに応答して、次のヒットテストによって特定されたカーソル位置に基づいて凡例の値を設定します。

                    pt = activePanel.PointToClient(Control.MousePosition);
                    ch = activePanel.GetChildAtPoint(pt) as Chart;
                    if (ch != null)
                    {
                        HitTestResult ht = ch.HitTest(e.X, e.Y, false);
                        if (ht.ChartElementType == ChartElementType.PlottingArea)
                        {
                            SetLegendValueText(ht, ch);
                        }
                    }

    private void SetLegendValueText(HitTestResult ht, Chart ch)
    {
        //Get the datapoint 'x' index value
        int dpIndex = 0;
        if (ht != null)
        {
            switch (ht.ChartElementType)
            {
                case ChartElementType.DataPoint: //Cursor is on a series line
                    DataPoint dp = ht.Object as DataPoint;
                    if (dp != null)
                    {
                        dpIndex = ht.PointIndex;
                    }
                    break;

                case ChartElementType.PlottingArea: //Cursor is somewhere in the plot area of the chart
                    dpIndex = (int)ht.ChartArea.CursorX.Position;
                    break;
            }
        }

        //Set legend value and legend tooltip
        for (int x = 0; x < ch.Legends.Count; x++) //foreach (Series s in ch.Series)
        {
            if (dpIndex > 0)
            {
                ch.Legends[x].Name = "Legend_" + x;
                ch.Legends[x].CellColumns[0].Text = ch.Series[x].Points[dpIndex - 1].YValues[0].ToString();
                ch.Legends[x].CellColumns[0].ToolTip = ch.Legends[x].CellColumns[0].Text;
            }
        }           
    }

そのため、凡例は希望どおりに表示されますが、ツールチップは最初の凡例アイテムに対してのみ表示されます。カスタムアイテムも作ってみました。それらを使用すると、ツールヒントが表示されますが、書式設定が失われます。これは私を何週間も(断続的に)夢中にさせてきました。私は本当に他の問題に移りたいと思っています. 明らかに (とにかく私には)、チャートについて知っておくべきことをすべて知っているわけではなく、MSChart サンプルの利点は非常に限られているという理由だけで、正しいことをしているとは言えません。

正しい方向に向けることができれば、とても感謝しています。

于 2013-07-03T15:02:56.597 に答える