WPF中拖动时如何更改光标

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出现。所以这就像是一个延迟反应,就像它在等我放下而不是在我拖动时就完成了。
如果有人能看出代码有什么问题,我将非常感激。我有一种感觉,可能与DragDropEffects有关,但这主要是一种直觉。

你是否在你想要拖放的控件上设置了“AllowDrop”标志? - Kevin DiTraglia
我实际上不想允许拖放。我想要显示的自定义光标实际上应该比任何默认光标更明显地表明该项需要拖到其他地方。 - theqs1000
2个回答

12

回答这个问题是因为它是谷歌搜索的最佳结果。

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

这个方法应该在拖动源上定义。非常重要的是,您要将事件标记为已处理,并且不要调用base.OnGiveFeedback,因为两者都会导致默认拖动光标覆盖您的更改。

请注意,我还使用Mouse.SetCursor而不是更明显的FrameworkElement.Cursor。后者是拖动源元素的持久属性,您很可能不想更改它。


1

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

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

嗨,我尝试了这个但问题仍然存在。有没有其他方法可以强制覆盖光标? - theqs1000
哦,我没有其他的想法。抱歉。 - Matthias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接