События DragEnter и DragOver UWP TreeView не выполняются.

Очень важно, чтобы я мог отслеживать, какой элемент перетаскивается в UWP TreeView и на какой элемент он перетаскивается. На данный момент я могу получить только перетаскиваемый предмет. Но я не могу определить, над каким элементом он перетаскивается или над каким элементом он падает. Также было бы хорошо знать в качестве предварительного просмотра, какой элемент перетаскивается, чтобы я мог выполнять больше действий (например, отменить удаление определенных элементов).

Вот мой расширенный контроль:

    public class MyTreeView : TreeView
{
    public MyTreeView()
    {
        this.DragItemsStarting += MyTreeView_DragItemsStarting; //execute ok
        this.DragItemsCompleted += MyTreeView_DragItemsCompleted; //execute ok

        this.DragEnter += MyTreeView_DragEnter; //does not execute?
        this.Drop += MyTreeView_Drop; //does not execute?
        this.DragOver += MyTreeView_DragOver; //does not execute?
    }

    //...
}

В xaml:

<localdata:MyTreeView 
            x:Name="treeview" Grid.Row="2" ItemsSource="{Binding storageFolders,Mode=OneWay}" 
            Style="{StaticResource TreeViewStyle1}"
            ItemTemplateSelector="{StaticResource ExplorerItemTemplateSelector}"
            SelectedItem="{Binding fileObject}"
            SelectedIndex="{Binding IndexObj, Mode=TwoWay}"
            >             
        </localdata:MyTreeView>

person VladacusB    schedule 03.06.2019    source источник
comment
Обратите внимание: исходный и целевой элементы находятся в одном и том же TreeView.   -  person VladacusB    schedule 03.06.2019
comment
Это по замыслу, DragOver будет вызываться, когда другой элемент TreeView поверх текущего TreeView.   -  person Nico Zhu - MSFT    schedule 05.06.2019
comment
@ NicoZhu-MSFT Как я могу реализовать DragOver и другие события перетаскивания, когда исходные и целевые элементы находятся в одном и том же TreeView?   -  person VladacusB    schedule 05.06.2019
comment
Если вам нужно реализовать DragOver и DragEnter в одном и том же TreeView, обработайте события DragOver и DragEnter внутри TreeViewItem вместо TreeView.   -  person Amy Peng - MSFT    schedule 25.06.2019
comment
@ AmyPeng-MSFT Не могли бы вы указать мне код или примеры, как я могу это сделать?   -  person VladacusB    schedule 01.07.2019


Ответы (1)


По задумке DragOver будет вызываться, когда другой TreeView элемент наведен на текущий TreeView. Если вы хотите реализовать функцию cancel, вы можете судить, является ли текущий TreeViewNode правильным для DragItems в обработчике событий DragItemsCompleted, как показано ниже.

private void ListControl_DragItemsCompleted(ListViewBase sender, DragItemsCompletedEventArgs args)
{
    foreach (var item in args.Items)
    {

        var node = TreeDataBound.NodeFromContainer(TreeDataBound.ContainerFromItem(item));          
        var parent = node.Parent;

      //do some stuff judge the parent.
    }
} 
person Nico Zhu - MSFT    schedule 05.06.2019
comment
Пытался получить родительский узел, но он возвращает null при преобразовании элемента как TreeViewNode (элемент как TreeViewNode == null)? - person VladacusB; 07.06.2019
comment
Странно, не могли бы вы поделиться для нас простым проектом? - person Nico Zhu - MSFT; 12.06.2019
comment
Здесь github.com/vladabuba/UWPTree1.git Здесь переопределено событие в расширенном элементе управления TreeView, но то же самое здесь, или если я делаю это в коде окна позади. - person VladacusB; 12.06.2019
comment
zhu -MSFT Я знаю, какой TreeViewItem перетаскивается и на какой TreeViewItem он перетаскивается. У меня вопрос - как я могу отменить дроп? Есть ли свойство или метод в TreeView или в аргументах для отмены операции перетаскивания для текущего перетаскивания? - person VladacusB; 04.07.2019
comment
При DragStarting используйте временный объект для записи текущего источника элементов дерева. Затем проверьте правильность родителя вашего элемента перетаскивания в обработчике события завершения перетаскивания. в противном случае вы можете откатить источник элементов с помощью временного объекта. - person Nico Zhu - MSFT; 04.07.2019
comment
Итак, вы говорите, что мне нужно сделать это непосредственно в элементе управления TreeView и элементе управления TreeViewItem? Есть ли способ сделать это в MVVM? - person VladacusB; 04.07.2019
comment
Вам нужно обработать указанное выше в элементе управления TreeView, конечно, вы можете использовать xaml поведение nuget для привязки событий DragStarting и DragComplted в режиме просмотра. - person Nico Zhu - MSFT; 04.07.2019