B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【六】
播放地址:20241120-.NET9.0+WPF实战三类流程化业务逻辑控制-10_哔哩哔哩_bilibili
第14-15节 调整代码让拖拽到控制流程图里的模块产生位移
NodeModel新增两个属性X,Y记录控件的位置信息
1 public abstract class NodeModel: ObservableObject 2 { 3 public abstract string Name { get; set; } 4 private double x; 5 public double X { get { return x; } set => SetProperty(ref x, value); } 6 private double y; 7 public double Y { get { return y; } set => SetProperty(ref y, value); } 8 public abstract void Execute(); 9 }
调整MainViewModel的ListBox_Drop方法里获取拖拽到的位置,并赋值给NodeModel的X,Y
1 public partial class MainViewModel 2 { 3 public ObservableCollection<NodeModel> ProcessList { get; set; } = new ObservableCollection<NodeModel>(); 4 5 public void ListViewItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 6 { 7 DragDrop.DoDragDrop((DependencyObject)sender, (sender as ListViewItem).Tag, DragDropEffects.Copy); 8 } 9 10 public void ListBox_Drop(object sender, DragEventArgs e) 11 { 12 string tag = e.Data.GetData(typeof(string)).ToString(); 13 var point = e.GetPosition((IInputElement)sender); 14 //反射 15 //根据字符串获取类型 16 Type type = Assembly.GetEntryAssembly().GetType("WpfApp2." + tag); 17 //根据类型创建实例 18 NodeModel instance = (NodeModel)Activator.CreateInstance(type); 19 instance.X=point.X; 20 instance.Y=point.Y; 21 ProcessList.Add(instance); 22 } 23 [RelayCommand] 24 private void Execute() 25 { 26 foreach (var item in ProcessList) 27 { 28 item.Execute(); 29 } 30 } 31 }
调整界面MainView.xaml
重点注意ItemsControl需要设置属性Background,否则拖拽不了
其他代码详见内容
1 <Window x:Class="WpfApp2.MainView" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp2" xmlns:i="http://schemas.microsoft.com/xaml/behaviors" 7 mc:Ignorable="d" 8 WindowStartupLocation="CenterScreen" 9 Background="White" 10 Title="MainView" Height="650" Width="1300"> 11 <Grid> 12 <Grid.RowDefinitions> 13 <RowDefinition Height="Auto" /> 14 <RowDefinition /> 15 </Grid.RowDefinitions> 16 <Grid.ColumnDefinitions> 17 <ColumnDefinition Width="200" /> 18 <ColumnDefinition Width="300" /> 19 <ColumnDefinition /> 20 </Grid.ColumnDefinitions> 21 <Button Content="执行" HorizontalAlignment="Stretch" Margin="3" Command="{Binding ExecuteCommand}" /> 22 <TextBlock Text="循序流程" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock> 23 <TextBlock Text="流程图控制" Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock> 24 <ListView Grid.Row="1" Grid.Column="0"> 25 <ListViewItem Content="AAA" Tag="ProcessA"> 26 <i:Interaction.Triggers> 27 <i:EventTrigger EventName="PreviewMouseLeftButtonDown"> 28 <i:CallMethodAction MethodName="ListViewItem_MouseLeftButtonDown" TargetObject="{Binding}" /> 29 </i:EventTrigger> 30 </i:Interaction.Triggers> 31 </ListViewItem> 32 <ListViewItem Content="BBB" Tag="ProcessB"> 33 <i:Interaction.Triggers> 34 <i:EventTrigger EventName="PreviewMouseLeftButtonDown"> 35 <i:CallMethodAction MethodName="ListViewItem_MouseLeftButtonDown" TargetObject="{Binding}" /> 36 </i:EventTrigger> 37 </i:Interaction.Triggers></ListViewItem> 38 <ListViewItem Content="CCC" Tag="ProcessC"> 39 <i:Interaction.Triggers> 40 <i:EventTrigger EventName="PreviewMouseLeftButtonDown"> 41 <i:CallMethodAction MethodName="ListViewItem_MouseLeftButtonDown" TargetObject="{Binding}" /> 42 </i:EventTrigger> 43 </i:Interaction.Triggers></ListViewItem> 44 <ListViewItem Content="DDD" Tag="ProcessD"> 45 <i:Interaction.Triggers> 46 <i:EventTrigger EventName="PreviewMouseLeftButtonDown"> 47 <i:CallMethodAction MethodName="ListViewItem_MouseLeftButtonDown" TargetObject="{Binding}" /> 48 </i:EventTrigger> 49 </i:Interaction.Triggers></ListViewItem> 50 </ListView> 51 <ListBox Grid.Row="1" Grid.Column="1" AllowDrop="True" ItemsSource="{Binding ProcessList}"> 52 <i:Interaction.Triggers> 53 <i:EventTrigger EventName="Drop"> 54 <i:CallMethodAction MethodName="ListBox_Drop" TargetObject="{Binding}" /> 55 </i:EventTrigger> 56 </i:Interaction.Triggers> 57 <ListBox.ItemTemplate> 58 <DataTemplate> 59 <TextBlock Text="{Binding Name}"> 60 </TextBlock> 61 </DataTemplate> 62 </ListBox.ItemTemplate> 63 </ListBox> 64 <ItemsControl Grid.Row="1" Grid.Column="2" Background="Transparent" AllowDrop="true" ItemsSource="{Binding ProcessList}"> 65 <i:Interaction.Triggers> 66 <i:EventTrigger EventName="Drop"> 67 <i:CallMethodAction MethodName="ListBox_Drop" TargetObject="{Binding}" /> 68 </i:EventTrigger> 69 </i:Interaction.Triggers> 70 <ItemsControl.ItemsPanel> 71 <ItemsPanelTemplate> 72 <Canvas Background="AliceBlue" /> 73 </ItemsPanelTemplate> 74 </ItemsControl.ItemsPanel> 75 <ItemsControl.ItemContainerStyle> 76 <Style TargetType="ContentPresenter"> 77 <Setter Property="Canvas.Left" Value="{Binding X}"/> 78 <Setter Property="Canvas.Top" Value="{Binding Y}"/> 79 </Style> 80 </ItemsControl.ItemContainerStyle> 81 82 <ItemsControl.ItemTemplate> 83 <DataTemplate> 84 <Grid> 85 <Border Width="120" Height="30" Background="White" CornerRadius="5" Name="border"> 86 <TextBlock Text="{Binding Name}" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock> 87 </Border> 88 </Grid> 89 </DataTemplate> 90 </ItemsControl.ItemTemplate> 91 </ItemsControl> 92 </Grid> 93 </Window>
实现拖拽模块到流程图后产生位置变化并设置样式