BehaviorTreeView.xaml.cs 4.5 KB

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