我在 Windows 窗体中有一个图表,我希望网格线是方形的。网格线固定在底部、顶部、左侧和右侧,因此它会随屏幕调整大小。如何使网格线始终呈正方形并使整个图表随屏幕调整大小?
我试过将宽度和高度设置为相同,但它不起作用,因为图表的系列名称在右侧。
编辑 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;
最佳答案
您可以通过仅将图表锚定到 Top
和 Left
并计算和设置 Width
和 Height
当表单大小改变时你自己。
为此,我们在表单构造函数中获取图表的基本数据。
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/