Skip to content

Перетаскивание узлов

Контролы TreeList и TreeView поддерживают функциональность перетаскивания узлов внутри контролов и во внешние контролы. Функция перетаскивания реализована в базовом классе TreeList и TreeView, TreeListControlBase. Этот класс предоставляет API для включения и обработки операций перетаскивания узлов.

treelist-nodedragdrop

Включить перетаскивание узлов

Установите для свойства TreeListControlBase.AllowDragDrop значение true, чтобы включить перетаскивание узлов. В этом случае пользователь может перетащить узел в контрол TreeList/TreeView и за пределы контрола. Операция перетаскивания перемещает узел в другую позицию, а также изменяет позицию соответствующего бизнес-объекта в источнике данных.

Если узел перетаскивается во внешний контрол, дефолтное поведение контрола TreeList/TreeView заключается в удалении узла из текущего контрола и удалении соответствующего бизнес-объекта из источника данных контрола. Смотрите Перетаскивание узлов между контролами для получения информации о том, как предотвратить удаление узлов и бизнес-объектов.

Перетаскивание нескольких узлов поддерживается, если вы включили выбор нескольких узлов с помощью свойства DataControlBase.SelectionMode (см. Узлы - Выбор нескольких узлов (выделение) ).

Контролы TreeList и TreeView не поддерживают операции автоматического копирования при перетаскивании. Нажатие клавиши CTRL не действует.

Перетаскивание отсортированных данных

Узлы TreeList и TreeView могут быть отсортированы . По умолчанию операции перетаскивания узлов в отсортированном TreeList и контролах TreeView отключены. Установите для свойства TreeListControlBase.AllowDragDropSortedNodes значение true, чтобы разрешить операции перетаскивания внутри отсортированных контролов.

Если данные отсортированы и узел перетаскивается в позицию до или после другого узла, контрол автоматически обновляет значения перетаскиваемого узла в отсортированном столбце, чтобы сохранить текущий порядок сортировки. Значениям перетаскиваемого узла в отсортированных столбцах присваиваются соответствующие значения целевого узла.

Обработка операций перетаскивания с событиями

Контролы TreeList и TreeView содержат события, которые помогают управлять операциями перетаскивания узлов и реагировать на них.

Начните с перетаскивания

Событие TreeListControlBase.StartDrag срабатывает при запуске операции перетаскивания. Используйте следующие параметры события, чтобы получить информацию о текущей операции перетаскивания.

  • e.Data — Указывает объект Avalonia.Input.IDataObject, содержащий данные текущей операции перетаскивания.
  • e.DragElement — Перетаскиваемый визуальный элемент.
  • e.Effects — Определяет эффект перетаскивания. Установите для этого параметра значение DragDropEffects.None, чтобы отменить текущую операцию перетаскивания. Эффект перетаскивания также определяет значок указателя мыши.
  • e.Nodes — массив объектов TreeListNode, которые необходимо перетащить. Этот массив содержит один объект, если перетаскивается только один узел.

Пример - Предотвращение запуска операции перетаскивания для определенных узлов

Следующий обработчик событий StartDrag отключает операции перетаскивания для узлов, содержащих дочерние элементы.

private void TreeList_StartDrag(object sender, TreeListStartDragEventArgs e)
{
    if(e.Nodes[0].HasChildren)
        e.Effects = Avalonia.Input.DragDropEffects.None;
}

Обработка этапа перетаскивания при перетаскивании

Событие TreeListControlBase.DragOver вызывается повторно, когда пользователь перетаскивает узел(ы) поверх другого узла. Аргументы события позволяют идентифицировать информацию, относящуюся к текущей операции перетаскивания:

  • e.DragNodes — Перетаскивается массив "узлов" TreeList (TreeListNode). Этот массив содержит один объект, если перетаскивается только один узел.
  • e.TargetNode — Узел TreeList, по которому перетаскивается узел(узлы).
  • e.DropPosition — Определяет потенциальную позицию сброса относительно целевого узла. Доступные опции включают:

    • DropPosition.Before — Перетаскиваемые узлы, если они удалены, будут добавлены на том же уровне иерархии, что и целевой узел.
    • DropPosition.After — Перетаскиваемые узлы, если они удалены, будут добавлены на том же уровне иерархии, что и целевой узел.
    • DropPosition.Inside — Перетаскиваемые узлы, если они удалены, будут добавлены как дочерние по отношению к целевому узлу.
  • e.KeyModifiers — Указывает, будет ли нажата клавиша ALT, SHIFT и/или CTRL во время события DragOver.

  • e.Data — Указывает объект Avalonia.Input.IDataObject, содержащий данные текущей операции перетаскивания.
  • e.Effects — Определяет эффект перетаскивания. Установите для этого параметра значение DragDropEffects.None, чтобы отменить текущую операцию перетаскивания. Эффект перетаскивания также определяет значок указателя мыши.

Пример - Предотвращение удаления узлов на корневом уровне

Следующий обработчик событий DragOver предотвращает удаление узлов рядом с корневыми узлами. Код по-прежнему позволяет удалять узлы как дочерние для корневых узлов.

private void TreeList_DragOver(object sender, TreeListDragEventArgs e)
{
    if(e.TargetNode?.Level == 0 && (e.DropPosition==DropPosition.Before || e.DropPosition == DropPosition.After)) 
        e.Effects = Avalonia.Input.DragDropEffects.None;
}

