ViewModel中写具体关键的几段代码:
var editor = sender as NodifyEditor; Point p = e.GetPosition(editor);//放大缩小比例double scale = editor.ViewportZoom;//经过放大缩小、平移后获得坐标点位置p = new Point(Math.Round((p.X - editor.ViewportTransform.Value.OffsetX) / scale,0), Math.Round((p.Y - editor.ViewportTransform.Value.OffsetY) / scale,0));
详细代码如下
CustomInterfaceView.xaml
<UserControl x:Class="Ueyes.Intergration.AgingEditor.View.CustomInterfaceView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Ueyes.Intergration.AgingEditor" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"xmlns:nodify="https://miroiu.github.io/nodify" xmlns:shared="clr-namespace:Ueyes.Intergration.AgingEditor.Share;assembly=Ueyes.Intergration.AgingEditor.Share" xmlns:h="http://schemas.microsoft.com/xaml/behaviors"mc:Ignorable="d" Name="custom"d:DesignHeight="800" d:DesignWidth="1000"><UserControl.Resources><shared:TargetTypeToVisibilityConverter x:Key="TargetTypeToVisibilityConverter"/><shared:BindingProxy x:Key="EditorProxy" DataContext="{Binding}" /><shared:BindingProxy x:Key="BlackboardProxy" DataContext="{Binding SelectedState.Action}" /><DataTemplate x:Key="ToolBoxStyle"><Grid Margin="2" Background="Transparent"><Grid.ColumnDefinitions><ColumnDefinition Width="30"/><ColumnDefinition/></Grid.ColumnDefinitions><iconPacks:PackIconMaterial x:Name="icon" Kind="Ellipse" BorderThickness="1" VerticalAlignment="Stretch" Width="24" HorizontalAlignment="Stretch"/><TextBlock x:Name="txt" Grid.Column="1" Text="{Binding TypeName}" Margin="4"/></Grid><DataTemplate.Triggers><DataTrigger Binding="{Binding TypeName}" Value="Button"><Setter Property="Kind" TargetName="icon" Value="GestureTapButton"/><Setter Property="Text" TargetName="txt" Value="{Binding Header}"/></DataTrigger><DataTrigger Binding="{Binding TypeName}" Value="TextBox"><Setter Property="Kind" TargetName="icon" Value="Numeric8Box"/><Setter Property="Text" TargetName="txt" Value="{Binding Header}"/></DataTrigger><DataTrigger Binding="{Binding TypeName}" Value="TextBlock"><Setter Property="Kind" TargetName="icon" Value="FormatText"/><Setter Property="Text" TargetName="txt" Value="{Binding Header}"/></DataTrigger> </DataTemplate.Triggers></DataTemplate><DataTemplate x:Key="ButtonTemplate"><Button Command="{Binding DataContext.ClickCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" CommandParameter="{Binding .}"><Button.Content><shared:EditableTextBlock IsEditable="{Binding IsEditable}"IsEditing="{Binding IsRenaming}" Text="{Binding Name}" /></Button.Content></Button></DataTemplate><DataTemplate x:Key="TextBlockTemplate"><shared:EditableTextBlock IsEditable="{Binding IsEditable}" Foreground="Black" MaxLength="30"IsEditing="{Binding IsRenaming}" Text="{Binding Name}" /></DataTemplate><DataTemplate x:Key="TextBoxTemplate"><TextBox Text="{Binding Name}" IsEnabled="{Binding IsEditable}" MinHeight="25" MaxLength="30"/></DataTemplate></UserControl.Resources><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="Auto" /><ColumnDefinition /><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions><nodify:NodifyEditor x:Name="Editor" Grid.Column="1" Background="White" ItemsSource="{Binding States}" AllowDrop="True"SelectedItem="{Binding SelectedState}" DisableZooming="False" DisablePanning="False"SelectedItems="{Binding SelectedStates}"><h:Interaction.Triggers><h:EventTrigger EventName="Drop"><h:CallMethodAction TargetObject="{Binding}"MethodName="nodify_Drop"/></h:EventTrigger></h:Interaction.Triggers><nodify:NodifyEditor.ItemTemplate><DataTemplate DataType="{x:Type local:StateViewModel}"><nodify:StateNode Anchor="{Binding Anchor, Mode=OneWayToSource}" Padding="10 12"Content="{Binding}" IsConnected="False" ToolTip="{Binding Location}"><nodify:StateNode.ContentTemplate><DataTemplate DataType="{x:Type local:StateViewModel}"><ContentControl Content="{Binding}" ><ContentControl.Style><Style TargetType="{x:Type ContentControl}"><Style.Triggers><DataTrigger Binding="{Binding TargetType}" Value="Button"><Setter Property="ContentTemplate" Value="{StaticResource ButtonTemplate}" /></DataTrigger><DataTrigger Binding="{Binding TargetType}" Value="TextBlock"><Setter Property="ContentTemplate" Value="{StaticResource TextBlockTemplate}" /></DataTrigger><DataTrigger Binding="{Binding TargetType}" Value="TextBox"><Setter Property="ContentTemplate" Value="{StaticResource TextBoxTemplate}" /></DataTrigger></Style.Triggers></Style></ContentControl.Style></ContentControl></DataTemplate></nodify:StateNode.ContentTemplate><nodify:StateNode.Style><Style BasedOn="{StaticResource {x:Type nodify:StateNode}}" TargetType="{x:Type nodify:StateNode}"><Setter Property="BorderThickness" Value="0"/><Style.Triggers><DataTrigger Binding="{Binding TargetType}" Value="Button"><Setter Property="Background" Value="White" /></DataTrigger><DataTrigger Binding="{Binding TargetType}" Value="TextBlock"><Setter Property="Foreground" Value="Black"/><Setter Property="Background" Value="White" /></DataTrigger><DataTrigger Binding="{Binding TargetType}" Value="TextBox"><Setter Property="Background" Value="White" /></DataTrigger></Style.Triggers></Style></nodify:StateNode.Style></nodify:StateNode></DataTemplate></nodify:NodifyEditor.ItemTemplate><nodify:NodifyEditor.ItemContainerStyle><Style BasedOn="{StaticResource {x:Type nodify:ItemContainer}}" TargetType="{x:Type nodify:ItemContainer}"><Setter Property="BorderBrush" Value="Transparent" /><Setter Property="Location" Value="{Binding Location}" /><Setter Property="ActualSize" Value="{Binding Size, Mode=OneWayToSource}" /><Setter Property="ContextMenu"><Setter.Value><ContextMenu DataContext="{Binding DataContext, Source={StaticResource EditorProxy}}"><MenuItemCommand="{Binding DeleteCommand}"Header="_Delete"Icon="{StaticResource DeleteIcon}" InputGestureText="Delete"/><MenuItemCommand="{Binding CopyCommand}"Header="_Copy"Icon="{StaticResource CopyIcon}"InputGestureText="Ctrl+D" /><MenuItemCommand="{Binding RenameCommand}"Header="_Rename"Icon="{StaticResource RenameIcon}" /><MenuItemCommand="{Binding EditableCommand}"Header="_IsEditable"Icon="{StaticResource EditIcon}" /><!--<MenuItemCommand="{Binding MoveCommand}"Header="_IsMove"Icon="{StaticResource EditIcon}" />--><MenuItem Header="_Alignment" Icon="{StaticResource AlignTopIcon}"><MenuItemCommand="{x:Static nodify:EditorCommands.Align}"CommandParameter="Top"Header="_Top"Icon="{StaticResource AlignTopIcon}" /><MenuItemCommand="{x:Static nodify:EditorCommands.Align}"CommandParameter="Left"Header="_Left"Icon="{StaticResource AlignLeftIcon}" /><MenuItemCommand="{x:Static nodify:EditorCommands.Align}"CommandParameter="Bottom"Header="_Bottom"Icon="{StaticResource AlignBottomIcon}" /><MenuItemCommand="{x:Static nodify:EditorCommands.Align}"CommandParameter="Right"Header="_Right"Icon="{StaticResource AlignRightIcon}" /><MenuItemCommand="{x:Static nodify:EditorCommands.Align}"CommandParameter="Middle"Header="_Middle"Icon="{StaticResource AlignMiddleIcon}" /><MenuItemCommand="{x:Static nodify:EditorCommands.Align}"CommandParameter="Center"Header="_Center"Icon="{StaticResource AlignCenterIcon}" /></MenuItem></ContextMenu></Setter.Value></Setter></Style></nodify:NodifyEditor.ItemContainerStyle><nodify:NodifyEditor.ContextMenu><ContextMenu DataContext="{Binding DataContext, Source={StaticResource EditorProxy}}"><MenuItemCommand="{Binding AddButtonCommand}"CommandParameter="{Binding PlacementTarget.MouseLocation, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"Header="_Add Button"Icon="{StaticResource AddStateIcon}"/><MenuItemCommand="{Binding AddTextBlockCommand}"CommandParameter="{Binding PlacementTarget.MouseLocation, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"Header="_Add TextBlock"Icon="{StaticResource AddStateIcon}"/><MenuItemCommand="{Binding AddTextBoxCommand}"CommandParameter="{Binding PlacementTarget.MouseLocation, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"Header="_Add TextBox"Icon="{StaticResource AddStateIcon}"/><MenuItemCommand="{Binding DeleteCommand}"Header="_Delete"Icon="{StaticResource DeleteIcon}"InputGestureText="Delete" /><Separator Background="{DynamicResource BorderBrush}" /><MenuItemCommand="{x:Static nodify:EditorCommands.SelectAll}"Header="_Select All"Icon="{StaticResource SelectAllIcon}"InputGestureText="Ctrl+A" /></ContextMenu></nodify:NodifyEditor.ContextMenu><!--快捷键添加删除新模块操作--><nodify:NodifyEditor.InputBindings><KeyBinding Key="Delete" Command="{Binding DeleteCommand}" /><!--<KeyBindingKey="A"Command="{Binding AddStateCommand}"CommandParameter="{Binding MouseLocation, RelativeSource={RelativeSource AncestorType={x:Type nodify:NodifyEditor}}}"Modifiers="Shift" />--><KeyBinding Command="{Binding CopyCommand}" Key="D" Modifiers="Ctrl"/><KeyBinding Command="{x:Static nodify:EditorCommands.SelectAll}" Key="A" Modifiers="Ctrl"/></nodify:NodifyEditor.InputBindings></nodify:NodifyEditor><ExpanderPadding="0,1,4,3"HorizontalAlignment="Left"HorizontalContentAlignment="Left"VerticalContentAlignment="Center"Background="{DynamicResource PanelBackgroundBrush}"ExpandDirection="Left"IsExpanded="True"Visibility="Visible"><Expander.Style><Style BasedOn="{StaticResource {x:Type Expander}}" TargetType="{x:Type Expander}"><Setter Property="Tag" Value="{StaticResource ExpandRightIcon}" /><Style.Triggers><Trigger Property="IsExpanded" Value="True"><Setter Property="Tag" Value="{StaticResource ExpandLeftIcon}" /></Trigger></Style.Triggers></Style></Expander.Style><BorderWidth="450"Padding="10"HorizontalAlignment="Stretch"BorderBrush="{DynamicResource BackgroundBrush}"BorderThickness="1"><Grid><Grid.RowDefinitions><RowDefinition Height="3*"/><RowDefinition Height="6*" /><RowDefinition Height="1*" /></Grid.RowDefinitions><!-- TRANSITIONS --><GridGrid.Row="0"Margin="0,10,0,10" Visibility="{Binding SelectedState, Converter={shared:BooleanToVisibilityConverter Negate=True}}"><Grid VerticalAlignment="Top"><ListBox x:Name="CtlList" ItemsSource="{Binding ThumbList}" Background="Transparent" ItemTemplate="{StaticResource ToolBoxStyle}" SelectedItem="{Binding ThumbSelectedItem}" BorderThickness="0"><h:Interaction.Triggers><h:EventTrigger EventName="PreviewMouseMove"><h:CallMethodAction MethodName="CtlList_PreviewMouseMove"TargetObject="{Binding ElementName=custom,Path=DataContext}"/></h:EventTrigger></h:Interaction.Triggers></ListBox><!--<ItemsControl ItemsSource="{Binding ThumbList}"><ItemsControl.ItemTemplate><DataTemplate><Border Margin="5,3" Tag="{Binding TypeName}"><StackPanel Orientation="Horizontal"><iconPacks:PackIconMaterial x:Name="icon" Kind="GestureTapButton" BorderThickness="1" Width="30" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/><TextBlock x:Name="txt" Grid.Column="1" Text="{Binding Header}" Margin="4"/></StackPanel><h:Interaction.Triggers><h:EventTrigger EventName="MouseLeftButtonDown"><h:CallMethodAction MethodName="Border_MouseLeftButtonDown"TargetObject="{Binding ElementName=custom,Path=DataContext}"/></h:EventTrigger></h:Interaction.Triggers></Border></DataTemplate></ItemsControl.ItemTemplate></ItemsControl>--></Grid></Grid><!-- STATES --><Grid Grid.Row="0" Grid.RowSpan="2" Margin="0,10,0,10" Visibility="{Binding SelectedState, Converter={shared:BooleanToVisibilityConverter}}"><Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition Height="Auto" /><RowDefinition /></Grid.RowDefinitions><!-- STATE NAME --><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="*" /><ColumnDefinition Width="Auto" /></Grid.ColumnDefinitions><shared:EditableTextBlockFontSize="16"FontWeight="Bold"Foreground="{DynamicResource ForegroundBrush}"IsEditable="{Binding SelectedState.IsEditable}"IsEditing="{Binding IsChecked, ElementName=EditStateName}"MaxLength="20"Text="{Binding SelectedState.Name}" /><CheckBoxx:Name="EditStateName"Grid.Column="1"Content="{StaticResource EditIcon}"Style="{StaticResource IconCheckBox}"Visibility="{Binding SelectedState.IsEditable, Converter={shared:BooleanToVisibilityConverter}}" /></Grid><SeparatorGrid.Row="1"Width="Auto"Height="2"Margin="0,2,0,10"/><ScrollViewerGrid.Row="2"VerticalScrollBarVisibility="Auto"Visibility="{Binding SelectedState.Action, Converter={shared:BooleanToVisibilityConverter}}"><Grid IsSharedSizeScope="True"><Grid.ColumnDefinitions><ColumnDefinition Width="Auto" /><ColumnDefinition /></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition Height="Auto" /><RowDefinition Height="Auto" /><RowDefinition /></Grid.RowDefinitions><!-- ACTION --><TextBlockMargin="0,0,10,0"VerticalAlignment="Center"Text="操作" /><ComboBoxGrid.Column="1"DisplayMemberPath="Name"IsEnabled="{Binding SelectedState.IsEditable}"ItemsSource="{Binding Blackboard.Actions}"SelectedItem="{Binding SelectedState.ActionReference}" /><!-- INPUT --><ExpanderGrid.Row="1"Grid.ColumnSpan="2"Margin="0,5,0,0"Padding="0,5,0,0"BorderBrush="{DynamicResource BackgroundBrush}"BorderThickness="0,0,0,1"FontWeight="Bold"Header="Input"IsExpanded="True"Visibility="{Binding SelectedState.Action.Input.Count, Converter={shared:BooleanToVisibilityConverter}}"><Expander.Style><Style BasedOn="{StaticResource {x:Type Expander}}" TargetType="{x:Type Expander}"><Setter Property="Tag" Value="{StaticResource ExpandRightIcon}" /><Style.Triggers><Trigger Property="IsExpanded" Value="True"><Setter Property="Tag" Value="{StaticResource ExpandDownIcon}" /></Trigger></Style.Triggers></Style></Expander.Style><ItemsControl FontWeight="Normal" ItemsSource="{Binding SelectedState.Action.Input}"><ItemsControl.ItemTemplate><DataTemplate DataType="{x:Type local:BlackboardKeyViewModel}"><local:BlackBoardKeyEditorView Margin="0,0,0,2"><local:BlackBoardKeyEditorView.DataContext><MultiBinding Converter="{local:BlackboardKeyEditorConverter CanChangeInputType=True}"><Binding Path="DataContext.Keys" Source="{StaticResource BlackboardProxy}" /><Binding BindsDirectlyToSource="True" /></MultiBinding></local:BlackBoardKeyEditorView.DataContext></local:BlackBoardKeyEditorView></DataTemplate></ItemsControl.ItemTemplate></ItemsControl></Expander><!-- OUTPUT --><ExpanderGrid.Row="2"Grid.ColumnSpan="2"Margin="0,5,0,0"Padding="0,5,0,0"BorderBrush="{DynamicResource BackgroundBrush}"BorderThickness="0,0,0,1"FontWeight="Bold"Header="Output"IsExpanded="True"Visibility="{Binding SelectedState.Action.Output.Count, Converter={shared:BooleanToVisibilityConverter}}"><Expander.Style><Style BasedOn="{StaticResource {x:Type Expander}}" TargetType="{x:Type Expander}"><Setter Property="Tag" Value="{StaticResource ExpandRightIcon}" /><Style.Triggers><Trigger Property="IsExpanded" Value="True"><Setter Property="Tag" Value="{StaticResource ExpandDownIcon}" /></Trigger></Style.Triggers></Style></Expander.Style><ItemsControl FontWeight="Normal" ItemsSource="{Binding SelectedState.Action.Output}"><ItemsControl.ItemTemplate><DataTemplate DataType="{x:Type local:BlackboardKeyViewModel}"><local:BlackBoardKeyEditorView Margin="0,0,0,2"><local:BlackBoardKeyEditorView.DataContext><MultiBinding Converter="{local:BlackboardKeyEditorConverter CanChangeInputType=False}"><Binding Path="DataContext.Keys" Source="{StaticResource BlackboardProxy}" /><Binding BindsDirectlyToSource="True" /></MultiBinding></local:BlackBoardKeyEditorView.DataContext></local:BlackBoardKeyEditorView></DataTemplate></ItemsControl.ItemTemplate></ItemsControl></Expander><Grid Grid.Row="3" Grid.ColumnSpan="2" Margin="0 50 0 0" IsSharedSizeScope="True"><Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition Height="Auto" /><RowDefinition /></Grid.RowDefinitions><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="*" /><ColumnDefinition Width="Auto" /></Grid.ColumnDefinitions><shared:EditableTextBlockFontSize="16"FontWeight="Bold"Foreground="{DynamicResource ForegroundBrush}"IsEditing="{Binding IsChecked, ElementName=EditName}"MaxLength="20"Text="{Binding Name}" /><StackPanel Grid.Column="1" Orientation="Horizontal"><CheckBoxx:Name="EditName"Content="{StaticResource EditIcon}"Style="{StaticResource IconCheckBox}"ToolTip="修改参数名称" /><ButtonCommand="{Binding SelectedState.Action.AddKeyCommand}"Content="{StaticResource AddKeyIcon}"Style="{StaticResource IconButton}"ToolTip="添加新参数" /></StackPanel></Grid><SeparatorGrid.Row="1"Width="Auto"Height="2"Margin="0,2,0,10" /><ScrollViewerGrid.Row="2"HorizontalScrollBarVisibility="Auto"VerticalScrollBarVisibility="Auto"><ItemsControl ItemsSource="{Binding SelectedState.Action.ConfigParameter}"><ItemsControl.ItemTemplate><DataTemplate DataType="{x:Type local:BlackboardKeyViewModel}"><Grid Margin="0,0,0,2"><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition SharedSizeGroup="Actions" /></Grid.ColumnDefinitions><local:BlackBoardKeyEditorView><local:BlackBoardKeyEditorView.DataContext><MultiBinding Converter="{local:BlackboardKeyEditorConverter CanChangeInputType=False}"><Binding Path="DataContext.ConfigParameter" Source="{StaticResource BlackboardProxy}" /><Binding BindsDirectlyToSource="True" /></MultiBinding></local:BlackBoardKeyEditorView.DataContext></local:BlackBoardKeyEditorView><StackPanel Grid.Column="3" Orientation="Horizontal"><CheckBoxx:Name="EditKeyName"Content="{StaticResource EditIcon}"Style="{StaticResource IconCheckBox}"ToolTip="修改参数名称" /><ButtonCommand="{Binding DataContext.SelectedState.Action.RemoveKeyCommand, Source={StaticResource EditorProxy}}"CommandParameter="{Binding}"Content="{StaticResource RemoveKeyIcon}"Style="{StaticResource IconButton}" /></StackPanel></Grid></DataTemplate></ItemsControl.ItemTemplate></ItemsControl></ScrollViewer></Grid></Grid></ScrollViewer><ScrollViewerGrid.Row="2"VerticalScrollBarVisibility="Auto"Visibility="{Binding SelectedState.TargetType, Converter={StaticResource TargetTypeToVisibilityConverter}}"><Grid IsSharedSizeScope="True" VerticalAlignment="Top"><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition/></Grid.ColumnDefinitions><TextBlock Grid.Column="0" Text="编号" Margin="0,5,10,0"/><TextBox Grid.Column="1" Height="25" Text="{Binding SelectedState.Code}" IsEnabled="False"/></Grid></ScrollViewer></Grid><!-- Export/Import --><Grid Grid.Row="2"><Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition Height="Auto" /><RowDefinition /></Grid.RowDefinitions><!-- NAME --><TextBlockFontSize="16"FontWeight="Bold"Foreground="{DynamicResource ForegroundBrush}"Text="方案导入/导出" /><SeparatorGrid.Row="1"Width="Auto"Height="2"Margin="0,2,0,5" /><Border Grid.Row="2" HorizontalAlignment="Left" VerticalAlignment="Top"Background="{DynamicResource PanelBackgroundBrush}"BorderThickness="0,0,0,1"CornerRadius="2"Height="40"><StackPanel Orientation="Horizontal" Height="40"><Button Margin="10,0,10,0" Command="{Binding SaveCommand}" Content="{StaticResource SaveIcon}"Style="{StaticResource IconButton}"ToolTip="Save" Cursor="Hand" Height="40"/><Button Margin="10,0,10,0" Command="{Binding ExportSchemeCommand}" Content="{StaticResource ExportIcon}"Style="{StaticResource IconButton}"ToolTip="Export" Cursor="Hand" Height="40"/><Button Margin="10,0,10,0" Command="{Binding ImportSchemeCommand}" Content="{StaticResource ImportIcon}"Style="{StaticResource IconButton}"ToolTip="Import" Cursor="Hand" Height="40"/></StackPanel></Border></Grid></Grid></Border></Expander></Grid>
</UserControl>
精炼重要点为
<h:Interaction.Triggers><h:EventTrigger EventName="Drop"><h:CallMethodAction TargetObject="{Binding}"MethodName="nodify_Drop"/></h:EventTrigger>
</h:Interaction.Triggers><ListBox x:Name="CtlList" ItemsSource="{Binding ThumbList}" Background="Transparent" ItemTemplate="{StaticResource ToolBoxStyle}" SelectedItem="{Binding ThumbSelectedItem}" BorderThickness="0"><h:Interaction.Triggers><h:EventTrigger EventName="PreviewMouseMove"><h:CallMethodAction MethodName="CtlList_PreviewMouseMove"TargetObject="{Binding ElementName=custom,Path=DataContext}"/></h:EventTrigger></h:Interaction.Triggers>
</ListBox>
其中Nodify的属性可参考此链接查看
第八节:Nodify 编辑器属性-CSDN博客
里面有编辑器的一些简介
CustomInterfaceViewModel.cs
//可通过拖拽复制控件
public void CtlList_PreviewMouseMove(object sender, MouseEventArgs e)
{if (ThumbSelectedItem != null && e.LeftButton == MouseButtonState.Pressed){DragDrop.DoDragDrop((DependencyObject)sender, ThumbSelectedItem, DragDropEffects.Copy);}
}//nodify 放大缩小、平移后鼠标放在哪个位置 控件就显示在哪个位置
//最重要的就是方法内前四句代码
//p = new Point(Math.Round((p.X - editor.ViewportTransform.Value.OffsetX) / scale,0), Math.Round((p.Y - editor.ViewportTransform.Value.OffsetY) / scale,0));public void nodify_Drop(object sender, DragEventArgs e)
{var editor = sender as NodifyEditor; Point p = e.GetPosition(editor);double scale = editor.ViewportZoom;p = new Point(Math.Round((p.X - editor.ViewportTransform.Value.OffsetX) / scale,0), Math.Round((p.Y - editor.ViewportTransform.Value.OffsetY) / scale,0));if (ThumbSelectedItem.TypeName == "Button"){States.Add(new CustomViewModel(){Name = "New Button",IsRenaming = true,Location = p,ActionReference = Blackboard.Actions.Count > 0 ? Blackboard.Actions[0] : null,TargetType = ThumbSelectedItem.TypeName});}else if (ThumbSelectedItem.TypeName == "TextBox"){States.Add(new CustomViewModel{Code = GenerateUniqueRandomCode(1, 100),Name = "New TextBox",IsRenaming = true,Location = p,TargetType = "TextBox"});}else{States.Add(new CustomViewModel{Name = "New TextBlock",IsRenaming = true,Location = p,TargetType = "TextBlock"});}e.Handled = true;}
示例图
Nodify添加拖拽事件,经过放大缩小、平移后获得控件坐标点