Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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应用程序外部开始的拖动操作?_C#_Wpf_Treeview_Drag - Fatal编程技术网

C# 如何以编程方式取消在WPF应用程序外部开始的拖动操作?

C# 如何以编程方式取消在WPF应用程序外部开始的拖动操作?,c#,wpf,treeview,drag,C#,Wpf,Treeview,Drag,我有一个TreeView,它的AllowDrop属性设置为false,但在上面拖动文件时仍然显示复制光标。我已经读过QueryContinueDrag事件,但它似乎只有在拖动对象/窗体/任何对象上已经存在的东西时才会触发。我想取消拖动操作,即当用户从应用程序外部(桌面、电子邮件附件等)获取文件并将其放入树视图时,将光标返回到正常状态并放置文件。我有什么办法可以做到这一点吗?据我所知,QueryContinueDrag是唯一一个带有Arg的事件,它允许我将dragaAction设置为“cancel

我有一个TreeView,它的AllowDrop属性设置为false,但在上面拖动文件时仍然显示复制光标。我已经读过QueryContinueDrag事件,但它似乎只有在拖动对象/窗体/任何对象上已经存在的东西时才会触发。我想取消拖动操作,即当用户从应用程序外部(桌面、电子邮件附件等)获取文件并将其放入树视图时,将光标返回到正常状态并放置文件。我有什么办法可以做到这一点吗?据我所知,QueryContinueDrag是唯一一个带有Arg的事件,它允许我将dragaAction设置为“cancel”,并且在引入外部文件时不会触发。我也在考虑强制按“esc”键或鼠标右键,但我不想使用PIvoke。

@elgonzo是正确的,取消未启动的拖放操作不是您的责任。如果试图删除数据,您只需要关心是否打算允许删除数据。听上去,你没有,所以他们无法删除数据

如果您确实关心光标,则可以使用以下方法从事件的多个事件处理程序中更改光标,例如
PrevieMouseMove
PreviewDragOver

Mouse.SetCursor(Cursors.No);
不过,为了便于参考,您可以将
DragEventArgs.Effects
属性设置为
DragDropEffects.None
,该属性将自动为您设置光标。从MSDN上的页面:

默认情况下,此属性中指定的效果决定拖放操作目标的鼠标光标。这有助于向用户提供有关删除相应对象时将发生的操作的反馈

您可以通过以下任一事件访问
DragEventArgs
对象:

PreviewDragOver
DragOver
PreviewDrop
Drop
PreviewDragEnter
DragEnter
PreviewDragOver
DragLeave

因此,您所需要做的就是通过在这些处理程序中将
DragEventArgs.Effects
属性设置为
DragDropEffects.None
来显示无法删除数据。我推荐一种连续的方法,如
PrevieMouseMove
PreviewDragOver

你可以写:

if (condition) {
      `e.Handled = true;
       ((Thumb)e.OriginalSource).CancelDrag();
       return;
}

如果我想将某个东西从屏幕的左侧拖放到屏幕的右侧,然后将鼠标移到应用程序的窗口上(你的应用程序恰好挡住了我的去路……),该怎么办。我想继续拖动(从而再次离开您的窗口),直到我到达屏幕右侧的目的地。你有没有想过,如果你的应用程序开始处理一个不应该关心的d'n'd操作,我会有多生气?