Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:DoDragDrop在单击鼠标右键/中键时被中断_C#_Wpf_Drag And Drop_Devexpress_Mousemove - Fatal编程技术网

C# WPF:DoDragDrop在单击鼠标右键/中键时被中断

C# WPF:DoDragDrop在单击鼠标右键/中键时被中断,c#,wpf,drag-and-drop,devexpress,mousemove,C#,Wpf,Drag And Drop,Devexpress,Mousemove,我扩展了画布{System.Windows.Controls}和可拖动到画布中的项。 在拖动过程中,我有一个OnDragOver事件,当用户单击并按住鼠标中键时,我进行平移 在项目站点上:DoDragDrop-常用拖动功能 在画布上站点:OnDragOver-平移画布 所以用户可以同时拖动和平移 在我搬到新的笔记本电脑(联想)和VisualStudio2012(2010年之前)之前,一切都很好。现在,当我按下鼠标中键(或右键)时,画布的mouseMove事件立即被触发。之后,拖动会立即停止,也不

我扩展了画布{System.Windows.Controls}和可拖动到画布中的项。 在拖动过程中,我有一个OnDragOver事件,当用户单击并按住鼠标中键时,我进行平移

项目站点上:
DoDragDrop
-常用拖动功能
画布上站点:
OnDragOver
-平移画布

所以用户可以同时拖动和平移

在我搬到新的笔记本电脑(联想)和VisualStudio2012(2010年之前)之前,一切都很好。现在,当我按下鼠标中键(或右键)时,画布的mouseMove事件立即被触发。之后,拖动会立即停止,也不会平移

我的同事尝试从VisualStudio2010运行相同的代码,但效果良好。他对他的版本进行了设置,所以我尝试了一下,结果是一样的——在我的笔记本电脑上,我无法在拖动过程中平移

有人知道问题出在哪里吗?硬件、软件、联想、Windows

项目信息:WPF、DevXpress 12.1、.NET 4、Windows 7专业版,与2012年相比


请记住,我在WPF方面还是新手:)

只是为了回答我自己的问题,也许这对某些人会有用

我没有发现问题出在哪里,但我的结论是,在某些PC上,当用户在拖动时按下鼠标中键/右键时,拖动可能会中断

要覆盖此行为,需要将添加到DragDrop。然后在您自己的处理程序中,使用您的逻辑对鼠标/键盘输入做出响应

因此,我的代码如下所示:

DragDrop.AddQueryContinueDragHandler(this, QueryContinueDragHandler);
DragDrop.DoDragDrop(this, dataObject, DragDropEffects.Copy);
DragDrop.RemoveQueryContinueDragHandler(this, QueryContinueDragHandler);
和自定义处理程序:

/// <summary>
/// Own handler. This event is raised when something happens during DragDrop operation (user presses Mouse button or Keyboard button...)
/// Necessary to avoid canceling DragDrop on MouseMiddleButon on certain PCs.
/// Overrides default handler, that interrupts DragDrop on MouseMiddleButon or MouseRightButton down.
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void QueryContinueDragHandler(Object source, QueryContinueDragEventArgs e)
{
    e.Handled = true;

        // if ESC
        if (e.EscapePressed)
        {
            //  -->  cancel DragDrop
            e.Action = DragAction.Cancel;

            return;
        }

        // if LB
        if (e.KeyStates.HasFlag(DragDropKeyStates.LeftMouseButton))
        {
            //  -->  continue dragging
            e.Action = DragAction.Continue;
        }
        // if !LB (user released LeftMouseButton)
        else
        {
            // and if mouse is inside canvas
            if (_isMouseOverCanvas)
            {
                //  -->  execute Drop
                e.Action = DragAction.Drop;
            }
            else
            {
                //  -->  cancel Drop 
                e.Action = DragAction.Cancel;                    
            }

            return;
        }

        // if MB
        if (e.KeyStates.HasFlag(DragDropKeyStates.MiddleMouseButton))
        {
            //  -->  continue dragging
            e.Action = DragAction.Continue;
        }    
}
//
///自己的处理程序。当DragDrop操作期间发生某些事件(用户按下鼠标按钮或键盘按钮…)时,将引发此事件
///必须避免在某些电脑上取消鼠标上的拖动按钮。
///重写默认处理程序,该处理程序中断MouseMidleButon或MouseRightButton down上的DragDrop。
/// 
/// 
/// 
私有void QueryContinueDragHandler(对象源,QueryContinueDragEventArgs e)
{
e、 已处理=正确;
//如果ESC
如果(例如,释放压力)
{
//-->取消拖动
e、 动作=拖动动作。取消;
返回;
}
//如果磅
if(例如KeyStates.HasFlag(DragDropKeyStates.LeftMouseButton))
{
//-->继续拖动
e、 动作=拖动动作。继续;
}
//if!LB(用户释放的LeftMouseButton)
其他的
{
//若鼠标在画布内
如果(_ismouseoverinvas)
{
//-->执行删除
e、 动作=牵引。下降;
}
其他的
{
//-->取消投递
e、 动作=拖动动作。取消;
}
返回;
}
//如果MB
if(例如KeyStates.HasFlag(DragDropKeyStates.MiddleMouseButton))
{
//-->继续拖动
e、 动作=拖动动作。继续;
}    
}

你确定是.NET 4而不是.NET 4.5吗?我确定。我甚至试着在.NET4.5上运行它,结果也是一样的after
DragDrop.AddQueryContinueDragHandler(这是QueryContinueDragHandler)
不会删除处理程序,因为方法名被转换为委托对象两次,并且这些委托不相等。谢谢你,Gman,我还没有意识到这一点。所以解决方案是创建本地委托并将其作为参数传递给这两个方法,对吗?是的,没错。(类似这样的内容:
QueryContinueDragEventHandler d=QueryContinueDragHandler;