C# 设置Chart.ChartAreas[0]。轴[0]。最大值为";时System.Windows.Forms.DataVisualization.Charting.Chart是否存在错误;汽车;?

C# 设置Chart.ChartAreas[0]。轴[0]。最大值为";时System.Windows.Forms.DataVisualization.Charting.Chart是否存在错误;汽车;?,c#,winforms,charts,C#,Winforms,Charts,当我创建类型为System.Windows.Forms.DataVisualization.Charting.chart的新图表时,默认情况下轴比例设置为“Auto”,这意味着它将自动展开 在正常情况下,它的行为应该是正常的。但是如果我调用removietem像 chart1.Series[0].Points.AddXY(Control.MousePosition.X, -Control.MousePosition.Y); if (chart1.Series[0].Points.Count &g

当我创建类型为
System.Windows.Forms.DataVisualization.Charting.chart
的新图表时,默认情况下轴比例设置为“Auto”,这意味着它将自动展开

在正常情况下,它的行为应该是正常的。但是如果我调用
removietem

chart1.Series[0].Points.AddXY(Control.MousePosition.X, -Control.MousePosition.Y);
if (chart1.Series[0].Points.Count > 200)
{
    chart1.Series[0].Points.RemoveAt(0);
}
我删除了最旧的点,以确保线不会太长

然后,从第一次删除一个点开始,即使这些点超出图表区域,图表的轴也不会展开

所以我想知道这是不是System.Windows.Forms.DataVisualization.Charting.Chart的一个bug?还是我的操作不正确

PS:你可以写一个简单的演示来说明这个行为。使用我上面写的几行代码。它根据您的鼠标位置绘制样条曲线。绘制200多个点,样条线将逐渐消失。然后将鼠标移出边界,您将发现轴不再展开。 我已经在.NETFramework3.5和4.5.2中对它进行了测试,结果是一样的


否,图表控件中没有错误;错误在你的逻辑中。您希望axis增长,但它永远不需要超过数据的最大值。由于数据受到像素坐标的限制,一旦达到限制,坐标轴将保持在原来的位置

也无法将像素坐标转换为轴的值坐标

以下是如何使用鼠标绘制样条线的示例:

private void chart2_MouseMove(object sender, MouseEventArgs e)
{
    Axis ax = chart1.ChartAreas[0].AxisX;
    Axis ay = chart1.ChartAreas[0].AxisY;
    if (e.Button.HasFlag(MouseButtons.Left))  // only draw when the button is pressed
    {
        // convert pixels to values!
        chart1.Series[0].Points.AddXY(ax.PixelPositionToValue(e.X), 
                                      ay.PixelPositionToValue(e.Y));
        if (chart1.Series[0].Points.Count > 200)
        {
            chart1.Series[0].Points.RemoveAt(0);
        }
    }

更新

看起来我一开始不太理解你的问题,尤其是因为我没有看到计时器。在代码中打勾。你本该把它寄出去的

下面是您需要插入的一条细线:

private void timer1_Tick(object sender, EventArgs e)
{
    Point cp = Control.MousePosition;
    chart1.Series[0].Points.AddXY(cp.X, -cp.Y);
    if (chart1.Series[0].Points.Count > 200)
    {
        chart1.Series[0].Points.RemoveAt(0);
    }
    chart1.ChartAreas[0].RecalculateAxesScale();   // <<-------
}
private void timer1\u勾选(对象发送方,事件参数e)
{
点cp=控制点鼠标位置;
图表1.系列[0].点.AddXY(cp.X,-cp.Y);
如果(chart1.Series[0].Points.Count>200)
{
图表1.系列[0].点.RemoveAt(0);
}

chart1.ChartAreas[0]。RecreacteAxesCale();//否,图表控件中没有错误;错误在您的逻辑中。您希望轴增长,但它永远不需要超过数据的最大值。由于一旦达到限制,数据将受到像素坐标的限制,因此轴将保持不变

也无法将像素坐标转换为轴的值坐标

以下是如何使用鼠标绘制样条线的示例:

private void chart2_MouseMove(object sender, MouseEventArgs e)
{
    Axis ax = chart1.ChartAreas[0].AxisX;
    Axis ay = chart1.ChartAreas[0].AxisY;
    if (e.Button.HasFlag(MouseButtons.Left))  // only draw when the button is pressed
    {
        // convert pixels to values!
        chart1.Series[0].Points.AddXY(ax.PixelPositionToValue(e.X), 
                                      ay.PixelPositionToValue(e.Y));
        if (chart1.Series[0].Points.Count > 200)
        {
            chart1.Series[0].Points.RemoveAt(0);
        }
    }

更新

看起来我一开始不太理解你的问题,尤其是因为我没有看到计时器。在你的代码中打勾。你应该把它贴出来

下面是您需要插入的一条细线:

private void timer1_Tick(object sender, EventArgs e)
{
    Point cp = Control.MousePosition;
    chart1.Series[0].Points.AddXY(cp.X, -cp.Y);
    if (chart1.Series[0].Points.Count > 200)
    {
        chart1.Series[0].Points.RemoveAt(0);
    }
    chart1.ChartAreas[0].RecalculateAxesScale();   // <<-------
}
private void timer1\u勾选(对象发送方,事件参数e)
{
点cp=控制点鼠标位置;
图表1.系列[0].点.AddXY(cp.X,-cp.Y);
如果(chart1.Series[0].Points.Count>200)
{
图表1.系列[0].点.RemoveAt(0);
}

chart1.ChartAreas[0]。重新计算eAxesScale();//当然,它们不能扩展到chart1.ClientAreaSize之外。您确实意识到,您正在将点添加到pixelpositions,而生成的数据点则放置在它们的值位置。当然,它们不能扩展到chart1.ClientAreaSize之外。并且您确实意识到,您正在将点添加到pixelpositions,而生成的datapo整数放在它们的值位置。对不起,恐怕你误解了我的意思。绘制鼠标轨迹不是我的主要目的。它只是一种方便的方法来显示我发现的问题。通过使用我编写的代码,当鼠标超出图表区域时,
Control.MousePosition.X仍然可用,因为它是整个屏幕。我想要的只是显示一个扩展的边界。我将在我的问题中添加一个屏幕截图。请看一看。宾果!你太棒了!非常感谢。还有一个问题。我想知道为什么我们需要调用该方法。我想它应该是自动调整比例的。好吧,它不需要编写任何东西,但可以想到以下情况:恩所有这些重绘可能不是人们想要的;因此可能是为了方便,加上更多的选项,再加上可能的性能。对不起,恐怕你误解了我。绘制鼠标轨迹不是我的主要目的。它只是一种方便的方法来显示我发现的问题。通过使用我编写的代码,当鼠标超出图表区域时,
Cocontrol.MousePosition.X
仍然可用,因为它是整个屏幕的绝对位置。我想要的只是显示一个扩展的边界。我将为我的问题添加一个屏幕截图。请看一看。宾果!你太棒了!非常感谢。还有一个问题。我想知道为什么我们需要调用该方法。我认为它应该是自动的很好,书写不需要花费任何费用,但你可以想象这样的情况:所有这些重铸可能不是你想要的;所以它可能是为了方便,加上更多的选择,再加上可能的性能。