我有一个带有用户控件的WinForms应用程序,我可以根据其位置动态更改游标。我将自定义游标创建为用户控件的静态成员,如下所示:
private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle );
然后在OnMouseMove
覆盖中,我设置了适当的光标,如下所示:
this.Cursor = <some condition> ? _openHandCursor : Cursors.Default;
当我启动应用程序时,它可以正常工作。但是,在几次光标更改(大约20)后,它会粘贴默认(箭头)位图并且不再更改。但最奇怪的是,在发生这种情况之后,我检查当前Handle
值的Cursor
属性,它等于_openHandCursor
对象的句柄!所以似乎属性的值仍然正确设置,但屏幕上的光标位图不会更新。有关这种奇怪行为的任何建议吗?
答案 0 :(得分:1)
更改
private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle );
到
private static Cursor _openHandCursor = Properties.Resources.openHand;
当您创建Cursor
对象(new Cursor (<Handle>)
)时,它只会重用与资源中的游标相同的句柄。
由于您不存储对原始游标的引用(由Properties.Resources.openHand.Handle
属性getter创建),因此将进行垃圾回收。
Cursor
类定义了终结器,它通过调用DestroyCursor()
来销毁句柄,使其无效。现在,您创建的Cursor
具有相同的句柄,但它不知道句柄不再有效。
当您尝试设置无效光标时,操作系统只使用默认光标。
答案 1 :(得分:0)
尝试更改UserControls的MouseEnter
和MouseLeave
事件中的光标。
Psuedo代码:
MouseEnter Event
Change mouse cursor to hand
MouseLeave Event
Change mouse cursor to normal
请参阅here