【问题标题】:Custom control problem with variables变量的自定义控制问题
【发布时间】:2011-05-24 16:27:09
【问题描述】:

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

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

但由于某种原因,onPaint 函数中的 xMin、xMax、yMin 和 yMax 始终为 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。
  • 调用base.OnPaint之前的值是0吗?
  • 是的,我通过在构造函数处停止代码进行了检查,一切正常。

标签: c# winforms controls


【解决方案1】:

设计师很可能会将您的属性设置为默认值,即 0。

尝试使用DefaultValue 属性,只需确保两个值(用于初始化属性支持字段的值与默认值相同):

private double xMin = -10;

[DefaultValue(-10)]
public double XMin
{
    get { return xMin; }
    set
    {
        xMin = value;
        this.Invalidate();
    }
}

【讨论】:

  • 两个答案(这个和下面一个都不起作用)
  • @Quincy:那你能再试试另一个属性吗?这似乎在我的机器上效果最好,以前的机器很狡猾。
  • 在标记中包含控件时是否设置属性?如果没有,请尝试注释掉一个并查看后备存储是否设置为 0。这将告诉您设计者是否正在执行此操作。
  • @Quincy:这里有 2 位设计师参与其中:一位用于设计自定义控件,另一位用于使用新设计的控件设计组件/表单。此解决方案解决了第二个问题 - 在控件设计时具有不同的值,您可能需要不同的方法。
  • 哇,你说得对,我查看了 MainForm Designer.cs,这就是我发现的:this.graph1.XMax = 0D; this.graph1.XMin = 0D; this.graph1.YMax = 0D; this.graph1.YMin = 0D;所以我只是要删除它
【解决方案2】:

jimmy_keen 的回答是正确的。如果您的控件上有任何公共属性,设计器将提供用于配置它们的 UI。如果您不配置它们,那么设计器会将所有属性设置为其默认值——在本例中为default(int)(即0),而不是您最初设置的值你的代码。

但解决方案不是直接编辑*.Designer.cs 文件中的代码,因为Visual Studio 只会将其放回原处。相反,请转到设计器中自定义控件的属性并设置一些有用的值。

或者,如果你真的不想使用设计器来配置你的控件,你可以使用如下代码:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false)]
public double XMin
{
    get { return xMin; }
    set
    {
        xMin = value;
        this.Invalidate();
    }
}

有关详细信息,请参阅DesignerSerializationVisibilityAttribute 上的文档。

【讨论】:

  • 谢谢,这是一个比我更好的解决方案,
【解决方案3】:

如果设计人员将它们设置回零,则在初始化组件之后设置值。比如

InitializeComponent();
xMin = -10;
xMax = 10; 
yMin = -10;
yMax = 10;

因为它会在初始化组件内将它们设置为 0,这应该在构造函数之外的组件之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多