ItemSelected 事件在 DragDropManager 拦截任何事件之前触发,因此无法知道您即将完成的操作是拖放操作。因此这里不能使用 ItemSelected。
但是,一切都没有丢失。 ItemClick 事件仅在 MouseUp 上触发,因此在 DragDrop 操作期间不会触发。 DragDropManager 可以方便地处理该事件,因此当您松开鼠标按钮时它不会在 Drop 时触发。
因此,在 ItemClick 事件中执行您的 ItemSelected 行为(它与 ItemSelected 具有相同的事件签名,因此您可以重命名它以保持语义正确)。
XAML
<MyTreeView ItemClick="MyTreeView_OnItemClick" />
代码隐藏
public class CodeBehind {
public CodeBehind() {
var handleDroppedEvents = true;
DragDropManager.AddDropHandler(MyTreeView, MyTreeView_OnDropCompleted, handleDroppedEvents);
DragDropManager.AddDragDropCompletedHandler(MyTreeView, MyTreeView_OnDragDropCompleted, handleDroppedEvents);
}
private void MyTreeView_OnItemClick(object sender, RadRoutedEventArgs e) {
var tree = (RadTreeView) sender;
....
}
private void MyTreeView_OnDropCompleted(object sender, DragEventArgs e) {
/* If you want to suppress the default drop behaviour
* e.g. moving items around your tree */
var options =
DragDropPayloadManager.GetDataFromObject(e.Data, TreeViewDragDropOptions.Key) as TreeViewDragDropOptions;
if (options == null)
return;
/* Tell Telerik not to do its default thing */
options.DropAction = DropAction.None;
}
private void MyTreeView_OnDragDropCompleted(object sender DragDropCompletedEventArgs e) {
....
}
}
现在,您的 ItemSelected 进程将向用户显示为在选择时触发,但如果您拖动,选择将被拦截并替换为拖放功能。