解决Nodify框架因自带放大缩小、平移功能导致拖拽添加的控件无法准确在鼠标放下的位置显示控件

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添加拖拽事件,经过放大缩小、平移后获得控件坐标点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544802.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

响应式布局-媒体查询父级布局容器

1.响应式布局容器 父局作为布局容器&#xff0c;配合自己元素实现变化效果&#xff0c;原理&#xff1a;在不通过屏幕下面吗&#xff0c;通过媒体查询来改变子元素的排列方式和大小&#xff0c;从而实现不同尺寸屏幕下看到不同的效果。 2.响应尺寸布局容器常见宽度划分 手机-…

【Python】工具使用

pycharm Jupyter Notebook 参考文献 详解Jupyter Notebook (qq.com) python专业集成开发环境pycharm安装使用 (qq.com)

自动化学习3:日志记录及测试报告的生成--自动化框架搭建

一.日志记录 1.配置文件pytest.ini&#xff1a;将日志写入文件方便日后查询或查看执行信息。 需要将文件处理器&#xff08;文件存放位置/时间/格式等等&#xff09;添加到配置文件中的【日志记录器】 # pytest.ini [pytest] # ---------------日志文件&#xff0c;需要配合…

并发编程。

进程 1.什么是进程&#xff1f; 进程是具有独立功能的程序关于某个数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的 独立单位。进程是可与其他程序并发执行的程序&#xff0c;在一个数据集合上的运行过程。它是系统进行 资源分配和调度的一个独立单位。 2.进…

日丰卫浴启动国货好物节,以“焕新+公益+体验”筑国民美好生活

在当下卫浴行业面临转型升级的大背景下&#xff0c;宏观政策持续推动以旧换新和消费升级&#xff0c;为市场注入了新的活力。随着中秋国庆双节的临近&#xff0c;卫浴消费逐步进入传统旺季&#xff0c;叠加利好政策&#xff0c;市场需求进一步活跃&#xff0c;日丰卫浴借此契机…

常见统计量与其抽样分布

什么是统计量 我们首先给出统计量的定义:设 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X1​,X2​,⋯,Xn​ 为来自于总体X的一个样本&#xff0c; g ( X 1 , X 2 , ⋯ , X n ) g(X_1,X_2,\cdots,X_n) g(X1​,X2​,⋯,Xn​) 为关于 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X…

【2024W37】肖恩技术周刊(第 15 期):中秋节快乐

周刊内容: 对一周内阅读的资讯或技术内容精品&#xff08;个人向&#xff09;进行总结&#xff0c;分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率&#xff0c;每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

微服务——配置管理

1.配置管理 微服务配置管理是指对微服务架构中各个服务的配置信息进行管理、更新、查询和审计等操作&#xff0c;以确保系统的正常运行和高效管理。例如&#xff0c;网关路由或某些业务配置在配置文件中写死了&#xff0c;每次修改都要重启服务。每个微服务都有很多重复的配置&…

同等学力英语历年真题有必要做吗

同等学力申硕历年真题是考生备考期间最重要的参考资料&#xff0c;在做真题的时候对那些经常出现的词汇要进行汇总整理&#xff0c;记忆高频词汇。 当你在阅读文章的时候发现不认识的单词或者一个熟悉的单词但是放在句子当中却读不通顺的这类单词的时候&#xff0c;一定要做好标…

WinCC中VB脚本和C脚本到底怎么选?

很多人认为VB脚本比C脚本慢&#xff0c;所以在WinCC中要尽量使用C脚本&#xff0c;以便提高性能&#xff0c;事实真是这样吗&#xff1f;工控人加入PLC工业自动化精英社群 先说结论&#xff1a;并非如此。在一个复杂的应用中&#xff0c;混合使用VB脚本和C脚本&#xff0c;对提…

mes系统在中小企业智能制造作用

MES系统&#xff08;制造执行系统&#xff09;在中小企业智能制造中扮演着至关重要的角色&#xff0c;其作用主要体现在以下几个方面&#xff1a; 1. 提升生产效率与质量 实时监控与数据采集&#xff1a;MES系统能够实时采集生产现场的各项数据&#xff0c;如设备状态、生产进…

Maya学习笔记:软选择

文章目录 打开软选择调整软选择范围衰减模式 软选择可以很好的进行渐变修改 打开软选择 方法1&#xff1a; 进入点线面模式&#xff0c;按B键进入软选择模式&#xff0c;再按B取消 方法2&#xff1a;双击左侧的选择按钮打开选择面板&#xff0c;勾选软选择 调整软选择范围 …

input文本框随其中内容而变化长

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><title>input文本框随其中内容而变化长</title><style>.input-length {border: 1px solid #ccc;padding: 5px;min-width: 10px;width: auto;}.in…

物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——STM32代码实现篇

STM32代码实现 开启本章节需要完成下方的前置任务&#xff1a; 点击跳转&#xff1a; 物联网实践教程&#xff1a;微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 目标 1.连接OneNET&#xff1a;STM32使用串口与ESP8266/01s连接发送…

node.js npm 安装和安装create-next-app

1、官网下载windows版本NODE.JS https://nodejs.org/dist/v20.17.0/node-v20.17.0-x64.msi 2、安装后增加两个文件夹目录node_global、node_cache npm config set prefix "C:\Program Files\nodejs\node_global" npm config set prefix "C:\Program Files\nod…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建超级马里奥

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建超级马里奥 华为云端口放行 服务器放行对应端口5000 Docker安装并配置镜像加速 1、购买华为云 Flexus X 实例 Flexus云服务器X实例-华为云 (huaweicloud.com) 2、docker安装 yum install -y docker-ce3、验证 …

网络编程——TCP网络通信

通信步骤&#xff1a; 1、连接 2、传输数据 3、关闭连接服务端的创建流程&#xff1a; 1、创建服务端socket对象 socket_family:网络地址类型AF_INET--代表的是ipv4地址类型 socket_type:套接字类型SOCK_STREAM--代表的是tcp套接字SOCK_DGRAM--代表的是udp套接字 2、绑定自己的…

企业如何利用短视频平台做口碑塑造和品牌营销?

抖音和小红书作为短视频平台的代表&#xff0c;吸引了大量的用户和品牌。如何利用抖音、小红书等短视频平台进行品牌塑造和口碑营销呢&#xff1f;小马识途营销顾问分析&#xff0c;短视频平台的用户以年轻人为主&#xff0c;他们具有高度的社交性和消费意愿。短视频平台提供了…

使用Java基于GeoTools读取Shapefile矢量数据属性信息-以某市POI数据为例

前言 在之前的博客中&#xff0c;我们讲过在GDAL中如何读取空间数据的属性和数据信息&#xff0c;也简单的讲过如何在GeoTools中读取Shapefile文件的属性信息和数据信息。对于空间矢量数据库&#xff0c;就像我们传统的二维数据库的表字段和表数据的关系&#xff0c;在研究表数…

[大语言模型-论文精读] ACL2024-长尾知识在检索增强型大型语言模型中的作用

ACL2024-长尾知识在检索增强型大型语言模型中的作用 On the Role of Long-tail Knowledge in Retrieval Augmented Large Language Models Authors: Dongyang Li, Junbing Yan, Taolin Zhang, Chengyu Wang, Xiaofeng He, Longtao Huang, Hui Xue, Jun Huang 1.概览 问题解决&…