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