在WPF中拖动时更改光标

问题描述 投票:5回答:2

我使用的是出色的拖放框架: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出现。因此,这就像是一个延迟的反应,就像它在等待我拖放而不是在我进行DragOvering时那样。

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

wpf drag-and-drop
2个回答
10
投票

回答问题,因为它是Google的最高结果。

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;
 }
© www.soinside.com 2019 - 2024. All rights reserved.