我是第一次创建自定义控件,我将其作为代码的一部分:
protected Pen pen;
protected Color lineColor = Color.Green;
protected double xMin = -10, xMax = 10, yMin = -10, yMax = 10;
protected double[] data;
public Graph()
{
InitializeComponent();
pen = new Pen(new SolidBrush(lineColor), 1);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if(yMin <= 0 || yMax >= 0)
{
double yDifference = Math.Abs(yMin) + Math.Abs(yMax);
double xAxisHeight = (Math.Abs(yMin) / yDifference) * Height;
e.Graphics.DrawLine(pen, new Point(0, (int)xAxisHeight), new Point(Width, (int)xAxisHeight));
}
}
但由于某种原因,xMin,xMax,yMin和yMax在onPaint函数中始终为0。
编辑:
以下是Graph.cs的其余代码
The only this I wasn't showing was this :
public double XMin
{
get { return xMin; }
set
{
xMin = value;
this.Invalidate();
}
}
public double XMax
{
get { return xMax; }
set
{
xMax = value;
this.Invalidate();
}
}
public double YMin
{
get { return yMin; }
set
{
yMin = value;
this.Invalidate();
}
}
public double YMax
{
get { return yMax; }
set
{
yMax = value;
this.Invalidate();
}
}
public double[] Data
{
get { return data; }
set
{
data = value;
this.Invalidate();
}
}
public Color LineColor
{
get { return lineColor; }
set
{
lineColor = value;
pen = new Pen(new SolidBrush(lineColor), 1);
this.Invalidate();
}
}
答案 0 :(得分:1)
Designer很可能将您的属性设置为默认值,即0。
尝试使用DefaultValue
属性,只需确保两个值(初始化属性支持字段的值与默认值相同):
private double xMin = -10;
[DefaultValue(-10)]
public double XMin
{
get { return xMin; }
set
{
xMin = value;
this.Invalidate();
}
}
答案 1 :(得分:0)
如果设计人员将它们设置为零,则在Initialize components之后设置值。例如
InitializeComponent();
xMin = -10;
xMax = 10;
yMin = -10;
yMax = 10;
因为它会在初始化组件中将它们设置为0,这应该在构造函数之外的组件之后。
答案 2 :(得分:0)
jimmy_keen的回答是正确的。如果您的控件上有任何公共属性,设计器将提供用于配置它们的UI。如果您不配置它们,那么设计器会将所有属性设置为其默认值 - 在本例中为default(int)
(即0
),而不是您最初的值将其设置为您的代码。
但解决方案不是直接编辑*.Designer.cs
文件中的代码,因为Visual Studio会将其放回原位。而是在Designer中转到自定义控件的属性并设置一些有用的值。
或者,如果您真的不想使用设计器配置控件,可以使用如下代码:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false)]
public double XMin
{
get { return xMin; }
set
{
xMin = value;
this.Invalidate();
}
}
有关详细信息,请参阅DesignerSerializationVisibilityAttribute
上的文档。