代码之家  ›  专栏  ›  技术社区  ›  Trainee4Life

即使设置了effects=dragDropEffects.none,为什么允许删除?

  •  22
  • Trainee4Life  · 技术社区  · 16 年前

    从“源”拖动到“目标”。当源使用allowedeffects作为dragDropeffects.copy调用doDragDrop()时,我可以通过在目标(在dragover事件中)设置effects=dragDropeffects.none来取消删除。

    但当我将allowedeffects设置为dragDropeffects.move时,同样的情况也失败了。

    要重现这种情况,请从 http://jaimersamples.members.winisp.net/samples/dragdrop/drag.zip

    换行…(到dragDropEffects.move)

    DragDrop.DoDragDrop(this.DragSource, data, DragDropEffects.Copy);
    

    添加行..

    void Window1_DragOver(object sender, DragEventArgs args)
    {
       args.Effects = DragDropEffects.None;
    

    并对整个DragSource提供反馈意见。

    void DragSource_GiveFeedback(object sender, GiveFeedbackEventArgs e)
    {
        //System.Diagnostics.Debug.WriteLine("DragSource_GiveFeedback " + e.Effects.ToString());
    

    框架中是否存在某种缺陷,或者我只是看不到明显的东西?

    2 回复  |  直到 10 年前
        1
  •  56
  •   Aaronaught    16 年前

    在重新检查了您的注释和代码之后,我花了一些精力理解并重现了您所讨论的问题。

    您缺少的是行:

    e.Handled = true;
    

    在你的 Window1_DragOver 事件。加上这一点,两种方法的效果都一样 DragDropEffects.Move DragDropEffects.Copy .

    为什么有效 拖动效果。复制 不设 e.Handled 首先是任何人的猜测。未记录的情况会导致未记录的行为。

    我强烈建议您下次发布包含 最小可能代码 再现问题。我为最初的困惑道歉,但是很难弄清楚这件事到底发生了什么。

        2
  •  1
  •   Luke Machowski    16 年前

    我认为这个问题已经得到了很好的回答,但我只是认为这是一个宝贵的教训,我在做拖放时学到了…

    传递给DoDragDrop方法的初始DragDropEffect应被视为对应执行的操作的建议(或期望)。如果我没记错的话,这个方法会返回当拖放操作实际成功(而不是取消)时目标执行的实际效果。

    这在源和目标之间创建了一个简单的通信协议,主要用于存在多个可能的拖动目标的情况。它可以让你区分实际发生的事情。考虑到这一点特别有用,因为您可能正在与一个甚至不知道或不期望的组件进行交互。如果考虑到这一点,您有时会获得意想不到的好处,因为拖拽变得更有用,这是最初计划的,因为突然间其他组件可以在没有任何其他显式编码的情况下进行互操作。

    如果这样说的话,我想.NET框架在默认情况下应该以不同的方式处理复制和移动操作,因为一个操作是建设性的,另一个操作是破坏性的。我认为他们试图避免不必要的破坏性行动发生而没有得到明确的处理。不确定,只是一个想法:)