在自定义控件中使用 Invalidate() 时 VS2015 社区崩溃
VS2015 Community Crashes when using Invalidate() in custom Control
美好的一天,我正在基于 Visual Studio 中的标准控件制作一些自定义控件,但会为平面样式应用程序添加更多功能,这是我通常制作的。一切都很顺利,因为我已经做了很多功能控制。
由于我的 Visual Studio 崩溃导致太多工作丢失,我调查并找到了问题,嗯,至少是问题的根源。
每当我初始化一个可以使用设计修改的变量时,比如一个打开或关闭边框的布尔值(见下图),我想在 Set 事件期间调用 this.Invalidate()
命令所述变量。但是每当我添加代码行并单击构建解决方案或进入设计视图时,我的 Visual Studio 完全冻结,并且我在任务管理器中找到一个 Windows 错误报告进程 运行,这从来没有 returns 我可以使用的错误。
每次我重新启动我的 Visual Studio 直接进入项目时,都会出现一个弹出窗口,告诉我 Visual Studio 由于错误而崩溃并且没有加载我打开的任何文件。
请注意,即使我设置了 DrawMode = DrawMode.OwnerDrawFixed
并调整了所有 SetStyle()
,我的任何自定义控件和变量都会发生这种情况
编辑:抱歉,代码示例:
[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()',它会完美运行。
这个属性setter有无限递归:
[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();
}
}
美好的一天,我正在基于 Visual Studio 中的标准控件制作一些自定义控件,但会为平面样式应用程序添加更多功能,这是我通常制作的。一切都很顺利,因为我已经做了很多功能控制。
由于我的 Visual Studio 崩溃导致太多工作丢失,我调查并找到了问题,嗯,至少是问题的根源。
每当我初始化一个可以使用设计修改的变量时,比如一个打开或关闭边框的布尔值(见下图),我想在 Set 事件期间调用 this.Invalidate()
命令所述变量。但是每当我添加代码行并单击构建解决方案或进入设计视图时,我的 Visual Studio 完全冻结,并且我在任务管理器中找到一个 Windows 错误报告进程 运行,这从来没有 returns 我可以使用的错误。
每次我重新启动我的 Visual Studio 直接进入项目时,都会出现一个弹出窗口,告诉我 Visual Studio 由于错误而崩溃并且没有加载我打开的任何文件。
请注意,即使我设置了 DrawMode = DrawMode.OwnerDrawFixed
并调整了所有 SetStyle()
编辑:抱歉,代码示例:
[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()',它会完美运行。
这个属性setter有无限递归:
[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();
}
}