6

我正在使用这个很棒的拖放框架: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;
 }
}

唯一的问题是,当我拖动光标时,显示的是不允许的操作(带有线条的黑色圆圈)。只要我松开鼠标,我就会看到我的 ListboxACursor 出现。所以它就像是一个延迟的反应,就像它在等待我 Drop 而不是在我 DragOver'ing 时执行它。

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

4

2 回答 2

12

回答这个问题是因为它是 Google 搜索结果中的佼佼者。

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

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

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

于 2014-03-26T13:33:13.203 回答
1

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

 private void DragSource_GiveFeedback(object sender, GiveFeedbackEventArgs e)
 {
   e.UseDefaultCursors = e.Effect != DragDropEffects.Copy;
 }
于 2013-01-15T17:12:58.013 回答