繁体   English   中英

在自定义控件中使用Invalidate()时,VS2015社区崩溃

[英]VS2015 Community Crashes when using Invalidate() in custom Control

美好的一天,我正在基于Visual Studio中的标准控件制作一些自定义控件,但是为平样式应用程序添加了更多功能,这是我通常所做的。 一切进展顺利,因为我已经做了很多功能控制。

由于Visual Studio崩溃导致太多工作丢失后,我进行了调查,至少发现了这个问题的根源。

每当我初始化一个可以使用设计修改的变量时,例如说一个使边框打开或关闭的布尔值(请参见下图),我this.Invalidate()在所述变量的Set事件期间调用this.Invalidate()命令。 但是,每当我添加代码行并单击“生成解决方案”或进入“设计”视图时,我的Visual Studio就会完全死机,并且我发现在任务管理器中运行的Windows错误报告过程中,这永远不会返回我可以使用的错误。

每次我直接将Visual Studio重新启动到项目中时,都会出现一个弹出窗口,告诉我Visual Studio由于错误而崩溃,并且没有加载我打开过的任何文件。

请注意,即使我设置了DrawMode = DrawMode.OwnerDrawFixed ,并且还调整了所有SetStyle() ,这都会发生在我的任何自定义控件和变量上

编辑:Apologiez,代码示例:

[Category("Appearance")]
public bool HasBorder
{
    get
    {
        return HasBorder;
    }
    set
    {
        HasBorder = value;
        this.Invalidate();
    }
}

public vComboBoxList()
{
    Items = new List<object>();
    DataSource = new List<object>();
    SelectedItemColor = SystemColors.Highlight;
    HoverItemColor = SystemColors.HotTrack;
    BorderColor = SystemColors.ActiveBorder;
    HasBorder = false;
    ItemHeight = 16;
    BorderThickness = 2;
}
protected override void OnCreateControl()
{
    base.OnCreateControl();
}
protected override void OnPaint(PaintEventArgs e)
{
    Height = Items.Count * ItemHeight;
    if (Items.Count > 0)
    {
        foreach (object Item in Items)
        {
            if (Items.IndexOf(Item) == ItemOver)
                e.Graphics.FillRectangle(new SolidBrush(HoverItemColor), new Rectangle(0, Items.IndexOf(Item) * ItemHeight, Width, ItemHeight));
            else if (Items.IndexOf(Item) != ItemOver)
                e.Graphics.FillRectangle(new SolidBrush(BackColor), new Rectangle(0, Items.IndexOf(Item) * ItemHeight, Width, ItemHeight));
            e.Graphics.DrawString(Items.IndexOf(Item).ToString(), Font, new SolidBrush(ForeColor), new Point(4, Items.IndexOf(Item) * ItemHeight));
        }
    }
    if(HasBorder && BorderThickness != 0)
    {
        Rectangle _Top = new Rectangle(0, 0, Width, BorderThickness);
        Rectangle _Right = new Rectangle(Width, 0, -BorderThickness, Height);
        Rectangle _Left = new Rectangle(0, 0, BorderThickness, Height);
        Rectangle _Bottom = new Rectangle(0, Height, Width, -BorderThickness);
        e.Graphics.FillRectangles(new SolidBrush(BorderColor), new Rectangle[] { _Top, _Right, _Left, _Bottom });
    }
    base.OnPaint(e);
}

如果我从“ set {}”中删除“ this.Invalidate()”,则效果很好。

此属性设置器具有无限的递归:

[Category("Appearance")]
public bool HasBorder
{
    get
    {
        return HasBorder;
    }
    set
    {
        HasBorder = value; // will call setter again, which will call setter, which ...
        this.Invalidate();
    }
}

将其更改为普通的完整属性:

bool _hasBorder;
public bool HasBorder
{
    get { return _hasBorder; }
    set
    {
        _hasBorder = value;
        Invalidate();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM