变量的自定义控制问题

时间:2011-05-24 16:27:10

标签: c# winforms controls

我是第一次创建自定义控件,我将其作为代码的一部分:

    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();
        }
    }

3 个答案:

答案 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上的文档。