BehaviorTreeView.xaml.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. public BehaviorTreeView()
  19. {
  20. this.InitializeComponent();
  21. }
  22. [Import]
  23. private BehaviorTreeViewModel ViewModel
  24. {
  25. get
  26. {
  27. return this.DataContext as BehaviorTreeViewModel;
  28. }
  29. set
  30. {
  31. this.DataContext = value;
  32. }
  33. }
  34. private void MenuNewNode_Executed(object sender, ExecutedRoutedEventArgs e)
  35. {
  36. Point point = Mouse.GetPosition(this.listBox);
  37. var treeNode = new TreeNode{ X = point.X, Y = point.Y};
  38. // one root node
  39. if (this.ViewModel.TreeNodes.Count == 0)
  40. {
  41. this.ViewModel.Add(treeNode, null);
  42. }
  43. else
  44. {
  45. if (this.listBox.SelectedItem != null)
  46. {
  47. var treeNodeViewModel = this.listBox.SelectedItem as TreeNodeViewModel;
  48. this.ViewModel.Add(treeNode, treeNodeViewModel);
  49. }
  50. }
  51. this.listBox.SelectedItem = null;
  52. e.Handled = true;
  53. }
  54. private void MenuDeleteNode_Executed(object sender, ExecutedRoutedEventArgs e)
  55. {
  56. if (this.listBox.SelectedItem == null)
  57. {
  58. return;
  59. }
  60. var treeNodeViewModel = this.listBox.SelectedItem as TreeNodeViewModel;
  61. this.ViewModel.Remove(treeNodeViewModel);
  62. this.listBox.SelectedItem = null;
  63. e.Handled = true;
  64. }
  65. private void MenuDeleteNode_Close(object sender, ExecutedRoutedEventArgs e)
  66. {
  67. if (this.listBox.SelectedItem == null)
  68. {
  69. return;
  70. }
  71. var treeNodeViewModel = this.listBox.SelectedItem as TreeNodeViewModel;
  72. this.ViewModel.Remove(treeNodeViewModel);
  73. this.listBox.SelectedItem = null;
  74. e.Handled = true;
  75. }
  76. private void ListBoxItem_MouseDown(object sender, MouseButtonEventArgs e)
  77. {
  78. if (e.ChangedButton != MouseButton.Left)
  79. {
  80. return;
  81. }
  82. // 双击鼠标
  83. if (e.ClickCount == 2 && e.ChangedButton == MouseButton.Left)
  84. {
  85. var item = (FrameworkElement) sender;
  86. var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
  87. if (treeNodeViewModel.IsFolder)
  88. {
  89. this.ViewModel.UnFold(treeNodeViewModel);
  90. }
  91. else
  92. {
  93. this.ViewModel.Fold(treeNodeViewModel);
  94. }
  95. }
  96. else
  97. {
  98. this.isLeftButtonDown = true;
  99. var item = (FrameworkElement) sender;
  100. var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
  101. this.listBox.SelectedItem = treeNodeViewModel;
  102. this.origMouseDownPoint = e.GetPosition(this);
  103. item.CaptureMouse();
  104. }
  105. e.Handled = true;
  106. }
  107. private void ListBoxItem_MouseUp(object sender, MouseButtonEventArgs e)
  108. {
  109. if (!this.isLeftButtonDown)
  110. {
  111. this.isDragging = false;
  112. return;
  113. }
  114. var item = (FrameworkElement) sender;
  115. var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
  116. if (!this.isDragging)
  117. {
  118. this.listBox.SelectedItem = treeNodeViewModel;
  119. }
  120. this.isLeftButtonDown = false;
  121. this.isDragging = false;
  122. item.ReleaseMouseCapture();
  123. e.Handled = true;
  124. }
  125. private void ListBoxItem_MouseMove(object sender, MouseEventArgs e)
  126. {
  127. var item = (FrameworkElement) sender;
  128. var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
  129. if (treeNodeViewModel == null)
  130. {
  131. return;
  132. }
  133. if (!treeNodeViewModel.IsRoot)
  134. {
  135. return;
  136. }
  137. Point curMouseDownPoint;
  138. Vector dragDelta;
  139. if (this.isDragging)
  140. {
  141. curMouseDownPoint = e.GetPosition(this);
  142. dragDelta = curMouseDownPoint - this.origMouseDownPoint;
  143. this.origMouseDownPoint = curMouseDownPoint;
  144. this.ViewModel.Move(dragDelta.X, dragDelta.Y);
  145. return;
  146. }
  147. if (!this.isLeftButtonDown)
  148. {
  149. return;
  150. }
  151. curMouseDownPoint = e.GetPosition(this);
  152. dragDelta = curMouseDownPoint - this.origMouseDownPoint;
  153. double dragDistance = Math.Abs(dragDelta.Length);
  154. if (dragDistance > DragThreshold)
  155. {
  156. this.isDragging = true;
  157. }
  158. e.Handled = true;
  159. }
  160. }
  161. }