c# - Windows窗体C#如何制作图表正方形的网格线?

标签 c# winforms

我在 Windows 窗体中有一个图表,我希望网格线是方形的。网格线固定在底部、顶部、左侧和右侧,因此它会随屏幕调整大小。如何使网格线始终呈正方形并使整个图表随屏幕调整大小?

The graph image

我试过将宽度和高度设置为相同,但它不起作用,因为图表的系列名称在右侧。

编辑 1: 这是完整的未经审查的代码:

chart1.ChartAreas[0].AxisY.Minimum = 0;
chart1.ChartAreas[0].AxisY.Maximum = max;
chart1.ChartAreas[0].AxisX.Minimum = 0;
chart1.ChartAreas[0].AxisX.Maximum = max;
chart1.ChartAreas[0].AxisX.LabelStyle.Format = "0";
chart1.ChartAreas[0].AxisY.LabelStyle.Format = "0";
chart1.ChartAreas[0].AxisX.Interval = 1;
chart1.ChartAreas[0].AxisY.Interval = 1;

chart1.ChartAreas[0].AxisX.IntervalAutoMode = IntervalAutoMode.FixedCount;
chart1.ChartAreas[0].RecalculateAxesScale();
for (int i = 0; i < points.ToArray().Length; i++)
    dt.Rows.Add(pointsArr[i, 0], pointsArr[i, 1]);
chart1.DataSource = dt;

chart1.Series["תחום הפתרונות האפשריים"].BorderWidth = 0;
float[] OptimalPoint = CalculateOptimalPt(convertEq(z), ListArToAr(points));
if (OptimalPoint[0] == 0)
{
    for (int i = 0; i < 2; i++)
    {
        DataPoint dp = new DataPoint();
        dp.SetValueXY(i, OptimalPoint[1]);
        if (i > 0) dp.Color = Color.Transparent;
        chart1.Series["פיתרון אופטימלי"].Points.Add(dp);
    }
}
else
    chart1.Series["פיתרון אופטימלי"].Points.AddXY(OptimalPoint[0], OptimalPoint[1]);
chart1.Series["פיתרון אופטימלי"].Points[0].MarkerSize = 10;
chart1.Series["תחום הפתרונות האפשריים"].XValueMember = "X_Value";
chart1.Series["תחום הפתרונות האפשריים"].YValueMembers = "Y_Value";
chart1.Series["תחום הפתרונות האפשריים"].ChartType = SeriesChartType.Area;
panel1.Visible = false;
panel2.Visible = true;

最佳答案

您可以通过仅将图表锚定到 TopLeft 并计算和设置 WidthHeight 当表单大小改变时你自己。

为此,我们在表单构造函数中获取图表的基本数据。

private readonly Size _innerMargin = new Size(183, 55); // Estimated
private readonly Size _outerMargin;
private readonly float _aspectRatio;

public Form1()
{
    InitializeComponent();

    _outerMargin = Size - chart1.Size;
    Size innerSize = chart1.Size - _innerMargin;

    _aspectRatio = (float)innerSize.Width / innerSize.Height;
}

_innerMargin 是图表大小和带有网格线的绘图区域之间的估计总差异。我实际上是从屏幕截图中得到的,并在图形应用程序中对其进行了测量。

_outerMargin 是窗体大小与图表控件大小之差。

初始 _aspectRatio 的这种计算假设在表单打开时网格线构建完美的正方形。相反,您可以根据 X 和 Y 中已知的正方形数量设置此纵横比:

_aspectRatio = 16f / 16f; // From your example image.

然后在 Form_Resize 事件处理程序中,我们设置图表的新大小。根据当前纵横比(根据理论新的最大绘图区域大小计算)是小于还是大于原始纵横比,图表的高度或宽度决定了最大图表大小。必须计算另一个维度,使绘图区域的纵横比保持不变。

private void Form1_Resize(object sender, EventArgs e)
{
    Size maxChartSize = Size - _outerMargin;
    Size innerSize = maxChartSize - _innerMargin;

    double currentAspectRatio = (float)innerSize.Width / innerSize.Height;
    if (currentAspectRatio < _aspectRatio) {
        int chartWidth = Width - _outerMargin.Width;
        chart1.Width = chartWidth;
        chart1.Height = (int)((chartWidth - _innerMargin.Width) / _aspectRatio + _innerMargin.Height);
    } else {
        int chartHeight = Height - _outerMargin.Height;
        chart1.Height = chartHeight;
        chart1.Width = (int)((chartHeight - _innerMargin.Height) * _aspectRatio + _innerMargin.Width);
    }
}

关于c# - Windows窗体C#如何制作图表正方形的网格线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59009850/

相关文章:

c# - 如何在 WinForms 中扩展控件?

c# - 窗体。 Form.Close 后定时器不停止

c# - 在 winforms 应用程序中检测各种触摸事件

c# - asp.net 中的 image.src 总是空的

c# - 为什么 SpellCheck 总是将附加词典(utf-8、带 BOM 的 utf-8、UTF-16)中的单词标记为错误?

c# - 为什么我的 C++ 代码看不到这个 C# 类成员?

c# - 如何在 ios 中以编程方式打开设置

c# - 甚至不知道如何开始解决这个问题

c# - Expression.Coalesce 的转换参数是做什么用的?

c# - VS Code 指标如何计算