在Designer打开时进行构建会导致自定义控件自行删除

时间:2015-09-22 22:00:34

标签: c# controls windows-forms-designer designer

我制作了一个源自PictureBox的自定义控件,它基本上既可以作为文本区域(单行和多行),也可以作为按钮(具有自定义边框颜色和正常/活动状态的颜色) /禁用)。

问题是:当我在Designer打开时重建我的项目时,第一个放置的自定义控件从我的项目中消失(完全从.Designer.cs中删除,在Designer&属性控件列表中不可见)。

如果我先关闭设计器视图,然后重新构建然后再次打开设计器,控件就不会自行删除。

这可能是什么原因?

编辑:这似乎是造成这种情况的OnParentChanged事件,但我不太清楚为什么会这样做?

以下是我的自定义控件的所有代码:(删除与问题无关的代码)

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

public class PicBox : PictureBox {
    [NotifyParentProperty(true), RefreshProperties(RefreshProperties.Repaint)]
    public Color BorderNormalColor { get { return borderNormalColor; } set { borderNormalColor = value; RefreshInactiveColor(); } }
    private Color borderNormalColor = Color.FromArgb(255, 44, 44, 44);
    //Several more properties like this for other things

    protected override void OnPaint(PaintEventArgs e) {
        base.OnPaint(e);
        //code for updating properties
    }

    protected override void OnParentChanged(EventArgs e) {
        base.OnParentChanged(e);
        Form mParent = (Form)Parent;
        mParent.Move += Parent_Move;
    }
    private void Parent_Move(object sender, EventArgs e) {
        Invalidate();
    }

    public PicBox() {

    }
}

1 个答案:

答案 0 :(得分:0)

通过反复试验来管理它。

在放置自定义控件的新实例时,似乎在构建时在Designer中取消设置第一个放置实例的父窗体。我不完全确定为什么会发生这种情况 - 我假设在构建之前没有引用控件附加到父表单,因此当设计人员通过此代码并尝试获取mParent.Move时,它会遇到静默错误并停止执行表单的其余部分(这可以解释为什么只有控件的第一个实例中断?)。

我通过这个小改动来修复它,以检查OnParentChanged中的父表单是否为空:

if(mParent != null) { mParent.Move += Parent_Move; }