Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.96 KB | None | 0 0
  1.  
  2. using Windows.ApplicationModel.DataTransfer;
  3. using Windows.UI.Xaml;
  4. using Windows.UI.Xaml.Controls;
  5.  
  6. namespace ClientSoft.UI.Controls.TreeView
  7. {
  8.     public sealed class TreeView : ListView
  9.     {
  10.         #region Fields
  11.         private TreeViewCollection _collection;
  12.         #endregion
  13.  
  14.  
  15.         public TreeView()
  16.         {
  17.             IsItemClickEnabled = true;
  18.             ItemClick += TreeView_ItemClick;
  19.             DragItemsStarting += TreeView_DragItemsStarting;
  20.             DragItemsCompleted += TreeView_DragItemsCompleted;
  21.  
  22.             CanDragItems = true;
  23.             CanReorderItems = true;
  24.             AllowDrop = true;
  25.         }
  26.  
  27.  
  28.         #region Properties
  29.         /// <summary>
  30.         /// Buffer for dragged TreeViewItem.
  31.         /// </summary>
  32.         internal TreeViewItem DraggedItem { get; set; }
  33.  
  34.         /// <summary>
  35.         /// Items collection.
  36.         /// </summary>
  37.         internal TreeViewCollection Collection =>
  38.             _collection ?? (_collection = (TreeViewCollection)ItemsSource);
  39.         #endregion
  40.  
  41.  
  42.         private void TreeView_ItemClick(object sender, ItemClickEventArgs e)
  43.         {
  44.             var targetNode = (TreeNode)e.ClickedItem;
  45.             if (targetNode.IsRootNode)
  46.             {
  47.                 if (targetNode.IsExpanded)
  48.                 {
  49.                     targetNode.Collapse();
  50.                 }
  51.                 else
  52.                 {
  53.                     targetNode.Expand();
  54.                 }
  55.             }
  56.         }
  57.  
  58.         private void TreeView_DragItemsCompleted(ListViewBase sender, DragItemsCompletedEventArgs args)
  59.         {
  60.             DraggedItem = null;
  61.         }
  62.  
  63.         private void TreeView_DragItemsStarting(object sender, DragItemsStartingEventArgs e)
  64.         {
  65.             DraggedItem = (TreeViewItem)ContainerFromItem(e.Items[0]);
  66.         }
  67.  
  68.         #region Overridden methods
  69.         protected override DependencyObject GetContainerForItemOverride() => new TreeViewItem();
  70.  
  71.         protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
  72.         {
  73.             ((UIElement)element).AllowDrop = ((TreeNode)item).IsRootNode;
  74.             base.PrepareContainerForItemOverride(element, item);
  75.         }
  76.  
  77.         protected override void OnDrop(DragEventArgs e)
  78.         {
  79.             if (e.AcceptedOperation == DataPackageOperation.Move)
  80.             {
  81.                 MoveItem(e);
  82.             }
  83.  
  84.             base.OnDrop(e);
  85.         }
  86.         #endregion
  87.  
  88.  
  89.         #region Private methods
  90.         private void MoveItem(DragEventArgs e)
  91.         {
  92.             var position = e.GetPosition(ItemsPanelRoot);
  93.             if (ItemsPanelRoot is IInsertionPanel panel)
  94.             {
  95.                 panel.GetInsertionIndexes(position, out var aboveIndex, out var belowIndex);
  96.                 var targetNode = (TreeNode)ItemFromContainer(DraggedItem);
  97.  
  98.                 if (aboveIndex >= 0 && belowIndex >= 0 && belowIndex != Collection.Count)
  99.                 {
  100.                     var aboveNode = Collection[aboveIndex];
  101.                     var belowNode = Collection[belowIndex];
  102.                     RemoveNode(targetNode);
  103.  
  104.                     if (belowNode.RootNode == aboveNode)
  105.                     {
  106.                         aboveNode.Insert(0, targetNode);
  107.                     }
  108.                     else
  109.                     {
  110.                         if (aboveNode.RootNode == null)
  111.                         {
  112.                             var insertionIndex = aboveIndex - Collection.IndexOf(aboveNode.RootNode);
  113.  
  114.                             Collection.AddNodeToView(insertionIndex, targetNode);
  115.                             Collection.AddNodeDescadentsToView(targetNode, insertionIndex, 0);
  116.                         }
  117.                         else
  118.                         {
  119.                             aboveNode.RootNode.Insert(aboveIndex, targetNode);
  120.                         }
  121.                     }
  122.                 }
  123.                 else if (aboveIndex >= 0 && (belowIndex == -1 || belowIndex == Collection.Count))
  124.                 {
  125.                     RemoveNode(targetNode);
  126.  
  127.                     var insertionIndex = Collection.Count;
  128.                     Collection.AddNodeToView(insertionIndex, targetNode);
  129.                     Collection.AddNodeDescadentsToView(targetNode, insertionIndex, 0);
  130.                 }
  131.                 else if (aboveIndex == -1 && belowIndex >= 0)
  132.                 {
  133.                     RemoveNode(targetNode);
  134.                     Collection.AddNodeToView(0, targetNode);
  135.                 }
  136.             }
  137.  
  138.             e.Handled = true;
  139.         }
  140.  
  141.         private void RemoveNode(TreeNode targetNode)
  142.         {
  143.             if (targetNode.RootNode != null)
  144.             {
  145.                 targetNode.RootNode.Remove(targetNode);
  146.             }
  147.             else
  148.             {
  149.                 Collection.RemoveNodeAndDescadentsFromView(targetNode);
  150.             }
  151.         }
  152.         #endregion
  153.     }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement