TreeView.xaml.cs 5.6 KB

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