Explorar el Código

修复了几个bug,CaptureMouse和ReleaseMouseCapture居然会引发MouseMove事件
所以这两个函数最好放到函数末尾执行,否则中间可能会调用MouseMove事件函数
会感觉十分奇怪

tanghai hace 14 años
padre
commit
9080f7dd3c

+ 11 - 5
CSharp/Modules/BehaviorTree/BehaviorTreeView.xaml

@@ -15,6 +15,7 @@
 			<GradientStop Color="#7FC9FF" Offset="0.6" />
 		</LinearGradientBrush>
 		<SolidColorBrush x:Key="treeNodeBorderBrush" Color="Black" />
+		<SolidColorBrush x:Key="treeNodeSelectedBorderBrush" Color="Green" />
 	</UserControl.Resources>
 
 	<UserControl.CommandBindings>
@@ -24,9 +25,9 @@
 
 	<UserControl.ContextMenu>
 		<ContextMenu>
-			<MenuItem Header="New Node" Command="ApplicationCommands.New" 
+			<MenuItem Header="New" Command="ApplicationCommands.New" 
 					CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
-			<MenuItem Header="Delete Node" Command="ApplicationCommands.Delete" 
+			<MenuItem Header="Delete" Command="ApplicationCommands.Delete" 
 					CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
 		</ContextMenu>
 	</UserControl.ContextMenu>
@@ -45,12 +46,17 @@
 			</ListBox.ItemsPanel>
 			<ListBox.ItemTemplate>
 				<DataTemplate>
-					<Canvas MouseDown="ListBoxItem_MouseDown" MouseUp="ListBoxItem_MouseUp" MouseMove="ListBoxItem_MouseMove">
-						<Rectangle Width="{Binding Width}" Height="{Binding Height}" Cursor="Hand" StrokeThickness="1.3" RadiusX="4" RadiusY="4"
+					<Canvas MouseDown="ListBoxItem_MouseDown" MouseUp="ListBoxItem_MouseUp" MouseMove="ListBoxItem_MouseMove" >
+						<Rectangle Name="rectNode" Width="{Binding Width}" Height="{Binding Height}" Cursor="Hand" StrokeThickness="4" RadiusX="4" RadiusY="4"
 								Stroke="{StaticResource treeNodeBorderBrush}" Fill="{StaticResource treeNodeFillBrush}" />
 						<Line X1="{Binding ConnectorX1}" Y1="{Binding ConnectorY1}" X2="{Binding ConnectorX2}" Y2="{Binding ConnectorY2}" 
-							  Stroke="Black" StrokeThickness="2" ></Line>
+							  Stroke="Black" StrokeThickness="2" />
 					</Canvas>
+					<DataTemplate.Triggers>
+						<DataTrigger  Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True">
+							<Setter TargetName="rectNode" Property="Stroke" Value="Green" />
+						</DataTrigger >
+					</DataTemplate.Triggers>
 				</DataTemplate>
 			</ListBox.ItemTemplate>
 		</ListBox>

+ 38 - 29
CSharp/Modules/BehaviorTree/BehaviorTreeView.xaml.cs

@@ -71,6 +71,8 @@ namespace BehaviorTree
 			}
 			var treeNodeViewModel = listBox.SelectedItem as TreeNodeViewModel;
 			this.ViewModel.Remove(treeNodeViewModel);
+			listBox.SelectedItem = null;
+			e.Handled = true;
 		}
 
 		private void ListBoxItem_MouseDown(object sender, MouseButtonEventArgs e)
@@ -79,9 +81,6 @@ namespace BehaviorTree
 			{
 				return;
 			}
-			var item = (FrameworkElement)sender;
-			var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
-
 			isLeftButtonDown = true;
 
 			if ((Keyboard.Modifiers & ModifierKeys.Control) != 0)
@@ -91,16 +90,20 @@ namespace BehaviorTree
 			else
 			{
 				isControlDown = false;
+			}
 
-				if (!listBox.SelectedItems.Contains(treeNodeViewModel))
-				{
-					listBox.SelectedItems.Clear();
-					listBox.SelectedItems.Add(treeNodeViewModel);
-				}
+			var item = (FrameworkElement)sender;
+			var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
+
+			if (!isControlDown && !listBox.SelectedItems.Contains(treeNodeViewModel))
+			{
+				listBox.SelectedItems.Clear();
+				listBox.SelectedItems.Add(treeNodeViewModel);
 			}
 
-			item.CaptureMouse();
 			origMouseDownPoint = e.GetPosition(this);
+
+			item.CaptureMouse();
 			e.Handled = true;
 		}
 
@@ -115,27 +118,24 @@ namespace BehaviorTree
 			var item = (FrameworkElement)sender;
 			var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
 
-			if (!isDragging)
+			if (isControlDown)
 			{
-				if (isLeftButtonDown && isControlDown)
+				if (!listBox.SelectedItems.Contains(treeNodeViewModel))
 				{
-					if (listBox.SelectedItems.Contains(treeNodeViewModel))
-					{
-						listBox.SelectedItems.Remove(treeNodeViewModel);
-					}
-					else
-					{
-						listBox.SelectedItems.Add(treeNodeViewModel);
-					}
+					listBox.SelectedItems.Add(treeNodeViewModel);
 				}
 				else
 				{
-					if (listBox.SelectedItems.Count != 1 || listBox.SelectedItem != treeNodeViewModel)
-					{
-						listBox.SelectedItems.Clear();
-						listBox.SelectedItem = treeNodeViewModel;
-						listBox.SelectedItems.Add(treeNodeViewModel);
-					}
+					listBox.SelectedItems.Remove(treeNodeViewModel);
+				}
+			}
+			else if (!isDragging)
+			{
+				if (listBox.SelectedItems.Count != 1 || listBox.SelectedItem != treeNodeViewModel)
+				{
+					listBox.SelectedItems.Clear();
+					listBox.SelectedItem = treeNodeViewModel;
+					listBox.SelectedItems.Add(treeNodeViewModel);
 				}
 			}
 
@@ -156,13 +156,22 @@ namespace BehaviorTree
 
 				origMouseDownPoint = curMouseDownPoint;
 
-				foreach (TreeNodeViewModel item in listBox.SelectedItems)
+				foreach (TreeNodeViewModel selectedItem in listBox.SelectedItems)
 				{
-					item.X += dragDelta.X;
-					item.Y += dragDelta.Y;
+					selectedItem.X += dragDelta.X;
+					selectedItem.Y += dragDelta.Y;
 				}
+				return;
+			}
+
+			var item = (FrameworkElement)sender;
+			var treeNodeViewModel = item.DataContext as TreeNodeViewModel;
+
+			if (!listBox.SelectedItems.Contains(treeNodeViewModel))
+			{
+				return;
 			}
-			else if (isLeftButtonDown)
+			if (isLeftButtonDown)
 			{
 				Point curMouseDownPoint = e.GetPosition(this);
 				var dragDelta = curMouseDownPoint - origMouseDownPoint;