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

Включить перетаскивание узлов¶
Установите для свойства 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 визуально указывают потенциальную позицию удаления.

Автоматическое перемещение узла (строки) и его элемента из исходного в целевой контрол¶
TreeListControl, TreeViewControl и DataGridControl поддерживают автоматическое перемещение перетаскиваемого узла (строки) между этими контролами во время операции перетаскивания: новый узел (строка), содержащий перетаскиваемые данные, добавляется к целевому контролу, а перетаскиваемый узел (строка) затем удаляется из исходного контрола. Соответствующий элемент (бизнес-объект) также передается между источниками объектов исходного и целевого контролов.
Автоматическое перемещение узла (строки) и соответствующего элемента происходит, если тип данных элементов в исходном контроле совпадает или совместим с типом данных элементов в целевом контроле. Смотрите метод Type.IsAssignableFrom, используемый для проверки совместимости типов данных.
Чтобы предотвратить удаление узла (строки) и элемента в исходном контроле во время операции перетаскивания во внешние контролы, вы можете выполнить одно из следующих действий:
- 
Обработайте событие Dropцелевого контрола и установите для его параметра событияe.EffectsзначениеAvalonia.Input.DragDropEffects.None.
- 
Обработайте событие TreeListControlBase.CompleteDragDropв контроле источника и установите для параметра событияe.Handledзначениеtrue.
Перетаскивание на другие контролы¶
Контролы TreeListControl, TreeViewControl и DataGridControl не поддерживают автоматическое перетаскивание строк/узлов в другие контролы (например, стандартный Avalonia DataGrid). Чтобы разрешить перетаскивание узлов/строк в эти контролы, включите для них функцию перетаскивания, используя Avalonia.Input.DragDrop.AllowDrop attached-свойство. Обработайте прикрепленное событие Avalonia.Input.DragDrop.Drop целевого контрола, чтобы принять перетаскиваемые узлы (строки). При обработке события DragDrop.Drop вы можете получить доступ к перетаскиваемым узлам (строкам) из параметра события Data.
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.