在MSChart Chart中卡住了x轴滚动条

时间:2013-03-25 08:47:19

标签: c# .net winforms scrollbar mschart

[编辑]

经过大量的试验和错误,我意识到我的工具提示代码版本可以滚动,而其余的代码不变。两个工具提示用法之间的唯一区别是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”而不是“this.chart”会因某种原因自动移动工具提示。谢谢你的帮助!


[原始问题]

我有一个包含Y轴和X轴滚动条的图表。有一段时间我的滚动条都有效。随着我的代码增长,X轴滚动条现在不会移动,而Y轴滚动条移动得很好。我很困惑。任何帮助将不胜感激。

我引用了其他答案,例如

c# chart control, vertical scrolling problems with zoom ["Stuck Scroll bar"]

但是X轴滚动条仍然卡住....

[编辑]: 我意识到我在鼠标移动代码上的工具提示导致了这一点。如果我禁用对鼠标移动代码的调用,则X轴滚动条将再次起作用。但是我如何才能使它们都能发挥作用呢?我真的不知道crossair工具提示如何仅禁用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);

1 个答案:

答案 0 :(得分:1)

起初我想也许你对.Show()的调用阻止了GUI线程,但是一些快速而脏的代码似乎没有这个问题。我通过工具提示注意到的一件奇怪的事情是,当你的图表中有类似订阅鼠标移动事件时,你的工具提示被赋予'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可能隐藏了那条线上的例外。