Завершить перетаскивание

Доступны два события, которые помогут вам управлять этапом перетаскивания при выполнении операции перетаскивания:

  • TreeListControlBase.Drop — Срабатывает, когда узел собирается быть удаленным поверх другого узла TreeList. Аргументы события совпадают с аргументами события TreeListControlBase.DragOver.

    Чтобы отменить операцию удаления в определенных случаях, обработайте событие Drop и установите для его параметра e.Handled значение true.

    Если узел удален за пределы текущего контрола TreeList/TreeView, событие Drop для этого контрола не срабатывает. Смотрите описание события TreeListControlBase.CompleteDragDrop ниже для получения дополнительной информации.

Пример — Изменение значений удаленного узла

The following `Drop` event handler changes a value of a dragged node(s) when it is dropped. It is assumed that the data source contains the _"Assignee"_ field. The code below sets the dropped node's _"Assignee"_ field to the target node's _"Assignee"_ field value.

``` cs
private void TreeList_Drop(object sender, TreeListDragEventArgs e)
{
    if (e.DropPosition != DropPosition.Inside)
        return;
    TreeListControl treeList = e.Source as TreeListControl;
    string newAssignee = treeList.GetCellValue(e.TargetNode, "Assignee").ToString();
    foreach (TreeListNode node in e.DragNodes)
    {
        treeList.SetCellValue(node, "Assignee", newAssignee);
    }
}
```
  • TreeListControlBase.CompleteDragDrop — Срабатывает после завершения операции перетаскивания в пределах текущего контрола или за пределами текущего контрола.

    Событие TreeListControlBase.CompleteDragDrop срабатывает после события TreeListControlBase.Drop.

    Для события TreeListControlBase.CompleteDragDrop доступны следующие аргументы:

    • e.DragNodes — массив "узлов" TreeList (TreeListNode), которые были удалены.
    • e.Effects — Возвращает эффект перетаскивания, который был установлен в обработчике событий Drop контрола, на который был удален узел.

    Смотрите также: Перетаскивание узла между контролами

Опции перетаскивания

Контролы TreeList/TreeView предоставляют следующие опции для настройки операций перетаскивания узлов:

  • TreeListControlBase.AutoExpandOnDrag — Возвращает или задает, будут ли свернутые узлы автоматически разворачиваться при наведении курсора мыши во время операции перетаскивания.
  • TreeListControlBase.AutoExpandDelayOnDrag — Возвращает или устанавливает задержку перед тем, как свернутые узлы будут автоматически развернуты при наведении на них курсора мыши во время операции перетаскивания.
  • TreeListControlBase.AllowScrollingOnDrag — Получает или устанавливает, будет ли TreeList/TreeView автоматически прокручивать узлы при перетаскивании узла по верхнему или нижнему краю контрола.

Перетаскивание узлов между контролами

Перетаскивание узлов (строк) автоматически поддерживается между контролами TreeListControl, TreeViewControl и DataGridControl. Используйте опцию AllowDragDrop, предоставляемую этими контролами, чтобы включить для них функцию перетаскивания.

Визуальная индикация перетаскивания

При перетаскивании узла (строки) контролы TreeListControl, TreeViewControl и DataGridControl визуально указывают потенциальную позицию удаления.

treelist-nodedragdrop-visualposition

Автоматическое перемещение узла (строки) и его элемента из исходного в целевой контрол

TreeListControl, TreeViewControl и DataGridControl поддерживают автоматическое перемещение перетаскиваемого узла (строки) между этими контролами во время операции перетаскивания: новый узел (строка), содержащий перетаскиваемые данные, добавляется к целевому контролу, а перетаскиваемый узел (строка) затем удаляется из исходного контрола. Соответствующий элемент (бизнес-объект) также передается между источниками объектов исходного и целевого контролов.

Автоматическое перемещение узла (строки) и соответствующего элемента происходит, если тип данных элементов в исходном контроле совпадает или совместим с типом данных элементов в целевом контроле. Смотрите метод Type.IsAssignableFrom, используемый для проверки совместимости типов данных.

Чтобы предотвратить удаление узла (строки) и элемента в исходном контроле во время операции перетаскивания во внешние контролы, вы можете выполнить одно из следующих действий:

  • Обработайте событие Drop целевого контрола и установите для его параметра события e.Effects значение Avalonia.Input.DragDropEffects.None.

  • Обработайте событие TreeListControlBase.CompleteDragDrop в контроле источника и установите для параметра события e.Handled значение true.

    private void TreeList_CompleteDragDrop(object sender, TreeListCompleteDragDropEventArgs e)
    {
        e.Handled = true;
    }
    

Перетаскивание на другие контролы

Контролы TreeListControl, TreeViewControl и DataGridControl не поддерживают автоматическое перетаскивание строк/узлов в другие контролы (например, стандартный Avalonia DataGrid). Чтобы разрешить перетаскивание узлов/строк в эти контролы, включите для них функцию перетаскивания, используя Avalonia.Input.DragDrop.AllowDrop attached-свойство. Обработайте прикрепленное событие Avalonia.Input.DragDrop.Drop целевого контрола, чтобы принять перетаскиваемые узлы (строки). При обработке события DragDrop.Drop вы можете получить доступ к перетаскиваемым узлам (строкам) из параметра события Data.



* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.