TreeView.xaml.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. using System;
  2. using System.Windows;
  3. using System.Windows.Input;
  4. using Common.Logger;
  5. namespace Modules.Tree
  6. {
  7. /// <summary>
  8. /// TreeView.xaml 的交互逻辑
  9. /// </summary>
  10. public partial class TreeView
  11. {
  12. private const double DragThreshold = 5;
  13. private bool isDragging;
  14. private bool isLeftButtonDown;
  15. private Point origMouseDownPoint;
  16. private TreeNodeViewModel moveFromNode;
  17. public AllTreeView AllTreeView { get; set; }
  18. public TreeView()
  19. {
  20. this.InitializeComponent();
  21. }
  22. public TreeViewModel ViewModel
  23. {
  24. get
  25. {
  26. return this.DataContext as TreeViewModel;
  27. }
  28. set
  29. {
  30. this.DataContext = value;
  31. }
  32. }
  33. private void ListBoxItem_MouseDown(object sender, MouseButtonEventArgs e)
  34. {
  35. if (e.ChangedButton != MouseButton.Left)
  36. {
  37. return;
  38. }
  39. // 双击鼠标
  40. if (e.ClickCount == 2 && e.ChangedButton == MouseButton.Left)
  41. {
  42. var item = (FrameworkElement)sender;
  43. var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
  44. if (treeNodeViewModel.IsFolder)
  45. {
  46. this.ViewModel.UnFold(treeNodeViewModel);
  47. }
  48. else
  49. {
  50. this.ViewModel.Fold(treeNodeViewModel);
  51. }
  52. }
  53. e.Handled = true;
  54. }
  55. private void ListBoxItem_MouseUp(object sender, MouseButtonEventArgs e)
  56. {
  57. if (!this.isLeftButtonDown)
  58. {
  59. this.isDragging = false;
  60. return;
  61. }
  62. var item = (FrameworkElement)sender;
  63. var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
  64. if (!this.isDragging)
  65. {
  66. this.listBox.SelectedItem = treeNodeViewModel;
  67. }
  68. this.isLeftButtonDown = false;
  69. this.isDragging = false;
  70. item.ReleaseMouseCapture();
  71. e.Handled = true;
  72. }
  73. private void ListBoxItem_MouseMove(object sender, MouseEventArgs e)
  74. {
  75. var item = (FrameworkElement)sender;
  76. var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
  77. if (treeNodeViewModel == null)
  78. {
  79. return;
  80. }
  81. Point curMouseDownPoint;
  82. Vector dragDelta;
  83. // 拖动根节点,移动整个树
  84. if (this.isDragging && treeNodeViewModel.IsRoot)
  85. {
  86. if (this.moveFromNode == null || !this.moveFromNode.IsRoot)
  87. {
  88. return;
  89. }
  90. curMouseDownPoint = e.GetPosition(this);
  91. dragDelta = curMouseDownPoint - this.origMouseDownPoint;
  92. this.origMouseDownPoint = curMouseDownPoint;
  93. this.ViewModel.MoveToPosition(dragDelta.X, dragDelta.Y);
  94. return;
  95. }
  96. if (e.LeftButton != MouseButtonState.Pressed)
  97. {
  98. this.isDragging = false;
  99. this.moveFromNode = null;
  100. return;
  101. }
  102. curMouseDownPoint = e.GetPosition(this);
  103. dragDelta = curMouseDownPoint - this.origMouseDownPoint;
  104. double dragDistance = Math.Abs(dragDelta.Length);
  105. if (dragDistance > DragThreshold)
  106. {
  107. this.isDragging = true;
  108. }
  109. e.Handled = true;
  110. }
  111. private void ListBoxItem_PreviewMouseLeftButtonDown(object sender, MouseEventArgs e)
  112. {
  113. this.origMouseDownPoint = e.GetPosition(this);
  114. var item = (FrameworkElement)sender;
  115. var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
  116. this.listBox.SelectedItem = treeNodeViewModel;
  117. this.moveFromNode = treeNodeViewModel;
  118. this.AllTreeView.nodeDataEditor.DataContext = treeNodeViewModel;
  119. }
  120. private void ListBoxItem_PreviewMouseLeftButtonUp(object sender, MouseEventArgs e)
  121. {
  122. if (this.moveFromNode == null)
  123. {
  124. return;
  125. }
  126. if (this.moveFromNode.IsRoot)
  127. {
  128. return;
  129. }
  130. var item = (FrameworkElement)sender;
  131. var moveToNode = item.DataContext as TreeNodeViewModel;
  132. Log.Debug("move to node: {0} {1}", this.moveFromNode.Id, moveToNode.Id);
  133. if (this.moveFromNode.Id == moveToNode.Id)
  134. {
  135. return;
  136. }
  137. this.ViewModel.MoveToNode(this.moveFromNode, moveToNode);
  138. this.moveFromNode = null;
  139. }
  140. private void MenuItem_New(object sender, RoutedEventArgs e)
  141. {
  142. if (this.ViewModel == null)
  143. {
  144. return;
  145. }
  146. Point point = Mouse.GetPosition(this.listBox);
  147. // one root node
  148. if (this.ViewModel.TreeNodes.Count == 0)
  149. {
  150. var addTreeNode = new TreeNodeViewModel(this.ViewModel, point.X, point.Y)
  151. {
  152. Type = (int)NodeType.Selector
  153. };
  154. this.ViewModel.Add(addTreeNode, null);
  155. }
  156. else
  157. {
  158. if (this.listBox.SelectedItem != null)
  159. {
  160. var parentNode = this.listBox.SelectedItem as TreeNodeViewModel;
  161. var addTreeNode = new TreeNodeViewModel(this.ViewModel, parentNode)
  162. {
  163. Type = (int)NodeType.Selector
  164. };
  165. this.ViewModel.Add(addTreeNode, parentNode);
  166. }
  167. }
  168. this.listBox.SelectedItem = null;
  169. e.Handled = true;
  170. }
  171. private void MenuItem_Delete(object sender, RoutedEventArgs e)
  172. {
  173. if (this.listBox.SelectedItem == null)
  174. {
  175. return;
  176. }
  177. var treeNodeViewModel = this.listBox.SelectedItem as TreeNodeViewModel;
  178. this.ViewModel.Remove(treeNodeViewModel);
  179. this.listBox.SelectedItem = null;
  180. e.Handled = true;
  181. }
  182. }
  183. }