【问题标题】:WPF & Telerik RadTreeView: How do I intercept the ItemSelected event on drag?WPF 和 Telerik RadTreeView:如何在拖动时拦截 ItemSelected 事件?
【发布时间】:2017-11-28 15:56:22
【问题描述】:

我有一个 Telerik RadTreeView。

我正在使用 ItemSelected 事件打开所选项目的详细视图。

我正在使用拖放功能按照您的预期重新排列树中项目的层次结构。没什么特别的。

问题在于,当我单击以拖动树中的项目时,它会打开该项目的详细信息视图,因为触发了 ItemSelected 事件。是否有一点我可以告诉在 ItemSelected 事件被触发之前正在拖动一个项目,以便我可以取消或拦截 ItemSelected 事件并阻止显示详细视图?

【问题讨论】:

    标签: wpf drag-and-drop telerik


    【解决方案1】:

    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 进程将向用户显示为在选择时触发,但如果您拖动,选择将被拦截并替换为拖放功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-27
      • 2014-08-14
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多