Перетаскивание узлов¶
Контролы 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— Указывает объектDragDropData, содержащий данные текущей операции перетаскивания.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— Указывает объектDragDropData, содержащий данные текущей операции перетаскивания.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.
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.