我制作了一个源自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() {
}
}
答案 0 :(得分:0)
通过反复试验来管理它。
在放置自定义控件的新实例时,似乎在构建时在Designer中取消设置第一个放置实例的父窗体。我不完全确定为什么会发生这种情况 - 我假设在构建之前没有引用控件附加到父表单,因此当设计人员通过此代码并尝试获取mParent.Move
时,它会遇到静默错误并停止执行表单的其余部分(这可以解释为什么只有控件的第一个实例中断?)。
我通过这个小改动来修复它,以检查OnParentChanged
中的父表单是否为空:
if(mParent != null) { mParent.Move += Parent_Move; }