我在C#winforms中创建自定义控件。我已经在资源中添加了一个ICON,然后使用下面的代码将该图标绘制到控件上:
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 (Icon oIcon = _DropDownCustom)
然后在构造函数中添加以下行,将默认值设置为资源中的值。
_DropDownCustom = Properties.Resources.DropDownCustom;
然后我添加了一个Icon属性,以便开发人员可以使用自己的图标:
[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”基本上只是引用我的自定义Icon变量而不是“按值”(我来自VB背景)。
答案 0 :(得分:0)
图标资源周围的“使用”块将向GC发出信号,表明不再需要该位置的内存,它将清理它。所以,在第一次绘制之后,Icon将不再有效(除非你加载它并在每次绘制时将其处理掉)。
您可能应该:
处理控件的关闭事件并处理那里的资源。
在您的用户控件上实施Disposable模式,以便在不再需要您的控件时清理资源(例如您的图标)。