我正在使用C# Winforms创建自定义控件。我已经将一个图标添加到资源中,然后使用以下代码将该图标绘制到控件上:
using (Icon oIcon = Properties.Resources.DropDownCustom)
{
Rectangle RectangleIcon = new Rectangle((DropDownRectangle.X + ((DropDownRectangle.Width / 2) - (oIcon.Width / 2))),
(DropDownRectangle.Y + (((DropDownRectangle.Height / 2) - (oIcon.Height / 2)) + 1)),
oIcon.Width,
oIcon.Height);
graphics.DrawIcon(oIcon, RectangleIcon);
}
一切都正常,没有问题。但是后来我决定在控件属性中添加一个选项,允许开发者加载自己的图标来使用,而不是使用我放置在资源中的图标。我创建了一个私有的Icon变量:
private Icon _DropDownCustom;
我已经将上述代码中的"using"行更改为以下内容:
using (Icon oIcon = _DropDownCustom)
然后在构造函数中添加以下行,将默认值设置为资源中的值。
_DropDownCustom = Properties.Resources.DropDownCustom;
我已经添加了一个图标属性,以便开发人员可以使用他们自己的图标:
[Category("Appearance"), DisplayName("IconDropDown")]
public Icon IconDropDownCustom
{
get { return _DropDownCustom; }
set { _DropDownCustom = value; this.Invalidate(); }
}
所有这些似乎都很正常,但是现在,在表单中查看控件(处于开发模式下)时,它将图标绘制到控件上,非常好,但是一旦我选择表单或控件,图标就会消失,但其他绘画保留(例如背景渐变)。
有人知道为什么它似乎没有重新绘制图标吗?
非常感谢。
编辑:
我刚刚删除了代码中的“Using(){}
”部分,并将其更改为:
Icon oIcon = _DropDownCustom;
Rectangle RectangleIcon = new Rectangle((DropDownRectangle.X + ((DropDownRectangle.Width / 2) - (oIcon.Width / 2))),
(DropDownRectangle.Y + (((DropDownRectangle.Height / 2) - (oIcon.Height / 2)) + 1)),
oIcon.Width,
oIcon.Height);
graphics.DrawIcon(oIcon, RectangleIcon);
这似乎可以按预期工作,所以我猜测这与使用和释放内存有关 - 仍在努力理解释放的部分 - 您能否解释一下为什么会发生这种情况?我猜我的“oIcon”基本上只是引用了我的自定义图标变量而不是“按值传递”(我来自VB背景)。