Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Windows.ApplicationModel.DataTransfer;
- using Windows.UI.Xaml;
- using Windows.UI.Xaml.Controls;
- namespace ClientSoft.UI.Controls.TreeView
- {
- public sealed class TreeView : ListView
- {
- #region Fields
- private TreeViewCollection _collection;
- #endregion
- public TreeView()
- {
- IsItemClickEnabled = true;
- ItemClick += TreeView_ItemClick;
- DragItemsStarting += TreeView_DragItemsStarting;
- DragItemsCompleted += TreeView_DragItemsCompleted;
- CanDragItems = true;
- CanReorderItems = true;
- AllowDrop = true;
- }
- #region Properties
- /// <summary>
- /// Buffer for dragged TreeViewItem.
- /// </summary>
- internal TreeViewItem DraggedItem { get; set; }
- /// <summary>
- /// Items collection.
- /// </summary>
- internal TreeViewCollection Collection =>
- _collection ?? (_collection = (TreeViewCollection)ItemsSource);
- #endregion
- private void TreeView_ItemClick(object sender, ItemClickEventArgs e)
- {
- var targetNode = (TreeNode)e.ClickedItem;
- if (targetNode.IsRootNode)
- {
- if (targetNode.IsExpanded)
- {
- targetNode.Collapse();
- }
- else
- {
- targetNode.Expand();
- }
- }
- }
- private void TreeView_DragItemsCompleted(ListViewBase sender, DragItemsCompletedEventArgs args)
- {
- DraggedItem = null;
- }
- private void TreeView_DragItemsStarting(object sender, DragItemsStartingEventArgs e)
- {
- DraggedItem = (TreeViewItem)ContainerFromItem(e.Items[0]);
- }
- #region Overridden methods
- protected override DependencyObject GetContainerForItemOverride() => new TreeViewItem();
- protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
- {
- ((UIElement)element).AllowDrop = ((TreeNode)item).IsRootNode;
- base.PrepareContainerForItemOverride(element, item);
- }
- protected override void OnDrop(DragEventArgs e)
- {
- if (e.AcceptedOperation == DataPackageOperation.Move)
- {
- MoveItem(e);
- }
- base.OnDrop(e);
- }
- #endregion
- #region Private methods
- private void MoveItem(DragEventArgs e)
- {
- var position = e.GetPosition(ItemsPanelRoot);
- if (ItemsPanelRoot is IInsertionPanel panel)
- {
- panel.GetInsertionIndexes(position, out var aboveIndex, out var belowIndex);
- var targetNode = (TreeNode)ItemFromContainer(DraggedItem);
- if (aboveIndex >= 0 && belowIndex >= 0 && belowIndex != Collection.Count)
- {
- var aboveNode = Collection[aboveIndex];
- var belowNode = Collection[belowIndex];
- RemoveNode(targetNode);
- if (belowNode.RootNode == aboveNode)
- {
- aboveNode.Insert(0, targetNode);
- }
- else
- {
- if (aboveNode.RootNode == null)
- {
- var insertionIndex = aboveIndex - Collection.IndexOf(aboveNode.RootNode);
- Collection.AddNodeToView(insertionIndex, targetNode);
- Collection.AddNodeDescadentsToView(targetNode, insertionIndex, 0);
- }
- else
- {
- aboveNode.RootNode.Insert(aboveIndex, targetNode);
- }
- }
- }
- else if (aboveIndex >= 0 && (belowIndex == -1 || belowIndex == Collection.Count))
- {
- RemoveNode(targetNode);
- var insertionIndex = Collection.Count;
- Collection.AddNodeToView(insertionIndex, targetNode);
- Collection.AddNodeDescadentsToView(targetNode, insertionIndex, 0);
- }
- else if (aboveIndex == -1 && belowIndex >= 0)
- {
- RemoveNode(targetNode);
- Collection.AddNodeToView(0, targetNode);
- }
- }
- e.Handled = true;
- }
- private void RemoveNode(TreeNode targetNode)
- {
- if (targetNode.RootNode != null)
- {
- targetNode.RootNode.Remove(targetNode);
- }
- else
- {
- Collection.RemoveNodeAndDescadentsFromView(targetNode);
- }
- }
- #endregion
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment