none
Windows FormのChartコントロールの凡例の移動 RRS feed

  • 質問

  • WPF C#2013のChartコントロールを用いて,Window上にグラフを描画するアプリを作成しています.

    レイアウトはGridを作成して,その中にChartがあります.

            <Grid Name = "grid1">
                <WindowsFormsHost  >
                    <wfc:Chart Name="chart1" />
                </WindowsFormsHost>
            </Grid>

    そして,windowのLoadイベントで以下のコードを実行してから,addXYでグラフのポイントを設定しています.

                var windowsFormsHost = (WindowsFormsHost)grid1.Children[0];

                var chart = (Chart)windowsFormsHost.Child;

                Series seriesSigmaX = new Series();
                seriesSigmaX.ChartType = SeriesChartType.Point;
                seriesSigmaX.MarkerStyle = MarkerStyle.Diamond;
                seriesSigmaX.MarkerSize = 18;
                seriesSigmaX.LegendText = "σx";

                chart.Legends.Add(new Legend("legend"));
                chart.Legends["legend"].DockedToChartArea = "ChartArea1";
                chart.Legends["legend"].Position.Auto = false;

    上記でグラフを描画後,凡例をマウスで移動したいと考え,まずはchart1のMouse_Clickイベントで現在のマウスの位置を

    取得しようと以下のコードを作成しました.

    Point p = Mouse.GetPosition((WindowsFormsHost)grid1.Children[0]);

    動作させると,pに値は入りますが、chart1のどこでクリックしても同じ値が返ってきます.例えばX = -230,Y = -150

    chart上でのマウスの位置を取得するにはどうすれば良いのでしょうか?

    2016年1月7日 5:25

回答

  • こんな

    void chart_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (System.Windows.Forms.Control.MouseButtons == System.Windows.Forms.MouseButtons.Left)
        {
            var pScreen = System.Windows.Forms.Cursor.Position;//スクリーン座標
            var chart = (System.Windows.Forms.DataVisualization.Charting.Chart)sender;
            var pChart = chart.PointToClient(pScreen);//スクリーン座標からChartの座標に
            System.Diagnostics.Debug.WriteLine(pChart);
    
            var legpos = chart.Legends[0].Position;
            float x = pChart.X / (float)chart.Width * 100;//全体の大きさに対する割合で位置指定
            float y = pChart.Y / (float)chart.Height * 100;
            chart.Legends[0].Position = new ElementPosition(x, y, legpos.Width, legpos.Height);
        }
    }
    MouseUp/Down/MoveイベントのMouseEventArgsのLocationから取得してもいいですけどね


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク protecyamyam 2016年1月8日 2:02
    2016年1月7日 9:03

すべての返信

  • こんな

    void chart_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (System.Windows.Forms.Control.MouseButtons == System.Windows.Forms.MouseButtons.Left)
        {
            var pScreen = System.Windows.Forms.Cursor.Position;//スクリーン座標
            var chart = (System.Windows.Forms.DataVisualization.Charting.Chart)sender;
            var pChart = chart.PointToClient(pScreen);//スクリーン座標からChartの座標に
            System.Diagnostics.Debug.WriteLine(pChart);
    
            var legpos = chart.Legends[0].Position;
            float x = pChart.X / (float)chart.Width * 100;//全体の大きさに対する割合で位置指定
            float y = pChart.Y / (float)chart.Height * 100;
            chart.Legends[0].Position = new ElementPosition(x, y, legpos.Width, legpos.Height);
        }
    }
    MouseUp/Down/MoveイベントのMouseEventArgsのLocationから取得してもいいですけどね


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク protecyamyam 2016年1月8日 2:02
    2016年1月7日 9:03
  • ご回答ありがとうございます.

    凡例を移動させるコードまでご提示いただき大変助かりました.

    内容を理解して、応用につなげたいと思います.

    2016年1月8日 2:02