Wpf拖放,如何在拖动过程中可视地拒绝拖放?

r7s23pms  于 2022-11-18  发布在  其他
关注(0)|答案(4)|浏览(279)

在Wpf中拖动时,如何改变鼠标光标(或者使用装饰器)以指示droptarget不接受拖动的项?
我尝试在DragEnter事件期间设置e.Effects = DragDropEffects.None,但这不起作用,我怀疑我误解了该功能的用途。我尝试使用GiveFeedback事件,但看不出droptarget如何影响它。

k7fdbhmy

k7fdbhmy1#

只要在拖放目标的DragEnter中设置DragDropEffects就可以了。是否调用了DragEnter。是否在拖放目标控件上设置了AllowDrop?
这是WPF中拖放过程中的事件序列(摘自MSDN),它可能有助于了解发生了什么...
1.拖曳是借由呼叫原始档控制的DoDragDrop方法来起始。
DoDragDrop方法采用两个参数:* data,指定要传递的数据 * allowedEffects,指定允许哪些操作(复制和/或移动)
将自动创建一个新的DataObject对象。
1.这会引发GiveFeedback事件。在大多数情况下,您不需要担心GiveFeedback事件,但如果您希望在拖动过程中显示自定义鼠标指针,则需要在此处添加代码。
1.任何AllowDrop属性设置为True的控件都是潜在的放置目标。AllowDrop属性可以在设计时在“属性”窗口中设置,也可以在Form_Load事件中以编程方式设置。
1.当鼠标经过每个控件时,将引发该控件的DragEnter事件。GetDataPresent方法用于确保数据的格式适合于目标控件,Effect属性用于显示适当的鼠标指针。
1.如果使用者在有效的置放目的上放开鼠标器按钮,就会引发DragDrop事件。DragDrop事件行程常式中的程式码会从DataObject对象撷取数据,并将数据显示在目的控件中。

7uzetpgm

7uzetpgm2#

我遇到了类似的问题,因为我在GiveFeedback处理程序中更改了光标。即使放置目标拒绝数据,也会使用此光标。切换回默认光标(例如,UseDefaultCursors = true)后,光标形状确实正确地更改为“不允许”。

elcex8rz

elcex8rz3#

你没有说你是否使用了DragOver even,也许你在这个even里设置了e.Effect = DragDropEffects.All;,进入目标控件后会反复触发,而不是DragEnter只触发一次。

private void arbol_DragOver(object sender, DragEventArgs e)
    {
        if (some_reason)
            e.Effect = DragDropEffects.None;
        else
            e.Effect = DragDropEffects.All;
    }

如果你没有使用这个事件或者没有在里面修改e.Effect,那就很难说了。

mf98qq94

mf98qq944#

如果您希望应用程序接受您在帐户中所做的更改,则应将Handled属性设置为true:

private void OnDragOver(object sender, DragEventArgs e)
{
    if (your_test) 
        e.Effects = DragDropEffects.Link;//or other effect you want
    else
       e.Effects = DragDropEffects.None;

    e.Handled = true;
}

相关问题