Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在WPF中拖动时更改光标_Wpf_Drag And Drop - Fatal编程技术网

在WPF中拖动时更改光标

在WPF中拖动时更改光标,wpf,drag-and-drop,Wpf,Drag And Drop,我正在使用这个很棒的拖放框架: 我有两个列表框-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

我正在使用这个很棒的拖放框架: 我有两个列表框-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;
 }
}
唯一的问题是,当我拖动光标时,显示的是不允许的操作(带线的黑色圆圈)。我一松开鼠标,就会看到我的ListboxACursor出现。所以这就像是一种延迟反应,就像它在等待我放弃,而不是在我拖拽的时候做


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

这是因为Windows试图使用自己的光标来确保默认的外观。可以通过明确禁用默认光标来避免这种情况。请参见本节中的“反馈事件”


回答这个问题是因为这是谷歌排名第一的结果

protected override void OnGiveFeedback(System.Windows.GiveFeedbackEventArgs e)
{
    Mouse.SetCursor(Cursors.Hand);
    e.Handled = true;
}
应在拖动源上定义此方法。必须将事件标记为已处理,并且不要调用
base.OnGiveFeedback
,因为这样做都会导致默认的拖动光标覆盖更改


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

您是否在试图拖放到的控件上设置了
AllowDrop
标志?我实际上不想允许拖放。我想要显示的自定义光标实际上应该使项目需要拖动到其他地方变得更明显(比任何默认光标都要明显)。您好,我尝试了这个方法,但问题仍然存在。有没有其他方法可以强制覆盖光标?嗯,我没有其他想法。很抱歉
protected override void OnGiveFeedback(System.Windows.GiveFeedbackEventArgs e)
{
    Mouse.SetCursor(Cursors.Hand);
    e.Handled = true;
}