【问题标题】:Building while Designer is open causes custom control to delete itself在 Designer 打开时构建会导致自定义控件自行删除
【发布时间】:2015-09-22 22:00:34
【问题描述】:

我制作了一个源自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() {

    }
}

【问题讨论】:

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


    【解决方案1】:

    通过反复试验设法修复它。

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-09
      • 2014-07-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多