2

[編集]

多くの試行錯誤の末、ツールチップコードのバージョンは、残りのコードは変更されていない状態でスクロールできることに気付きました。2つのツールチップの使用法の唯一の違いは、マウスが正確に配置されている場所ではなく、pos.x値がシフトされることです。

つまり、代わりに

/*X-axis Tooltip*/
tooltip.Show(Math.Truncate(xValue * 1000) / 1000 + unit_Converter(), this.chart1, pos.X, pos.Y - 15);

これは私がしました

/*X-axis Tooltip*/
tooltip.Show(Math.Truncate(xValue * 1000) / 1000 + unit_Converter(), this.chart1, pos.X - 70, pos.Y - 15);

それがすべての違いでした。これで、X軸のスクロールバーをクリックしてドラッグできます。いつもY軸をスクロールできるのは、そもそも15軸ずれているからだと思います。

したがって、ツールチップの位置をマウスの位置と正確に設定すると、スクロールしようとしたときに、スクロールバーではなくツールチップ自体をクリックするようになります。

Josh Wが提供する回答も同様に有効です。これは、「this.chart」の代わりに「this」だけを使用すると、何らかの理由でツールチップが自動的に少しシフトするためです。助けてくれてありがとう!


【元の質問】

Y軸とX軸のスクロールバーがあるグラフがあります。しばらくの間、両方のスクロールバーが機能しました。コードが大きくなると、X軸のスクロールバーは移動しなくなり、Y軸のスクロールバーは正常に移動します。困惑しています。どんな助けでもいただければ幸いです。

私は次のような他の答えを参照しました

c#チャートコントロール、ズームでの垂直スクロールの問題["スクロールバーのスタック"]

しかし、X軸のスクロールバーはまだ動かなくなっています。

[編集]:マウス移動コードのツールチップがこれを引き起こしていることに気づきました。マウス移動コードの呼び出しを無効にすると、X軸のスクロールバーが再び機能するようになります。しかし、両方が機能できるようにするにはどうすればよいですか?クロスエアのツールチップがX軸のみのスクロールを無効にし、Y軸のスクロールを無効にする方法はよくわかりません...

    void chart1_MouseMove(object sender, MouseEventArgs e)
    {
        var pos = e.Location;
        _point.X = e.Location.X;
        _point.Y = e.Location.Y;

        try
        {
            if ((chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X) >= 0) && (chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X) <= max))
            {
                //Crossair
                chart1.ChartAreas[0].CursorX.SetCursorPixelPosition(_point, true);

                //Tooltips                    
                double xValue = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);

                /*X-axis Tooltip*/
                tooltip.Show(Math.Truncate(xValue * 1000) / 1000 + unit_Converter(), this.chart1, pos.X, pos.Y - 15);
            }
        }
        catch (Exception exception)
        {

        }
}

シリーズ設定を設定するための私のコード:

var series = chart1.ChartAreas[chart1.Series[iname].ChartArea];

//Line thickness
chart1.Series[iname].BorderWidth = 2;

series.AxisX.Minimum = 0;
series.AxisX.Maximum = max;
series.AxisY.Minimum = 0;
series.AxisY.Maximum = checkedListBox1.CheckedItems.Count * 3 - 2;
series.AxisX.MajorGrid.Interval = time_of_cycle;
series.AxisX.MajorGrid.LineDashStyle = ChartDashStyle.DashDotDot;
series.AxisY.MajorGrid.Interval = 2;
series.CursorX.Interval = 0;
series.CursorY.Interval = 0;

series.AxisX.ScaleView.SmallScrollSize = time_of_cycle /100 ;
series.AxisY.ScaleView.SmallScrollSize = 1;

//Disables Y axis lable
series.AxisY.LabelStyle.Enabled = false;

series.AxisX.LabelStyle.ForeColor = Color.White;
series.AxisY.LabelStyle.ForeColor = Color.White;
series.AxisX.LabelStyle.Format = label_Style_Converter();

series.AxisX.LabelStyle.Interval = time_of_cycle * 2;
series.AxisX.MajorGrid.LineColor = Color.DimGray;
series.AxisY.MajorGrid.LineColor = Color.DimGray;
series.AxisX.ScrollBar.BackColor = Color.LightGray;
series.AxisY.ScrollBar.BackColor = Color.LightGray;
series.AxisX.ScrollBar.ButtonColor = Color.LightGray;
series.AxisY.ScrollBar.ButtonColor = Color.LightGray;
series.AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.SmallScroll;
series.AxisY.ScrollBar.ButtonStyle = ScrollBarButtonStyles.SmallScroll;
series.AxisX.ScrollBar.Enabled = true;
series.AxisY.ScrollBar.Enabled = true;
series.AxisX.ScrollBar.IsPositionedInside = false;
series.AxisY.ScrollBar.IsPositionedInside = false;
series.AxisX.IsMarginVisible = true;
series.AxisY.IsMarginVisible = false;
series.AxisX.Name = "µs";
series.AxisX.ScaleView.Size = max - time_of_cycle / 100;
series.AxisY.ScaleView.Size = (checkedListBox1.CheckedItems.Count * 3 - 2) + 1 ;
series.BackColor = Color.Black;

//crosshair
var cursor_Y = chart1.ChartAreas["ChartArea1"].CursorY;
var cursor_X = chart1.ChartAreas["ChartArea1"].CursorX;
cursor_Y.LineWidth = 1;
cursor_Y.LineDashStyle = ChartDashStyle.Solid;
cursor_Y.LineColor = Color.DarkRed;
cursor_Y.SelectionColor = Color.LightGray;

cursor_X.LineWidth = 1;
cursor_X.LineDashStyle = ChartDashStyle.Solid;
cursor_X.LineColor = Color.DarkRed;

chart1.MouseMove += new MouseEventHandler(chart1_MouseMove);
4

1 に答える 1

1

最初は、あなたの呼び出しがGUIスレッドをブロックしているのではないかと思いまし.Show()たが、いくつかの速くて汚いコードにはその問題がないようでした。ツールチップで気付いた奇妙なことの1つは、チャートのようなものがMouseMoveイベントにサブスクライブされていて、ツールチップに「this.chart1」参照が与えられているthis場合、ツールチップがマウス、それはイベントを発生させ続けます。

つまり、たとえばツールチップがチャートから外れたとしても。

チャートの代わりにパネルを使用して遊んだばかりのテストコードを次に示します。

    private int Counter = 0;
    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        Console.WriteLine(string.Format("X{0}, Y{1}\t Count = {2}", e.X, e.Y, Counter));
        Counter++;

        toolTip1.Show(
            string.Format("X{0}, Y{1}\t Count = {2}", e.X, e.Y, Counter),
            this.panel1,
            e.X - 75,
            e.Y -5);
    }

Form1

まず、エラーに対して何もしていないので、そのtry / catchステートメントも削除する必要があります...エラーを処理するか、エラーを発生させて何かをクラッシュさせます(「修正」できるようにします)。あなたが今そこに持っているものはエラーを投げるかもしれません、しかしあなたはそれを捕まえてそれを無視しているので、あなたは決して知りません。

次に、MouseMoveイベントが頻繁に発生します...おそらくツールチップを表示するためにMouseHoverを使用しますか?

それ以外は...コードが壊れている場所ではないようですが、unit_Converter()呼び出し内や数学関数上にある可能性があります... try/catchがその行の例外を隠している可能性があります。

于 2013-03-26T03:11:43.957 に答える