C# 如何以编程方式取消在WPF应用程序外部开始的拖动操作?
我有一个TreeView,它的AllowDrop属性设置为false,但在上面拖动文件时仍然显示复制光标。我已经读过QueryContinueDrag事件,但它似乎只有在拖动对象/窗体/任何对象上已经存在的东西时才会触发。我想取消拖动操作,即当用户从应用程序外部(桌面、电子邮件附件等)获取文件并将其放入树视图时,将光标返回到正常状态并放置文件。我有什么办法可以做到这一点吗?据我所知,QueryContinueDrag是唯一一个带有Arg的事件,它允许我将dragaAction设置为“cancel”,并且在引入外部文件时不会触发。我也在考虑强制按“esc”键或鼠标右键,但我不想使用PIvoke。@elgonzo是正确的,取消未启动的拖放操作不是您的责任。如果试图删除数据,您只需要关心是否打算允许删除数据。听上去,你没有,所以他们无法删除数据 如果您确实关心光标,则可以使用以下方法从事件的多个事件处理程序中更改光标,例如C# 如何以编程方式取消在WPF应用程序外部开始的拖动操作?,c#,wpf,treeview,drag,C#,Wpf,Treeview,Drag,我有一个TreeView,它的AllowDrop属性设置为false,但在上面拖动文件时仍然显示复制光标。我已经读过QueryContinueDrag事件,但它似乎只有在拖动对象/窗体/任何对象上已经存在的东西时才会触发。我想取消拖动操作,即当用户从应用程序外部(桌面、电子邮件附件等)获取文件并将其放入树视图时,将光标返回到正常状态并放置文件。我有什么办法可以做到这一点吗?据我所知,QueryContinueDrag是唯一一个带有Arg的事件,它允许我将dragaAction设置为“cancel
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操作,我会有多生气?