在WPF中拖动时更改光标

the*_*000 5 wpf drag-and-drop

我正在使用这个很棒的拖放框架:http://code.google.com/p/gong-wpf-dragdrop/ 我有两个列表框--A和B.当我从B拖到A时,我想要鼠标一旦光标位于列表框A的区域内,光标就会改变.

我几乎得到了它.通过使用IDropTarget接口,如下所示:

void IDropTarget.DragOver(DragOver drag)
{
 drag.Effects = DragDropEffects.Copy | DragDropEffects.Move;

 // some logic to determine if hovering over listbox A
 // ...

 if (hoveringOverListA)
 {
  ListBoxA.Cursor =  ((FrameworkElement) Application.Current.Resources["ListboxACursor"]).Cursor;
 }
}
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,当我拖动光标时显示的是不允许的操作(带有直线的黑色圆圈).一旦我释放鼠标,我就会看到我的ListboxACursor出现.所以这就像是一个延迟的反应,就像它在等待我拖拽而不是在我拖拽时这样做.

如果有人能看到代码有什么问题,我将不胜感激.我觉得它可能与DragDropEffects有关,但它主要是预感.

谢谢

Art*_*kel 9

回答这个问题,因为它是谷歌的最高结果.

protected override void OnGiveFeedback(System.Windows.GiveFeedbackEventArgs e)
{
    Mouse.SetCursor(Cursors.Hand);
    e.Handled = true;
}
Run Code Online (Sandbox Code Playgroud)

应在拖动源上定义此方法.将事件标记为已处理且不要调用是至关重要的base.OnGiveFeedback,因为这样做会导致默认拖动光标覆盖您的更改.

请注意我是如何使用Mouse.SetCursor而不是更明显的FrameworkElement.Cursor.后者是拖动源元素的持久属性,您实际上不太可能想要更改


Mat*_*ias 1

这是因为 Windows 尝试使用自己的光标来确保默认的外观和感觉。您可以通过显式禁用默认光标来避免这种情况。请参阅本教程中的 GiveFeedback 事件

 private void DragSource_GiveFeedback(object sender, GiveFeedbackEventArgs e)
 {
   e.UseDefaultCursors = e.Effect != DragDropEffects.Copy;
 }
Run Code Online (Sandbox Code Playgroud)