BehaviorTreeView.xaml.cs 4.7 KB

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