chenghaoran
2024-03-12 375b488be2666cd56e70728624f4eadaefee0440
优化项目结构;
1个文件已修改
15个文件已添加
63 文件已重命名
2个文件已删除
4121 ■■■■■ 已修改文件
.gitignore 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Models/Step.cs 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Core/Api/IProgram.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Core/Api/ISequnce.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Core/Api/IStep.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Core/Api/IStepRunner.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Core/Entity/Param.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Core/Properties/AssemblyInfo.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Core/VisionBuilder.Core.csproj 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Engine/Properties/AssemblyInfo.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Engine/Runner.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Engine/VisionBuilder.Engine.csproj 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Test/PluginOne.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Test/Properties/AssemblyInfo.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisionBuilder.Test/VisionBuilder.Test.csproj 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject.sln 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/App.config 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/App.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/App.xaml.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Controls/DpPlugin.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Controls/IconTabItem.cs 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Controls/InnerWindow.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Controls/InnerWindow.xaml.cs 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Controls/MenuTabControl.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Controls/MenuTabControl.xaml.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Controls/MinInnerWindow.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Controls/MinInnerWindow.xaml.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Events/TabChange.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Forms/Form1.Designer.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Forms/Form1.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Forms/Form1.resx 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/MainWindow.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/MainWindow.xaml.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Models/CanvasPosition.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Models/FuncModel.cs 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Models/NotifyBase.cs 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Models/Program.cs 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Models/Sequence.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Models/Step.cs 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Models/Variable.cs 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Properties/AssemblyInfo.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Properties/Resources.Designer.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Properties/Resources.resx 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Properties/Settings.Designer.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Properties/Settings.settings 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Resources/Font/Font.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Resources/Font/iconfont.ttf 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Resources/Icon/xinzeng_1.png 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Style/Colors.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Style/CommonTree.xaml 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Style/ListViewStyle.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Style/MainTab.xaml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Style/WindowResources.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/BottomBar.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/BottomBar.xaml.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/StepSetting.xaml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/StepSetting.xaml.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/Test/FunctionSetting.xaml 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/Test/FunctionSetting.xaml.cs 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/Test/ProgramList.xaml 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/Test/ProgramList.xaml.cs 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/Test/SequnceList.xaml 452 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/Test/SequnceList.xaml.cs 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/TestWindow.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/TestWindow.xaml.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/WorkControl.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/WorkControl.xaml.cs 572 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/WorkWindow.xaml 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/UI/WorkWindow.xaml.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Utils/CanvasHelper.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Utils/DdDragHandler.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Utils/DdDropHandler.cs 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Utils/IPlugin.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Utils/Resize.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Utils/Win32Helper.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Utils/XmlUtil.cs 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/ViewModels/ProgramListViewModel.cs 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/WPFProject.csproj 608 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/WPFProject.sln 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/packages.config 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/test.xml 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -16,6 +16,7 @@
bld/
[Bb]in/
[Oo]bj/
**/packages/
# Roslyn cache directories
*.ide/
Models/Step.cs
File was deleted
VisionBuilder.Core/Api/IProgram.cs
New file
@@ -0,0 +1,7 @@
namespace VisionBuilder.Core.Api
{
    public interface IProgram
    {
        void RunProgram();
    }
}
VisionBuilder.Core/Api/ISequnce.cs
New file
@@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace VisionBuilder.Core.Api
{
    public interface ISequence
    {
        void SetSteps(List<IStep> steps);
        IList<IStep> GetSteps();
        ISequence AddStep(params IStep[] steps);
        void SetPrograme(IProgram program);
        IProgram GetProgram();
        void RunSequnce();
    }
}
VisionBuilder.Core/Api/IStep.cs
New file
@@ -0,0 +1,7 @@
namespace VisionBuilder.Core.Api
{
    public interface IStep
    {
        void RunStep();
    }
}
VisionBuilder.Core/Api/IStepRunner.cs
New file
@@ -0,0 +1,10 @@
using System.Collections.Generic;
using VisionBuilder.Core.Entity;
namespace VisionBuilder.Core.Api
{
    public interface IStepRunner
    {
        void RunStep(Dictionary<string, Param> param);
    }
}
VisionBuilder.Core/Entity/Param.cs
New file
@@ -0,0 +1,22 @@
namespace VisionBuilder.Core.Entity
{
    public class Param
    {
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
        private string _Value;
        public string Value
        {
            get { return _Value; }
            set { _Value = value; }
        }
    }
}
VisionBuilder.Core/Properties/AssemblyInfo.cs
New file
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("VisionBuilder.Core")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("HP Inc.")]
[assembly: AssemblyProduct("VisionBuilder.Core")]
[assembly: AssemblyCopyright("Copyright © HP Inc. 2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("3e3bf44a-0b69-45c5-9512-528cb48a7106")]
// 程序集的版本信息由下列四个值组成:
//
//      主版本
//      次版本
//      生成号
//      修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
VisionBuilder.Core/VisionBuilder.Core.csproj
New file
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{3E3BF44A-0B69-45C5-9512-528CB48A7106}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>VisionBuilder.Core</RootNamespace>
    <AssemblyName>VisionBuilder.Core</AssemblyName>
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Api\IProgram.cs" />
    <Compile Include="Api\ISequnce.cs" />
    <Compile Include="Api\IStep.cs" />
    <Compile Include="Api\IStepRunner.cs" />
    <Compile Include="Entity\Param.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
VisionBuilder.Engine/Properties/AssemblyInfo.cs
New file
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("VisionBuilder.Engine")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("HP Inc.")]
[assembly: AssemblyProduct("VisionBuilder.Engine")]
[assembly: AssemblyCopyright("Copyright © HP Inc. 2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("8e5e8a68-0b9d-4a6a-b325-730c64603fdf")]
// 程序集的版本信息由下列四个值组成:
//
//      主版本
//      次版本
//      生成号
//      修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
VisionBuilder.Engine/Runner.cs
New file
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VisionBuilder.Engine
{
    public class Runner
    {
    }
}
VisionBuilder.Engine/VisionBuilder.Engine.csproj
New file
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{8E5E8A68-0B9D-4A6A-B325-730C64603FDF}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>VisionBuilder.Engine</RootNamespace>
    <AssemblyName>VisionBuilder.Engine</AssemblyName>
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Runner.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\VisionBuilder.Core\VisionBuilder.Core.csproj">
      <Project>{3e3bf44a-0b69-45c5-9512-528cb48a7106}</Project>
      <Name>VisionBuilder.Core</Name>
    </ProjectReference>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
VisionBuilder.Test/PluginOne.cs
New file
@@ -0,0 +1,14 @@
using System.Collections.Generic;
using VisionBuilder.Core.Api;
using VisionBuilder.Core.Entity;
namespace VisionBuilder.Test
{
    public class PluginOne : IStepRunner
    {
        public void RunStep(Dictionary<string, Param> param)
        {
            param["yoho"] = new Param { Name = "1", Value = "2" };
        }
    }
}
VisionBuilder.Test/Properties/AssemblyInfo.cs
New file
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("VisionBuilder.Test")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("HP Inc.")]
[assembly: AssemblyProduct("VisionBuilder.Test")]
[assembly: AssemblyCopyright("Copyright © HP Inc. 2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("6e1cc97a-b3cb-4e9f-94e0-f264de0d8298")]
// 程序集的版本信息由下列四个值组成:
//
//      主版本
//      次版本
//      生成号
//      修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
VisionBuilder.Test/VisionBuilder.Test.csproj
New file
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{6E1CC97A-B3CB-4E9F-94E0-F264DE0D8298}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>VisionBuilder.Test</RootNamespace>
    <AssemblyName>VisionBuilder.Test</AssemblyName>
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="PluginOne.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\VisionBuilder.Core\VisionBuilder.Core.csproj">
      <Project>{3e3bf44a-0b69-45c5-9512-528cb48a7106}</Project>
      <Name>VisionBuilder.Core</Name>
    </ProjectReference>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
WPFProject.sln
File was deleted
WPFProject/App.config
WPFProject/App.xaml
WPFProject/App.xaml.cs
File was renamed from App.xaml.cs
@@ -13,15 +13,15 @@
    /// </summary>
    public partial class App : Application
    {
        public void test()
        public void test()
        {
           
        }
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            MainWindow window = new MainWindow();
            window.Show();
        }
        }
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            MainWindow window = new MainWindow();
            window.Show();
        }
    }
}
WPFProject/Controls/DpPlugin.cs
WPFProject/Controls/IconTabItem.cs
File was renamed from Controls/IconTabItem.cs
@@ -1,70 +1,70 @@
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace WPFProject.Controls
{
    public class IconTabItem : TabItem, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        protected void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                RaisePropertyChanged(propertyName);
            }
        }
        public IconTabItem() : base()
        {
            Visibility = Visibility.Collapsed;
        }
        private bool _isFont;
        public bool IsFont
        {
            get => _isFont;
            set => _isFont = value;
        }
        private Window _Body;
        public Window Body
        {
            get => _Body;
            set => _Body = value;
        }
        public BitmapImage Icon
        {
            get { return (BitmapImage)GetValue(IconProperty); }
            set { SetValue(IconProperty, value); }
        }
        public static readonly DependencyProperty IconProperty =
            DependencyProperty.Register("Icon", typeof(BitmapImage), typeof(IconTabItem), new PropertyMetadata(
                new BitmapImage(new System.Uri("pack://application:,,,/Resources/Icon/xinzeng_1.png"))));
        // 单Header的字体大小
        public double HeaderFontSize
        {
            get { return (double)GetValue(HeaderFontSizeProperty); }
            set { SetValue(HeaderFontSizeProperty, value); }
        }
        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty HeaderFontSizeProperty =
            DependencyProperty.Register("HeaderFontSize", typeof(double), typeof(IconTabItem), new PropertyMetadata(10.0));
    }
}
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace WPFProject.Controls
{
    public class IconTabItem : TabItem, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        protected void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                RaisePropertyChanged(propertyName);
            }
        }
        public IconTabItem() : base()
        {
            Visibility = Visibility.Collapsed;
        }
        private bool _isFont;
        public bool IsFont
        {
            get => _isFont;
            set => _isFont = value;
        }
        private Window _Body;
        public Window Body
        {
            get => _Body;
            set => _Body = value;
        }
        public BitmapImage Icon
        {
            get { return (BitmapImage)GetValue(IconProperty); }
            set { SetValue(IconProperty, value); }
        }
        public static readonly DependencyProperty IconProperty =
            DependencyProperty.Register("Icon", typeof(BitmapImage), typeof(IconTabItem), new PropertyMetadata(
                new BitmapImage(new System.Uri("pack://application:,,,/Resources/Icon/xinzeng_1.png"))));
        // 单Header的字体大小
        public double HeaderFontSize
        {
            get { return (double)GetValue(HeaderFontSizeProperty); }
            set { SetValue(HeaderFontSizeProperty, value); }
        }
        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty HeaderFontSizeProperty =
            DependencyProperty.Register("HeaderFontSize", typeof(double), typeof(IconTabItem), new PropertyMetadata(10.0));
    }
}
WPFProject/Controls/InnerWindow.xaml
WPFProject/Controls/InnerWindow.xaml.cs
File was renamed from Controls/InnerWindow.xaml.cs
@@ -20,7 +20,7 @@
    /// InnerWindow.xaml 的交互逻辑
    /// </summary>
    public partial class InnerWindow : UserControl, INotifyPropertyChanged
    {
    {
        #region INotifyPropertyChanged
        public virtual event PropertyChangedEventHandler PropertyChanged;
@@ -36,45 +36,45 @@
            {
                RaisePropertyChanged(propertyName);
            }
        }
        }
        #endregion
        #region 属性
        #region Common
        public DragType DragType { get; set; } = DragType.Canvas;
        public CanvasPosition canvasPosition;
        private Canvas canvas;
        public WindowState WindowState { get; set; } = WindowState.Normal;
        public AdornerDecorator ResizeAdornerDecorator { get => VisualTreeHelper.GetChild(this, 0) as AdornerDecorator; }
        public AdornerDecorator ResizeAdornerDecorator { get => VisualTreeHelper.GetChild(this, 0) as AdornerDecorator; }
        private string _Title;
        public string Title
        {
            get { return _Title; }
            set => RaiseAndSetIfChanged(ref _Title, value);
        }
        }
        public int Zindex
        {
            get
            get
            {
                return Canvas.GetZIndex(this);
            }
            set
            {
                Canvas.SetZIndex(this, value);
            }
        }
        #endregion
            }
        }
        #endregion
        #region 事件
        public event EventHandler MinEvent;
        public event EventHandler MaxEvent;
        public event EventHandler CloseEvent;
        public event EventHandler ZIndexEvent;
        #endregion
        public event EventHandler ZIndexEvent;
        #endregion
        #region DependencyProperty
        public Brush HeaderBackground
        {
@@ -94,11 +94,11 @@
        public static readonly DependencyProperty HeaderFontColorProperty =
            DependencyProperty.Register("HeaderFontColor", typeof(Brush), typeof(ProgramList),
                new PropertyMetadata(new SolidColorBrush(Color.FromRgb(255, 255, 225))));
        #endregion
        #endregion
                new PropertyMetadata(new SolidColorBrush(Color.FromRgb(255, 255, 225))));
        #endregion
        #endregion
        public InnerWindow() : this(null)
        {
@@ -131,8 +131,8 @@
                };
            }
            Loaded -= InnerWindow_Loaded;
        }
        }
        #region 拖拽移动相关
        private void DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
        {
@@ -179,7 +179,7 @@
        {
            canvasPosition.Top = Canvas.GetTop(this);
            canvasPosition.Left = Canvas.GetLeft(this);
        }
        }
        #endregion
        /// <summary>
@@ -205,22 +205,22 @@
            Canvas.SetLeft(this, canvasPosition == null ? 0 : canvasPosition.Left);
            Canvas.SetTop(this, canvasPosition == null ? 0 : canvasPosition.Top);
            canvas.SizeChanged += Canvas_SizeChanged;
        }
        private void Canvas_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            Size newSize = e.NewSize;
            Size previousSize = e.PreviousSize;
            double xRate = newSize.Width / previousSize.Width;
            double yRate = newSize.Height / previousSize.Height;
            Canvas.SetLeft(this, Canvas.GetLeft(this) * xRate);
            Canvas.SetTop(this, Canvas.GetTop(this) * yRate);
            this.Width = this.Width * xRate;
            this.Height = this.Height * yRate;
        }
        }
        private void Canvas_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            Size newSize = e.NewSize;
            Size previousSize = e.PreviousSize;
            double xRate = newSize.Width / previousSize.Width;
            double yRate = newSize.Height / previousSize.Height;
            Canvas.SetLeft(this, Canvas.GetLeft(this) * xRate);
            Canvas.SetTop(this, Canvas.GetTop(this) * yRate);
            this.Width = this.Width * xRate;
            this.Height = this.Height * yRate;
        }
        private void Min_Click(object sender, RoutedEventArgs e)
        {
            MinEvent?.Invoke(this, null);
@@ -244,12 +244,12 @@
        private void Grid_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            this.Focus();
        }
        private void UserControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
        }
        }
        private void UserControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
        }
    }
    public enum DragType
WPFProject/Controls/MenuTabControl.xaml
WPFProject/Controls/MenuTabControl.xaml.cs
WPFProject/Controls/MinInnerWindow.xaml
WPFProject/Controls/MinInnerWindow.xaml.cs
WPFProject/Events/TabChange.cs
WPFProject/Forms/Form1.Designer.cs
WPFProject/Forms/Form1.cs
WPFProject/Forms/Form1.resx
WPFProject/MainWindow.xaml
WPFProject/MainWindow.xaml.cs
WPFProject/Models/CanvasPosition.cs
WPFProject/Models/FuncModel.cs
File was renamed from Models/FuncModel.cs
@@ -1,24 +1,24 @@
using System.Collections.ObjectModel;
namespace WPFProject.Models
{
    public class FuncModel : NotifyBase
    {
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set => RaiseAndSetIfChanged(ref _Name, value);
        }
        private ObservableCollection<FuncModel> _Children;
        public ObservableCollection<FuncModel> Children
        {
            get { return _Children; }
            set => RaiseAndSetIfChanged(ref _Children, value);
        }
    }
}
using System.Collections.ObjectModel;
namespace WPFProject.Models
{
    public class FuncModel : NotifyBase
    {
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set => RaiseAndSetIfChanged(ref _Name, value);
        }
        private ObservableCollection<FuncModel> _Children;
        public ObservableCollection<FuncModel> Children
        {
            get { return _Children; }
            set => RaiseAndSetIfChanged(ref _Children, value);
        }
    }
}
WPFProject/Models/NotifyBase.cs
File was renamed from Models/NotifyBase.cs
@@ -1,31 +1,31 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace WPFProject.Models
{
    public class NotifyBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        protected void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                RaisePropertyChanged(propertyName);
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace WPFProject.Models
{
    public class NotifyBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        protected void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                RaisePropertyChanged(propertyName);
            }
        }
    }
}
WPFProject/Models/Program.cs
File was renamed from Models/Program.cs
@@ -1,85 +1,83 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using VisionBuilder.Core.Entity;
namespace WPFProject.Models
{
    public class Program : NotifyBase
    {
        /// <summary>
        /// 程序名
        /// </summary>
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set => RaiseAndSetIfChanged(ref _Name, value);
        }
        /// <summary>
        /// 序列集合
        /// </summary>
        private ObservableCollection<Sequence> _Sequences = new ObservableCollection<Sequence>();
        public ObservableCollection<Sequence> Sequences
        {
            get { return _Sequences; }
            set => RaiseAndSetIfChanged(ref _Sequences, value);
        }
        /// <summary>
        /// 程序所需参数
        /// </summary>
        private ObservableCollection<Variable> _Variables;
        public ObservableCollection<Variable> Variables
        {
            get { return _Variables; }
            set => RaiseAndSetIfChanged(ref _Variables, value);
        }
        /// <summary>
        /// 初始参数参数
        /// </summary>
        private Dictionary<string, Variable> _InitVars;
        [XmlIgnore]
        public Dictionary<string, Variable> InitVars
        {
            get { return _InitVars; }
            set { _InitVars = value; }
        }
        /// <summary>
        /// 计算临时参数
        /// </summary>
        private Dictionary<string, Param> _TempVars;
        [XmlIgnore]
        public Dictionary<string, Param> TempVars
        {
            get { return _TempVars; }
            set { _TempVars = value; }
        }
        public Program AddSequnce(params Sequence[] sequences)
        {
            foreach (Sequence sequence in sequences)
            {
                if (sequence == null) continue;
                sequence.Program = this;
                Sequences.Add(sequence);
            }
            return this;
        }
        public void Run()
        {
            foreach (Sequence sequence in Sequences)
            {
                sequence.Run();
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Xml.Serialization;
using VisionBuilder.Core.Api;
using VisionBuilder.Core.Entity;
namespace WPFProject.Models
{
    public class Program : NotifyBase, IProgram
    {
        /// <summary>
        /// 程序名
        /// </summary>
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set => RaiseAndSetIfChanged(ref _Name, value);
        }
        /// <summary>
        /// 序列集合
        /// </summary>
        private ObservableCollection<Sequence> _Sequences = new ObservableCollection<Sequence>();
        public ObservableCollection<Sequence> Sequences
        {
            get { return _Sequences; }
            set => RaiseAndSetIfChanged(ref _Sequences, value);
        }
        /// <summary>
        /// 程序所需参数
        /// </summary>
        private ObservableCollection<Variable> _Variables;
        public ObservableCollection<Variable> Variables
        {
            get { return _Variables; }
            set => RaiseAndSetIfChanged(ref _Variables, value);
        }
        /// <summary>
        /// 初始参数参数
        /// </summary>
        private Dictionary<string, Variable> _InitVars;
        [XmlIgnore]
        public Dictionary<string, Variable> InitVars
        {
            get { return _InitVars; }
            set { _InitVars = value; }
        }
        /// <summary>
        /// 计算临时参数
        /// </summary>
        private Dictionary<string, Param> _TempVars = new Dictionary<string, Param>();
        [XmlIgnore]
        public Dictionary<string, Param> TempVars
        {
            get { return _TempVars; }
            set { _TempVars = value; }
        }
        public Program AddSequnce(params Sequence[] sequences)
        {
            foreach (Sequence sequence in sequences)
            {
                if (sequence == null) continue;
                sequence.Program = this;
                Sequences.Add(sequence);
            }
            return this;
        }
        public void RunProgram()
        {
            foreach (Sequence sequence in Sequences)
            {
                sequence.RunSequnce();
            }
        }
    }
}
WPFProject/Models/Sequence.cs
File was renamed from Models/Sequence.cs
@@ -1,5 +1,7 @@
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Xml.Serialization;
using VisionBuilder.Core.Api;
namespace WPFProject.Models
{
@@ -11,38 +13,41 @@
        {
            get { return _Name; }
            set => RaiseAndSetIfChanged(ref _Name, value);
        }
        }
        [XmlIgnore]
        public Program Program { get; set; }
        private ObservableCollection<Step> _Steps = new ObservableCollection<Step>() {
            new Step{ Name = "000"},new Step{ Name="111"}
        };
        private ObservableCollection<Step> _Steps = new ObservableCollection<Step>();
        public ObservableCollection<Step> Steps
        {
            get { return _Steps; }
            set => RaiseAndSetIfChanged(ref _Steps, value);
        }
        public Sequence AddStep(params Step[] steps)
        {
            foreach (Step step in steps)
        public Sequence AddStep(params Step[] steps)
        {
            foreach (Step step in steps)
            {
                if (step == null) continue;
                step.Program = Program;
                step.Sequence = this;
                Steps.Add(step);
            }
            return this;
        }
        public void Run()
        {
            foreach (Step step in Steps) {
                step.Run();
        public void RunSequnce()
        {
            foreach (Step step in Steps)
            {
                step.RunStep();
            }
        }
        public Sequence()
        {
            AddStep(new Step { Name = "000" }, new Step { Name = "111" });
        }
    }
}
WPFProject/Models/Step.cs
New file
@@ -0,0 +1,75 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Xml.Serialization;
using VisionBuilder.Core.Api;
namespace WPFProject.Models
{
    public class Step : NotifyBase
    {
        private static readonly Type InterfaceType = typeof(IStepRunner);
        private static readonly Dictionary<string, Assembly> Cache = new Dictionary<string, Assembly>();
        #region 字段
        [XmlIgnore]
        public Program Program { get; set; }
        [XmlIgnore]
        public Sequence Sequence { get; set; }
        private int _Index;
        public int Index
        {
            get { return _Index; }
            set => RaiseAndSetIfChanged(ref _Index, value);
        }
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set => RaiseAndSetIfChanged(ref _Name, value);
        }
        private string _DllPath = "C:/Users/cheng/source/repos/WPFProject/VisionBuilder.Test/bin/Debug/VisionBuilder.Test.dll";
        public string DllPath
        {
            get { return _DllPath; }
            set => RaiseAndSetIfChanged(ref _DllPath, value);
        }
        private string _ClassName = "VisionBuilder.Test.PluginOne";
        public string ClassName
        {
            get { return _ClassName; }
            set => RaiseAndSetIfChanged(ref _ClassName, value);
        }
        private string _MethodName;
        public string MethodName
        {
            get { return _MethodName; }
            set => RaiseAndSetIfChanged(ref _MethodName, value);
        }
        private string _Description;
        public string Description
        {
            get { return _Description; }
            set => RaiseAndSetIfChanged(ref _Description, value);
        }
        #endregion
        public void RunStep()
        {
            Assembly assembly = Assembly.LoadFrom(DllPath);
            Type type = assembly.GetType(ClassName);
            if (type != null && InterfaceType.IsAssignableFrom(type))
            {
                IStepRunner stepRunner = (IStepRunner)assembly.CreateInstance(ClassName);
                stepRunner.RunStep(Sequence.Program.TempVars);
            }
        }
    }
}
WPFProject/Models/Variable.cs
File was renamed from Models/Variable.cs
@@ -1,61 +1,61 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace WPFProject.Models
{
    public class Variable : NotifyBase
    {
        /// <summary>
        /// 参数名
        /// </summary>
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set => RaiseAndSetIfChanged(ref _Name, value);
        }
        /// <summary>
        /// 参数类型
        /// </summary>
        private string _TypeName;
        public string TypeName
        {
            get { return _TypeName; }
            set
            {
                RaiseAndSetIfChanged(ref _TypeName, value);
                Type = value == null ? null : Type.GetType(value);
            }
        }
        [XmlIgnore]
        public Type Type { get; private set; }
        /// <summary>
        /// 值字符
        /// </summary>
        private string _ValueStr;
        public string ValueStr
        {
            get { return _ValueStr; }
            set => RaiseAndSetIfChanged(ref _ValueStr, value);
        }
        /// <summary>
        /// 参数值
        /// </summary>
        private object _Value;
        public object Value
        {
            get { return _Value; }
            set { _Value = value; }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace WPFProject.Models
{
    public class Variable : NotifyBase
    {
        /// <summary>
        /// 参数名
        /// </summary>
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set => RaiseAndSetIfChanged(ref _Name, value);
        }
        /// <summary>
        /// 参数类型
        /// </summary>
        private string _TypeName;
        public string TypeName
        {
            get { return _TypeName; }
            set
            {
                RaiseAndSetIfChanged(ref _TypeName, value);
                Type = value == null ? null : Type.GetType(value);
            }
        }
        [XmlIgnore]
        public Type Type { get; private set; }
        /// <summary>
        /// 值字符
        /// </summary>
        private string _ValueStr;
        public string ValueStr
        {
            get { return _ValueStr; }
            set => RaiseAndSetIfChanged(ref _ValueStr, value);
        }
        /// <summary>
        /// 参数值
        /// </summary>
        private object _Value;
        public object Value
        {
            get { return _Value; }
            set { _Value = value; }
        }
    }
}
WPFProject/Properties/AssemblyInfo.cs
WPFProject/Properties/Resources.Designer.cs
WPFProject/Properties/Resources.resx
WPFProject/Properties/Settings.Designer.cs
WPFProject/Properties/Settings.settings
WPFProject/Resources/Font/Font.xaml
WPFProject/Resources/Font/iconfont.ttf
Binary files differ
WPFProject/Resources/Icon/xinzeng_1.png

WPFProject/Style/Colors.xaml
WPFProject/Style/CommonTree.xaml
File was renamed from Style/CommonTree.xaml
@@ -1,51 +1,51 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:hc="https://handyorg.github.io/handycontrol"
                    >
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
        <ResourceDictionary Source="/WPFProject;component/Style/colors.xaml"/>
    </ResourceDictionary.MergedDictionaries>
    <Style TargetType="TreeViewItem" BasedOn="{StaticResource TreeViewItemBaseStyle}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TreeViewItem">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition MinHeight="{TemplateBinding MinHeight}"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <Border x:Name="Bd" CornerRadius="{Binding Path=(hc:BorderElement.CornerRadius),RelativeSource={RelativeSource TemplatedParent}}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                            <DockPanel LastChildFill="True" Margin="{Binding Converter={StaticResource TreeViewItemMarginConverter}, RelativeSource={RelativeSource TemplatedParent}}">
                                <ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}"/>
                                <ContentPresenter VerticalAlignment="Center" x:Name="PART_Header" ContentSource="Header" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </DockPanel>
                        </Border>
                        <ItemsPresenter Grid.Row="1" x:Name="ItemsHost" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="true" SourceName="Bd">
                            <Setter Property="Background" TargetName="Bd" Value="{StaticResource SecondaryImportant}"/>
                        </Trigger>
                        <Trigger Property="IsExpanded" Value="false">
                            <Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/>
                        </Trigger>
                        <Trigger Property="HasItems" Value="false">
                            <Setter Property="Visibility" TargetName="Expander" Value="Hidden"/>
                        </Trigger>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Background" TargetName="Bd" Value="{StaticResource Important}"/>
                            <Setter Property="Foreground" Value="{DynamicResource TextIconBrush}"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Opacity" Value=".4" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:hc="https://handyorg.github.io/handycontrol"
                    >
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
        <ResourceDictionary Source="/WPFProject;component/Style/colors.xaml"/>
    </ResourceDictionary.MergedDictionaries>
    <Style TargetType="TreeViewItem" BasedOn="{StaticResource TreeViewItemBaseStyle}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TreeViewItem">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition MinHeight="{TemplateBinding MinHeight}"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <Border x:Name="Bd" CornerRadius="{Binding Path=(hc:BorderElement.CornerRadius),RelativeSource={RelativeSource TemplatedParent}}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                            <DockPanel LastChildFill="True" Margin="{Binding Converter={StaticResource TreeViewItemMarginConverter}, RelativeSource={RelativeSource TemplatedParent}}">
                                <ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}"/>
                                <ContentPresenter VerticalAlignment="Center" x:Name="PART_Header" ContentSource="Header" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </DockPanel>
                        </Border>
                        <ItemsPresenter Grid.Row="1" x:Name="ItemsHost" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="true" SourceName="Bd">
                            <Setter Property="Background" TargetName="Bd" Value="{StaticResource SecondaryImportant}"/>
                        </Trigger>
                        <Trigger Property="IsExpanded" Value="false">
                            <Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/>
                        </Trigger>
                        <Trigger Property="HasItems" Value="false">
                            <Setter Property="Visibility" TargetName="Expander" Value="Hidden"/>
                        </Trigger>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Background" TargetName="Bd" Value="{StaticResource Important}"/>
                            <Setter Property="Foreground" Value="{DynamicResource TextIconBrush}"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Opacity" Value=".4" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
WPFProject/Style/ListViewStyle.xaml
WPFProject/Style/MainTab.xaml
File was renamed from Style/MainTab.xaml
@@ -19,19 +19,19 @@
                        Foreground="{TemplateBinding Foreground}" />
                    </Border>
                    <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabControl}}, Path=TabStripPlacement}" Value="Left">
                            <Setter Property="BorderThickness" TargetName="templateRoot" Value="0,0,3,0"/>
                            <Setter Property="Padding" TargetName="templateRoot" Value="3,3,0,3"/>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabControl}}, Path=TabStripPlacement}" Value="Left">
                            <Setter Property="BorderThickness" TargetName="templateRoot" Value="0,0,3,0"/>
                            <Setter Property="Padding" TargetName="templateRoot" Value="3,3,0,3"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabControl}}, Path=TabStripPlacement}" Value="Right">
                            <Setter Property="BorderThickness" TargetName="templateRoot" Value="3,0,0,0"/>
                            <Setter Property="Padding" TargetName="templateRoot" Value="0,3,3,3"/>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabControl}}, Path=TabStripPlacement}" Value="Right">
                            <Setter Property="BorderThickness" TargetName="templateRoot" Value="3,0,0,0"/>
                            <Setter Property="Padding" TargetName="templateRoot" Value="0,3,3,3"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabControl}}, Path=TabStripPlacement}" Value="Right">
                            <Setter Property="BorderThickness" TargetName="templateRoot" Value="0,3,0,0"/>
                            <Setter Property="Padding" TargetName="templateRoot" Value="3,0,3,3"/>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabControl}}, Path=TabStripPlacement}" Value="Right">
                            <Setter Property="BorderThickness" TargetName="templateRoot" Value="0,3,0,0"/>
                            <Setter Property="Padding" TargetName="templateRoot" Value="3,0,3,3"/>
                        </DataTrigger>
                        <MultiDataTrigger>
WPFProject/Style/WindowResources.xaml
WPFProject/UI/BottomBar.xaml
WPFProject/UI/BottomBar.xaml.cs
WPFProject/UI/StepSetting.xaml
File was renamed from UI/StepSetting.xaml
@@ -12,7 +12,7 @@
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/colors.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/colors.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/MainTab.xaml"/>
            </ResourceDictionary.MergedDictionaries>
WPFProject/UI/StepSetting.xaml.cs
WPFProject/UI/Test/FunctionSetting.xaml
File was renamed from UI/Test/FunctionSetting.xaml
@@ -1,54 +1,54 @@
<UserControl x:Class="WPFProject.UI.Test.FunctionSetting"
             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:WPFProject.UI.Test"
             xmlns:dd="urn:gong-wpf-dragdrop"
             xmlns:m="clr-namespace:WPFProject.Models"
             xmlns:util="clr-namespace:WPFProject.Utils"
             xmlns:hc="https://handyorg.github.io/handycontrol"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/colors.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/CommonTree.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/MainTab.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <Style TargetType="Label"/>
            <Style TargetType="TabControl"/>
            <Style TargetType="TreeView">
            </Style>
        </ResourceDictionary>
    </UserControl.Resources>
    <Grid>
        <TabControl Style="{StaticResource ControlStyle}">
            <TabItem Header="函数列表">
                <StackPanel>
                    <hc:SearchBar hc:InfoElement.Placeholder="输入文本查询"  Style="{StaticResource SearchBarPlus}" Margin="10,5,10,5"/>
                    <TreeView BorderThickness="0" ItemsSource="{Binding FuncModels}"
                              dd:DragDrop.IsDragSource="True"
                                dd:DragDrop.ShowAlwaysDropTargetAdorner="True"
                                dd:DragDrop.UseDefaultDragAdorner="True"
                                dd:DragDrop.DragHandler="{Binding dragHandler}"
                              >
                        <TreeView.ItemTemplate>
                            <HierarchicalDataTemplate DataType="{x:Type m:FuncModel}" ItemsSource="{Binding Path=Children}">
                                <ContentControl Content="{Binding Name}"/>
                            </HierarchicalDataTemplate>
                        </TreeView.ItemTemplate>
                    </TreeView>
                </StackPanel>
            </TabItem>
            <TabItem Header="变量列表">
            </TabItem>
        </TabControl>
    </Grid>
</UserControl>
<UserControl x:Class="WPFProject.UI.Test.FunctionSetting"
             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:WPFProject.UI.Test"
             xmlns:dd="urn:gong-wpf-dragdrop"
             xmlns:m="clr-namespace:WPFProject.Models"
             xmlns:util="clr-namespace:WPFProject.Utils"
             xmlns:hc="https://handyorg.github.io/handycontrol"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/colors.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/CommonTree.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/MainTab.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <Style TargetType="Label"/>
            <Style TargetType="TabControl"/>
            <Style TargetType="TreeView">
            </Style>
        </ResourceDictionary>
    </UserControl.Resources>
    <Grid>
        <TabControl Style="{StaticResource ControlStyle}">
            <TabItem Header="函数列表">
                <StackPanel>
                    <hc:SearchBar hc:InfoElement.Placeholder="输入文本查询"  Style="{StaticResource SearchBarPlus}" Margin="10,5,10,5"/>
                    <TreeView BorderThickness="0" ItemsSource="{Binding FuncModels}"
                              dd:DragDrop.IsDragSource="True"
                                dd:DragDrop.ShowAlwaysDropTargetAdorner="True"
                                dd:DragDrop.UseDefaultDragAdorner="True"
                                dd:DragDrop.DragHandler="{Binding dragHandler}"
                              >
                        <TreeView.ItemTemplate>
                            <HierarchicalDataTemplate DataType="{x:Type m:FuncModel}" ItemsSource="{Binding Path=Children}">
                                <ContentControl Content="{Binding Name}"/>
                            </HierarchicalDataTemplate>
                        </TreeView.ItemTemplate>
                    </TreeView>
                </StackPanel>
            </TabItem>
            <TabItem Header="变量列表">
            </TabItem>
        </TabControl>
    </Grid>
</UserControl>
WPFProject/UI/Test/FunctionSetting.xaml.cs
File was renamed from UI/Test/FunctionSetting.xaml.cs
@@ -24,22 +24,22 @@
    /// <summary>
    /// FunctionSetting.xaml 的交互逻辑
    /// </summary>
    public partial class FunctionSetting : UserControl, INotifyPropertyChanged
    {
        public virtual event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        protected void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                RaisePropertyChanged(propertyName);
            }
    public partial class FunctionSetting : UserControl, INotifyPropertyChanged
    {
        public virtual event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        protected void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                RaisePropertyChanged(propertyName);
            }
        }
        public FunctionSetting()
@@ -50,29 +50,29 @@
        public DdDragHandler dragHandler { get; set; } = new DdDragHandler();
        private ObservableCollection<FuncModel> _FuncModels = new ObservableCollection<FuncModel>() {
            new FuncModel(){
                Name = "111",
                Children = new ObservableCollection<FuncModel>(){
                    new FuncModel(){ Name = "1123"},
                    new FuncModel(){ Name = "1223"},
                }
            },
            new FuncModel()
            {
                Name = "222",
                Children = new ObservableCollection<FuncModel>(){
                    new FuncModel(){ Name = "2123"},
                    new FuncModel(){ Name = "2223"},
                }
            }
        };
        public ObservableCollection<FuncModel> FuncModels
        {
            get { return _FuncModels; }
            set => RaiseAndSetIfChanged(ref _FuncModels, value);
        }
        private ObservableCollection<FuncModel> _FuncModels = new ObservableCollection<FuncModel>() {
            new FuncModel(){
                Name = "111",
                Children = new ObservableCollection<FuncModel>(){
                    new FuncModel(){ Name = "1123"},
                    new FuncModel(){ Name = "1223"},
                }
            },
            new FuncModel()
            {
                Name = "222",
                Children = new ObservableCollection<FuncModel>(){
                    new FuncModel(){ Name = "2123"},
                    new FuncModel(){ Name = "2223"},
                }
            }
        };
        public ObservableCollection<FuncModel> FuncModels
        {
            get { return _FuncModels; }
            set => RaiseAndSetIfChanged(ref _FuncModels, value);
        }
    }
}
WPFProject/UI/Test/ProgramList.xaml
File was renamed from UI/Test/ProgramList.xaml
@@ -1,36 +1,36 @@
<UserControl x:Class="WPFProject.UI.Test.ProgramList"
             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:WPFProject.UI.Test"
             xmlns:vm="clr-namespace:WPFProject.ViewModels"
             xmlns:dd="urn:gong-wpf-dragdrop"
             mc:Ignorable="d"
             HorizontalAlignment="Stretch"
             HorizontalContentAlignment="Stretch"
             Background="#FFF" >
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/WPFProject;component/Style/ListViewStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <Style TargetType="Label"></Style>
        </ResourceDictionary>
    </UserControl.Resources>
    <Grid>
        <ListView ItemsSource="{Binding Programs}" ItemContainerStyle="{StaticResource a}"
                  VerticalContentAlignment="Center"
                  SelectionChanged="ListView_SelectionChanged">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ContentControl Content="{Binding Name}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</UserControl>
<UserControl x:Class="WPFProject.UI.Test.ProgramList"
             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:WPFProject.UI.Test"
             xmlns:vm="clr-namespace:WPFProject.ViewModels"
             xmlns:dd="urn:gong-wpf-dragdrop"
             mc:Ignorable="d"
             HorizontalAlignment="Stretch"
             HorizontalContentAlignment="Stretch"
             Background="#FFF" >
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/WPFProject;component/Style/ListViewStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <Style TargetType="Label"></Style>
        </ResourceDictionary>
    </UserControl.Resources>
    <Grid>
        <ListView ItemsSource="{Binding Programs}" ItemContainerStyle="{StaticResource a}"
                  VerticalContentAlignment="Center"
                  SelectionChanged="ListView_SelectionChanged">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ContentControl Content="{Binding Name}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</UserControl>
WPFProject/UI/Test/ProgramList.xaml.cs
File was renamed from UI/Test/ProgramList.xaml.cs
@@ -1,78 +1,80 @@
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Runtime.CompilerServices;
using System.Windows.Controls;
using System.Xml.Serialization;
using WPFProject.Models;
using WPFProject.Utils;
namespace WPFProject.UI.Test
{
    /// <summary>
    /// ProgramList.xaml 的交互逻辑
    /// </summary>
    public partial class ProgramList : UserControl, INotifyPropertyChanged
    {
        public virtual event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        protected void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                RaisePropertyChanged(propertyName);
            }
        }
        private ObservableCollection<Program> _Programs = new ObservableCollection<Program> {
            new Program{ Name="123"}.AddSequnce(new Sequence{
                    Name="S123"
                },new Sequence
                {
                    Name="S223"
                }),
            new Program{ Name="223"}.AddSequnce(new Sequence{
                    Name="D123"
                },new Sequence
                {
                    Name="D223"
                })
        };
        public ObservableCollection<Program> Programs
        {
            get { return _Programs; }
            set => RaiseAndSetIfChanged(ref _Programs, value);
        }
        public ProgramList()
        {
            DataContext = this;
            InitializeComponent();
        }
        public event EventHandler<Program> ProgramChanged;
        private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ttt();
            if (e.AddedItems.Count > 0)
            {
                ProgramChanged?.Invoke(this, e.AddedItems[0] as Program);
            }
        }
        public void ttt()
        {
            string path = "X:\\vs\\WPFProject\\test.xml";
            XmlUtil.SerialToFile(Programs, path);
        }
    }
}
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Runtime.CompilerServices;
using System.Windows.Controls;
using System.Xml.Serialization;
using WPFProject.Models;
using WPFProject.Utils;
namespace WPFProject.UI.Test
{
    /// <summary>
    /// ProgramList.xaml 的交互逻辑
    /// </summary>
    public partial class ProgramList : UserControl, INotifyPropertyChanged
    {
        public virtual event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        protected void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                RaisePropertyChanged(propertyName);
            }
        }
        private ObservableCollection<Program> _Programs = new ObservableCollection<Program> {
           new Program{ Name="123"}.AddSequnce(new Sequence{
                    Name="S123"
                },new Sequence
                {
                    Name="S223"
                }),
           new Program{ Name="223"}.AddSequnce(new Sequence{
                    Name="D123"
                },new Sequence
                {
                    Name="D223"
                })
        };
        public ObservableCollection<Program> Programs
        {
            get { return _Programs; }
            set => RaiseAndSetIfChanged(ref _Programs, value);
        }
        public ProgramList()
        {
            DataContext = this;
            InitializeComponent();
        }
        public event EventHandler<Program> ProgramChanged;
        private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ttt();
            if (e.AddedItems.Count > 0)
            {
                Program program = e.AddedItems[0] as Program;
                ProgramChanged?.Invoke(this, program);
                program.RunProgram();
            }
        }
        public void ttt()
        {
            //string path = "X:\\vs\\WPFProject\\test.xml";
            //XmlUtil.SerialToFile(Programs, path);
        }
    }
}
WPFProject/UI/Test/SequnceList.xaml
File was renamed from UI/Test/SequnceList.xaml
@@ -1,226 +1,226 @@
<UserControl x:Class="WPFProject.UI.Test.SequnceList"
             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:WPFProject.UI.Test"
             xmlns:hc="https://handyorg.github.io/handycontrol"
             xmlns:dd="urn:gong-wpf-dragdrop"
             mc:Ignorable="d"
             Background="#FFF"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/colors.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/WindowResources.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/ListViewStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <Style TargetType="Label"></Style>
            <Style TargetType="ListView"></Style>
            <Style TargetType="DataGridRow" x:Key="CommonRow" BasedOn="{StaticResource DataGridRowStyle}">
                <Setter Property="Margin" Value="0"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="DataGridRow">
                            <SelectiveScrollingGrid>
                                <SelectiveScrollingGrid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </SelectiveScrollingGrid.ColumnDefinitions>
                                <SelectiveScrollingGrid.RowDefinitions>
                                    <RowDefinition Height="*"/>
                                    <RowDefinition Height="Auto"/>
                                </SelectiveScrollingGrid.RowDefinitions>
                                <Border Grid.ColumnSpan="2" x:Name="DGR_Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"/>
                                <DataGridCellsPresenter MinHeight="{TemplateBinding MinHeight}" VerticalContentAlignment="Center" Grid.Row="0" Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                <DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType=DataGrid}}" Visibility="{TemplateBinding DetailsVisibility}"/>
                                <DataGridRowHeader Grid.Row="0" Grid.Column="0" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                            </SelectiveScrollingGrid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Background" Value="{StaticResource SecondaryImportant}"/>
                    </Trigger>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="{StaticResource Important}"/>
                        <Setter Property="TextElement.Foreground" Value="#FFF"/>
                    </Trigger>
                    <!--<MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="true"/>
                            <Condition Property="Selector.IsSelectionActive" Value="false"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" Value="{DynamicResource DarkDefaultBrush}"/>
                        <Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
                    </MultiTrigger>-->
                </Style.Triggers>
            </Style>
            <Style TargetType="DataGridColumnHeader" x:Key="CommonColumnHeader">
                <Setter Property="BorderBrush" Value="{Binding Path=HorizontalGridLinesBrush,RelativeSource={RelativeSource FindAncestor,AncestorType=DataGrid}}"/>
                <Setter Property="BorderThickness" Value="0,1,1,1"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.DisplayIndex}" Value="0">
                        <Setter Property="BorderThickness" Value="1,1,1,1"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
            <Style TargetType="DataGridCell" x:Key="CommonCell" BasedOn="{StaticResource DataGridCellStyle}">
                <Setter Property="BorderBrush" Value="{Binding Path=HorizontalGridLinesBrush,RelativeSource={RelativeSource FindAncestor,AncestorType=DataGrid}}"/>
                <Setter Property="BorderThickness" Value="0,0,1,1"/>
                <Setter Property="Padding" Value="0"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="DataGridCell">
                            <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.DisplayIndex}" Value="0">
                        <Setter Property="BorderThickness" Value="1,0,1,1"/>
                    </DataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected,RelativeSource={RelativeSource Self}}" Value="true"/>
                            <Condition Binding="{Binding SelectionUnit,RelativeSource={RelativeSource FindAncestor,AncestorType=DataGrid}}" Value="Cell"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Foreground" Value="{StaticResource ImportantFont}"/>
                        <Setter Property="Background" Value="{StaticResource Important}"/>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected,RelativeSource={RelativeSource Self}}" Value="true"/>
                            <Condition Binding="{Binding IsSelected,RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="False"/>
                            <Condition Binding="{Binding SelectionUnit,RelativeSource={RelativeSource FindAncestor,AncestorType=DataGrid}}" Value="CellOrRowHeader"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Foreground" Value="{StaticResource ImportantFont}"/>
                        <Setter Property="Background" Value="{StaticResource Important}"/>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected,RelativeSource={RelativeSource Self}}" Value="true"/>
                            <Condition Binding="{Binding IsSelected,RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="True"/>
                            <Condition Binding="{Binding SelectionUnit,RelativeSource={RelativeSource FindAncestor,AncestorType=DataGrid}}" Value="CellOrRowHeader"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Foreground" Value="{StaticResource ImportantFont}"/>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected,RelativeSource={RelativeSource Self}}" Value="true"/>
                            <Condition Binding="{Binding SelectionUnit,RelativeSource={RelativeSource FindAncestor,AncestorType=DataGrid}}" Value="FullRow"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Foreground" Value="{StaticResource ImportantFont}"/>
                    </MultiDataTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="true"/>
                            <Condition Property="Selector.IsSelectionActive" Value="false"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Foreground" Value="{StaticResource ImportantFont}"/>
                        <Setter Property="Background" Value="{StaticResource Important}"/>
                    </MultiTrigger>
                </Style.Triggers>
            </Style>
            <Style TargetType="DataGrid" BasedOn="{StaticResource DataGridBaseStyle}">
                <Setter Property="GridLinesVisibility" Value="None"/>
                <Setter Property="HorizontalGridLinesBrush" Value="Gray"/>
                <Setter Property="RowStyle" Value="{StaticResource CommonRow}"/>
                <Setter Property="CellStyle" Value="{StaticResource CommonCell}"/>
                <Setter Property="ColumnHeaderStyle" Value="{StaticResource CommonColumnHeader}"/>
                <Setter Property="hc:BorderElement.CornerRadius" Value="0" />
                <Setter Property="RowHeight" Value="30"/>
            </Style>
        </ResourceDictionary>
    </UserControl.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="3*"/>
            <ColumnDefinition Width="2"/>
            <ColumnDefinition Width="7*"/>
        </Grid.ColumnDefinitions>
        <ListView ItemContainerStyle="{StaticResource a}" ItemsSource="{Binding Sequences}" BorderThickness="0"
                  dd:DragDrop.IsDragSource="True"
                  dd:DragDrop.IsDropTarget="True"
                  dd:DragDrop.ShowAlwaysDropTargetAdorner="True"
                  dd:DragDrop.UseDefaultDragAdorner="True"
                  SelectionChanged="ListView_SelectionChanged">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ContentControl Content="{Binding Name}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <GridSplitter Grid.Column="1" Background="LightGray" HorizontalAlignment="Center" Width="2" ResizeDirection="Columns"/>
        <Grid Grid.Column="2">
            <Grid.RowDefinitions>
                <RowDefinition Height="30"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Label Content="测试流程" VerticalContentAlignment="Center"/>
            <DataGrid x:Name="dataGrid" AutoGenerateColumns="False"
                      CanUserAddRows="False"
                      CanUserSortColumns="False"
                      FrozenColumnCount="1" Background="#FFF" Grid.Row="1"
                      BorderThickness="0"
                      dd:DragDrop.IsDragSource="True"
                      dd:DragDrop.IsDropTarget="True"
                      dd:DragDrop.ShowAlwaysDropTargetAdorner="True"
                      dd:DragDrop.UseDefaultDragAdorner="True"
                      dd:DragDrop.SelectDroppedItems="True"
                      dd:DragDrop.DropHandler="{Binding dropHandler}"
                      ItemsSource="{Binding Steps}">
                <DataGrid.Columns>
                    <DataGridTextColumn IsReadOnly="True" Binding="{Binding Index}" Header="序号"/>
                    <DataGridTextColumn Header="标题1" Binding="{Binding Name}"></DataGridTextColumn>
                    <DataGridTextColumn Header="标题2" Binding="{Binding Name}"></DataGridTextColumn>
                    <DataGridTextColumn Header="标题3" Binding="{Binding Name}"></DataGridTextColumn>
                    <DataGridTextColumn Header="标题4" Binding="{Binding Name}"></DataGridTextColumn>
                    <DataGridTemplateColumn x:Name="opt" Width="*" Header="操作">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <Button Style="{StaticResource LinkButton}" Margin="0,0,20,0">编辑</Button>
                                    <Button Style="{StaticResource LinkButton}">删除</Button>
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
            <!--<ListView >
                <ListView.View>
                    <GridView>
                    </GridView>
                </ListView.View>
            </ListView>-->
        </Grid>
    </Grid>
</UserControl>
<UserControl x:Class="WPFProject.UI.Test.SequnceList"
             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:WPFProject.UI.Test"
             xmlns:hc="https://handyorg.github.io/handycontrol"
             xmlns:dd="urn:gong-wpf-dragdrop"
             mc:Ignorable="d"
             Background="#FFF"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/colors.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/WindowResources.xaml"/>
                <ResourceDictionary Source="/WPFProject;component/Style/ListViewStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <Style TargetType="Label"></Style>
            <Style TargetType="ListView"></Style>
            <Style TargetType="DataGridRow" x:Key="CommonRow" BasedOn="{StaticResource DataGridRowStyle}">
                <Setter Property="Margin" Value="0"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="DataGridRow">
                            <SelectiveScrollingGrid>
                                <SelectiveScrollingGrid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </SelectiveScrollingGrid.ColumnDefinitions>
                                <SelectiveScrollingGrid.RowDefinitions>
                                    <RowDefinition Height="*"/>
                                    <RowDefinition Height="Auto"/>
                                </SelectiveScrollingGrid.RowDefinitions>
                                <Border Grid.ColumnSpan="2" x:Name="DGR_Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"/>
                                <DataGridCellsPresenter MinHeight="{TemplateBinding MinHeight}" VerticalContentAlignment="Center" Grid.Row="0" Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                <DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType=DataGrid}}" Visibility="{TemplateBinding DetailsVisibility}"/>
                                <DataGridRowHeader Grid.Row="0" Grid.Column="0" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                            </SelectiveScrollingGrid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Background" Value="{StaticResource SecondaryImportant}"/>
                    </Trigger>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="{StaticResource Important}"/>
                        <Setter Property="TextElement.Foreground" Value="#FFF"/>
                    </Trigger>
                    <!--<MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="true"/>
                            <Condition Property="Selector.IsSelectionActive" Value="false"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" Value="{DynamicResource DarkDefaultBrush}"/>
                        <Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
                    </MultiTrigger>-->
                </Style.Triggers>
            </Style>
            <Style TargetType="DataGridColumnHeader" x:Key="CommonColumnHeader">
                <Setter Property="BorderBrush" Value="{Binding Path=HorizontalGridLinesBrush,RelativeSource={RelativeSource FindAncestor,AncestorType=DataGrid}}"/>
                <Setter Property="BorderThickness" Value="0,1,1,1"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.DisplayIndex}" Value="0">
                        <Setter Property="BorderThickness" Value="1,1,1,1"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
            <Style TargetType="DataGridCell" x:Key="CommonCell" BasedOn="{StaticResource DataGridCellStyle}">
                <Setter Property="BorderBrush" Value="{Binding Path=HorizontalGridLinesBrush,RelativeSource={RelativeSource FindAncestor,AncestorType=DataGrid}}"/>
                <Setter Property="BorderThickness" Value="0,0,1,1"/>
                <Setter Property="Padding" Value="0"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="DataGridCell">
                            <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.DisplayIndex}" Value="0">
                        <Setter Property="BorderThickness" Value="1,0,1,1"/>
                    </DataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected,RelativeSource={RelativeSource Self}}" Value="true"/>
                            <Condition Binding="{Binding SelectionUnit,RelativeSource={RelativeSource FindAncestor,AncestorType=DataGrid}}" Value="Cell"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Foreground" Value="{StaticResource ImportantFont}"/>
                        <Setter Property="Background" Value="{StaticResource Important}"/>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected,RelativeSource={RelativeSource Self}}" Value="true"/>
                            <Condition Binding="{Binding IsSelected,RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="False"/>
                            <Condition Binding="{Binding SelectionUnit,RelativeSource={RelativeSource FindAncestor,AncestorType=DataGrid}}" Value="CellOrRowHeader"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Foreground" Value="{StaticResource ImportantFont}"/>
                        <Setter Property="Background" Value="{StaticResource Important}"/>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected,RelativeSource={RelativeSource Self}}" Value="true"/>
                            <Condition Binding="{Binding IsSelected,RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="True"/>
                            <Condition Binding="{Binding SelectionUnit,RelativeSource={RelativeSource FindAncestor,AncestorType=DataGrid}}" Value="CellOrRowHeader"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Foreground" Value="{StaticResource ImportantFont}"/>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected,RelativeSource={RelativeSource Self}}" Value="true"/>
                            <Condition Binding="{Binding SelectionUnit,RelativeSource={RelativeSource FindAncestor,AncestorType=DataGrid}}" Value="FullRow"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Foreground" Value="{StaticResource ImportantFont}"/>
                    </MultiDataTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="true"/>
                            <Condition Property="Selector.IsSelectionActive" Value="false"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Foreground" Value="{StaticResource ImportantFont}"/>
                        <Setter Property="Background" Value="{StaticResource Important}"/>
                    </MultiTrigger>
                </Style.Triggers>
            </Style>
            <Style TargetType="DataGrid" BasedOn="{StaticResource DataGridBaseStyle}">
                <Setter Property="GridLinesVisibility" Value="None"/>
                <Setter Property="HorizontalGridLinesBrush" Value="Gray"/>
                <Setter Property="RowStyle" Value="{StaticResource CommonRow}"/>
                <Setter Property="CellStyle" Value="{StaticResource CommonCell}"/>
                <Setter Property="ColumnHeaderStyle" Value="{StaticResource CommonColumnHeader}"/>
                <Setter Property="hc:BorderElement.CornerRadius" Value="0" />
                <Setter Property="RowHeight" Value="30"/>
            </Style>
        </ResourceDictionary>
    </UserControl.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="3*"/>
            <ColumnDefinition Width="2"/>
            <ColumnDefinition Width="7*"/>
        </Grid.ColumnDefinitions>
        <ListView ItemContainerStyle="{StaticResource a}" ItemsSource="{Binding Sequences}" BorderThickness="0"
                  dd:DragDrop.IsDragSource="True"
                  dd:DragDrop.IsDropTarget="True"
                  dd:DragDrop.ShowAlwaysDropTargetAdorner="True"
                  dd:DragDrop.UseDefaultDragAdorner="True"
                  SelectionChanged="ListView_SelectionChanged">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ContentControl Content="{Binding Name}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <GridSplitter Grid.Column="1" Background="LightGray" HorizontalAlignment="Center" Width="2" ResizeDirection="Columns"/>
        <Grid Grid.Column="2">
            <Grid.RowDefinitions>
                <RowDefinition Height="30"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Label Content="测试流程" VerticalContentAlignment="Center"/>
            <DataGrid x:Name="dataGrid" AutoGenerateColumns="False"
                      CanUserAddRows="False"
                      CanUserSortColumns="False"
                      FrozenColumnCount="1" Background="#FFF" Grid.Row="1"
                      BorderThickness="0"
                      dd:DragDrop.IsDragSource="True"
                      dd:DragDrop.IsDropTarget="True"
                      dd:DragDrop.ShowAlwaysDropTargetAdorner="True"
                      dd:DragDrop.UseDefaultDragAdorner="True"
                      dd:DragDrop.SelectDroppedItems="True"
                      dd:DragDrop.DropHandler="{Binding dropHandler}"
                      ItemsSource="{Binding Steps}">
                <DataGrid.Columns>
                    <DataGridTextColumn IsReadOnly="True" Binding="{Binding Index}" Header="序号"/>
                    <DataGridTextColumn Header="标题1" Binding="{Binding Name}"></DataGridTextColumn>
                    <DataGridTextColumn Header="标题2" Binding="{Binding Name}"></DataGridTextColumn>
                    <DataGridTextColumn Header="标题3" Binding="{Binding Name}"></DataGridTextColumn>
                    <DataGridTextColumn Header="标题4" Binding="{Binding Name}"></DataGridTextColumn>
                    <DataGridTemplateColumn x:Name="opt" Width="*" Header="操作">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <Button Style="{StaticResource LinkButton}" Margin="0,0,20,0">编辑</Button>
                                    <Button Style="{StaticResource LinkButton}">删除</Button>
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
            <!--<ListView >
                <ListView.View>
                    <GridView>
                    </GridView>
                </ListView.View>
            </ListView>-->
        </Grid>
    </Grid>
</UserControl>
WPFProject/UI/Test/SequnceList.xaml.cs
File was renamed from UI/Test/SequnceList.xaml.cs
@@ -1,97 +1,97 @@
using AIStudio.Wpf.Controls;
using GongSolutions.Wpf.DragDrop;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Controls;
using WPFProject.Models;
using WPFProject.Utils;
namespace WPFProject.UI.Test
{
    /// <summary>
    /// SequnceList.xaml 的交互逻辑
    /// </summary>
    public partial class SequnceList : UserControl, INotifyPropertyChanged
    {
        public virtual event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        protected void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                RaisePropertyChanged(propertyName);
            }
        }
        public SequnceList()
        {
            DataContext = this;
            Sequences = new ObservableCollection<Sequence>
            {
                new Sequence{ Name="SSSSS"},
                new Sequence{ Name="SSSSS2"},
            };
            Steps = Sequences[0].Steps;
            InitializeComponent();
        }
        private ObservableCollection<Program> _ps = new ObservableCollection<Program>();
        public ObservableCollection<Program> Ps
        {
            get => _ps;
            set => RaiseAndSetIfChanged(ref _ps, value);
        }
        private ObservableCollection<Sequence> _Sequences;
        public ObservableCollection<Sequence> Sequences
        {
            get => _Sequences;
            set
            {
                if (value != null && value.Count > 0)
                {
                    Steps = value[0].Steps;
                }
                else {
                    Steps = null;
                }
                RaiseAndSetIfChanged(ref _Sequences, value);
            }
        }
        private ObservableCollection<Step> _Steps;
        public ObservableCollection<Step> Steps
        {
            get => _Steps;
            set => RaiseAndSetIfChanged(ref _Steps, value);
        }
        public void Selected_Program_Changed(object sender, Program program)
        {
            this.Sequences = program.Sequences;
        }
        private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems.Count > 0)
            {
                Steps = (e.AddedItems[0] as Sequence).Steps;
            }
        }
        public IDropTarget dropHandler { get; set; } = new DdDropHandler();
    }
}
using AIStudio.Wpf.Controls;
using GongSolutions.Wpf.DragDrop;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Controls;
using WPFProject.Models;
using WPFProject.Utils;
namespace WPFProject.UI.Test
{
    /// <summary>
    /// SequnceList.xaml 的交互逻辑
    /// </summary>
    public partial class SequnceList : UserControl, INotifyPropertyChanged
    {
        public virtual event PropertyChangedEventHandler PropertyChanged;
        protected virtual void RaisePropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        protected void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                RaisePropertyChanged(propertyName);
            }
        }
        public SequnceList()
        {
            DataContext = this;
            Sequences = new ObservableCollection<Sequence>
            {
                new Sequence{ Name="SSSSS"},
                new Sequence{ Name="SSSSS2"},
            };
            Steps = Sequences[0].Steps;
            InitializeComponent();
        }
        private ObservableCollection<Program> _ps = new ObservableCollection<Program>();
        public ObservableCollection<Program> Ps
        {
            get => _ps;
            set => RaiseAndSetIfChanged(ref _ps, value);
        }
        private ObservableCollection<Sequence> _Sequences;
        public ObservableCollection<Sequence> Sequences
        {
            get => _Sequences;
            set
            {
                if (value != null && value.Count > 0)
                {
                    Steps = value[0].Steps;
                }
                else {
                    Steps = null;
                }
                RaiseAndSetIfChanged(ref _Sequences, value);
            }
        }
        private ObservableCollection<Step> _Steps;
        public ObservableCollection<Step> Steps
        {
            get => _Steps;
            set => RaiseAndSetIfChanged(ref _Steps, value);
        }
        public void Selected_Program_Changed(object sender, Program program)
        {
            this.Sequences = program.Sequences;
        }
        private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems.Count > 0)
            {
                Steps = (e.AddedItems[0] as Sequence).Steps;
            }
        }
        public IDropTarget dropHandler { get; set; } = new DdDropHandler();
    }
}
WPFProject/UI/TestWindow.xaml
WPFProject/UI/TestWindow.xaml.cs
WPFProject/UI/WorkControl.xaml
WPFProject/UI/WorkControl.xaml.cs
File was renamed from UI/WorkControl.xaml.cs
@@ -1,287 +1,287 @@
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using WPFProject.Controls;
using WPFProject.Models;
using WPFProject.UI.Test;
using WPFProject.Utils;
namespace WPFProject.UI
{
    /// <summary>
    /// WorkControl.xaml 的交互逻辑
    /// </summary>
    public partial class WorkControl : UserControl, IPlugin
    {
        public WorkControl()
        {
            InitializeComponent();
            Loaded += UserControl_Loaded;
        }
        private List<CanvasPosition> InitGridSize()
        {
            List<CanvasPosition> result = new List<CanvasPosition>();
            result.Add(new CanvasPosition
            {
                Left = 0,
                Top = 0,
                Width = 0.1 * ActualWidth - 2,
                Height = 0.5 * ActualHeight - 2
            });
            result.Add(new CanvasPosition
            {
                Left = 0.1 * ActualWidth + 2,
                Top = 0,
                Width = 0.5 * ActualWidth - 4,
                Height = ActualHeight,
            });
            result.Add(new CanvasPosition
            {
                Left = 0.6 * ActualWidth + 2,
                Top = 0,
                Width = 0.4 * ActualWidth - 2,
                Height = 0.5 * ActualHeight - 2
            });
            result.Add(new CanvasPosition
            {
                Left = 0,
                Top = 0.5 * ActualHeight + 2,
                Width = 0.1 * ActualWidth - 2,
                Height = 0.5 * ActualHeight - 2
            });
            result.Add(new CanvasPosition
            {
                Left = 0.6 * ActualWidth + 2,
                Top = 0.5 * ActualHeight + 2,
                Width = 0.4 * ActualWidth - 2,
                Height = 0.5 * ActualHeight - 2
            });
            return result;
        }
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            List<CanvasPosition> pos = InitGridSize();
            ProgramList programList = new ProgramList();
            InnerWindow p = new InnerWindow(pos[0])
            {
                Title = "程序列表",
                Content = programList
            };
            HandleInnerWindow(p);
            InnerWindow p1 = new InnerWindow(pos[1])
            {
                Title = "图片",
            };
            HandleInnerWindow(p1);
            SequnceList sequnceList = new SequnceList();
            programList.ProgramChanged += sequnceList.Selected_Program_Changed;
            InnerWindow p2 = new InnerWindow(pos[2])
            {
                Title = "序列",
                Content = sequnceList
            };
            HandleInnerWindow(p2);
            FunctionSetting functionSetting = new FunctionSetting();
            InnerWindow p3 = new InnerWindow(pos[3])
            {
                Title = "函数",
                Content = functionSetting
            };
            HandleInnerWindow(p3);
            StepSetting stepSetting = new StepSetting();
            InnerWindow p4 = new InnerWindow(pos[4])
            {
                Title = "单步设置",
                Content = stepSetting
            };
            HandleInnerWindow(p4);
            SizeChanged += WorkControl_SizeChanged;
            Loaded -= UserControl_Loaded;
        }
        public int CanvasChildrenCount { get; private set; } = 0;
        #region InnerWindow操作逻辑
        /// <summary>
        /// 设置InnerWindow
        /// </summary>
        /// <param name="inner"></param>
        private void HandleInnerWindow(InnerWindow inner)
        {
            inner.MinEvent += InnerWindowMin;
            inner.MaxEvent += InnerWindowMax;
            inner.ZIndexEvent += Inner_ZIndexEvent;
            inner.GotFocus += Inner_GotFocus;
            inner.AttachToCanvas(WorkArea);
            inner.Zindex = CanvasChildrenCount++;
        }
        /// <summary>
        /// InnerWindow焦点事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Inner_GotFocus(object sender, RoutedEventArgs e)
        {
            CanvasHelper.SetTopZIndex(sender as InnerWindow, WorkArea, typeof(InnerWindow));
        }
        /// <summary>
        /// InnerWindow ZIndex切换事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Inner_ZIndexEvent(object sender, EventArgs e)
        {
            CanvasHelper.SetTopZIndex(sender as InnerWindow, WorkArea, typeof(InnerWindow));
        }
        /// <summary>
        /// InnerWindow最小化事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InnerWindowMin(object sender, System.EventArgs e)
        {
            InnerWindow inner = sender as InnerWindow;
            inner.Visibility = Visibility.Collapsed;
            HandleMinInnerWindow(inner);
        }
        /// <summary>
        /// InnerWindow最大化事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InnerWindowMax(object sender, System.EventArgs e)
        {
            InnerWindow inner = sender as InnerWindow;
            if (inner.WindowState == WindowState.Maximized)
            {
                Canvas.SetLeft(inner, inner.canvasPosition.Left);
                Canvas.SetTop(inner, inner.canvasPosition.Top);
                inner.Width = inner.canvasPosition.Width;
                inner.Height = inner.canvasPosition.Height;
                inner.WindowState = WindowState.Normal;
            }
            else
            {
                Canvas.SetLeft(inner, 0);
                Canvas.SetTop(inner, 0);
                inner.Width = WorkArea.ActualWidth;
                inner.Height = WorkArea.ActualHeight;
                inner.WindowState = WindowState.Maximized;
            }
        }
        /// <summary>
        /// 重设大小
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void WorkControl_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            //Size newSize = e.NewSize;
            //Size previousSize = e.PreviousSize;
            //double xRate = newSize.Width / previousSize.Width;
            //double yRate = newSize.Height / previousSize.Height;
            //for (int i = 0; i < VisualTreeHelper.GetChildrenCount(WorkArea); i++)
            //{
            //    UIElement child = VisualTreeHelper.GetChild(WorkArea, i) as UIElement;
            //    Canvas.SetLeft(child, Canvas.GetLeft(child) * xRate);
            //    Canvas.SetTop(child, Canvas.GetTop(child) * yRate);
            //}
            //for (int i = 0; i < VisualTreeHelper.GetChildrenCount(WorkArea); i++)
            //{
            //    UIElement child = VisualTreeHelper.GetChild(WorkArea, i) as UIElement;
            //    if (Canvas.GetLeft(child) >= newSize.Width)
            //    {
            //        Canvas.SetLeft(child, Canvas.GetLeft(child) + newSize.Width - previousSize.Width);
            //    }
            //    if (Canvas.GetTop(child) >= newSize.Height)
            //    {
            //        Canvas.SetTop(child, Canvas.GetTop(child) + newSize.Height - previousSize.Height);
            //    }
            //}
        }
        #endregion
        #region 底部MinInnerWindow相关
        /// <summary>
        /// 底部MinInnerWindow处理
        /// </summary>
        /// <param name="inner"></param>
        private void HandleMinInnerWindow(InnerWindow inner)
        {
            MinInnerWindow min = new MinInnerWindow(inner);
            min.MaxEvent += MinInnerWindowMax;
            min.CloseEvent += MinInnerWindowClose;
            BottomBar.AddMinWindow(min);
        }
        /// <summary>
        /// 底部MinInnerWindow展开
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MinInnerWindowMax(object sender, System.EventArgs e)
        {
            MinInnerWindow min = sender as MinInnerWindow;
            min.Inner.Visibility = Visibility.Visible;
            CanvasHelper.SetTopZIndex(min.Inner, WorkArea, typeof(InnerWindow));
            BottomBar.RemoveMinWindow(min);
        }
        /// <summary>
        /// 底部MinInnerWin关闭
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MinInnerWindowClose(object sender, System.EventArgs e)
        {
            MinInnerWindow min = sender as MinInnerWindow;
            BottomBar.RemoveMinWindow(min);
        }
        #endregion
        public void OnTabChange(object sender, SelectionChangedEventArgs args)
        {
            if (args.AddedItems.Count > 0)
            {
                IconTabItem newTab = args.AddedItems[0] as IconTabItem;
                if (newTab != null && newTab.Content == this)
                {
                }
            }
            if (args.RemovedItems.Count > 0)
            {
                IconTabItem oldTab = args.RemovedItems[0] as IconTabItem;
                if (oldTab != null && oldTab.Content == this)
                {
                }
            }
        }
    }
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using WPFProject.Controls;
using WPFProject.Models;
using WPFProject.UI.Test;
using WPFProject.Utils;
namespace WPFProject.UI
{
    /// <summary>
    /// WorkControl.xaml 的交互逻辑
    /// </summary>
    public partial class WorkControl : UserControl, IPlugin
    {
        public WorkControl()
        {
            InitializeComponent();
            Loaded += UserControl_Loaded;
        }
        private List<CanvasPosition> InitGridSize()
        {
            List<CanvasPosition> result = new List<CanvasPosition>();
            result.Add(new CanvasPosition
            {
                Left = 0,
                Top = 0,
                Width = 0.1 * ActualWidth - 2,
                Height = 0.5 * ActualHeight - 2
            });
            result.Add(new CanvasPosition
            {
                Left = 0.1 * ActualWidth + 2,
                Top = 0,
                Width = 0.5 * ActualWidth - 4,
                Height = ActualHeight,
            });
            result.Add(new CanvasPosition
            {
                Left = 0.6 * ActualWidth + 2,
                Top = 0,
                Width = 0.4 * ActualWidth - 2,
                Height = 0.5 * ActualHeight - 2
            });
            result.Add(new CanvasPosition
            {
                Left = 0,
                Top = 0.5 * ActualHeight + 2,
                Width = 0.1 * ActualWidth - 2,
                Height = 0.5 * ActualHeight - 2
            });
            result.Add(new CanvasPosition
            {
                Left = 0.6 * ActualWidth + 2,
                Top = 0.5 * ActualHeight + 2,
                Width = 0.4 * ActualWidth - 2,
                Height = 0.5 * ActualHeight - 2
            });
            return result;
        }
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            List<CanvasPosition> pos = InitGridSize();
            ProgramList programList = new ProgramList();
            InnerWindow p = new InnerWindow(pos[0])
            {
                Title = "程序列表",
                Content = programList
            };
            HandleInnerWindow(p);
            InnerWindow p1 = new InnerWindow(pos[1])
            {
                Title = "图片",
            };
            HandleInnerWindow(p1);
            SequnceList sequnceList = new SequnceList();
            programList.ProgramChanged += sequnceList.Selected_Program_Changed;
            InnerWindow p2 = new InnerWindow(pos[2])
            {
                Title = "序列",
                Content = sequnceList
            };
            HandleInnerWindow(p2);
            FunctionSetting functionSetting = new FunctionSetting();
            InnerWindow p3 = new InnerWindow(pos[3])
            {
                Title = "函数",
                Content = functionSetting
            };
            HandleInnerWindow(p3);
            StepSetting stepSetting = new StepSetting();
            InnerWindow p4 = new InnerWindow(pos[4])
            {
                Title = "单步设置",
                Content = stepSetting
            };
            HandleInnerWindow(p4);
            SizeChanged += WorkControl_SizeChanged;
            Loaded -= UserControl_Loaded;
        }
        public int CanvasChildrenCount { get; private set; } = 0;
        #region InnerWindow操作逻辑
        /// <summary>
        /// 设置InnerWindow
        /// </summary>
        /// <param name="inner"></param>
        private void HandleInnerWindow(InnerWindow inner)
        {
            inner.MinEvent += InnerWindowMin;
            inner.MaxEvent += InnerWindowMax;
            inner.ZIndexEvent += Inner_ZIndexEvent;
            inner.GotFocus += Inner_GotFocus;
            inner.AttachToCanvas(WorkArea);
            inner.Zindex = CanvasChildrenCount++;
        }
        /// <summary>
        /// InnerWindow焦点事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Inner_GotFocus(object sender, RoutedEventArgs e)
        {
            CanvasHelper.SetTopZIndex(sender as InnerWindow, WorkArea, typeof(InnerWindow));
        }
        /// <summary>
        /// InnerWindow ZIndex切换事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Inner_ZIndexEvent(object sender, EventArgs e)
        {
            CanvasHelper.SetTopZIndex(sender as InnerWindow, WorkArea, typeof(InnerWindow));
        }
        /// <summary>
        /// InnerWindow最小化事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InnerWindowMin(object sender, System.EventArgs e)
        {
            InnerWindow inner = sender as InnerWindow;
            inner.Visibility = Visibility.Collapsed;
            HandleMinInnerWindow(inner);
        }
        /// <summary>
        /// InnerWindow最大化事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InnerWindowMax(object sender, System.EventArgs e)
        {
            InnerWindow inner = sender as InnerWindow;
            if (inner.WindowState == WindowState.Maximized)
            {
                Canvas.SetLeft(inner, inner.canvasPosition.Left);
                Canvas.SetTop(inner, inner.canvasPosition.Top);
                inner.Width = inner.canvasPosition.Width;
                inner.Height = inner.canvasPosition.Height;
                inner.WindowState = WindowState.Normal;
            }
            else
            {
                Canvas.SetLeft(inner, 0);
                Canvas.SetTop(inner, 0);
                inner.Width = WorkArea.ActualWidth;
                inner.Height = WorkArea.ActualHeight;
                inner.WindowState = WindowState.Maximized;
            }
        }
        /// <summary>
        /// 重设大小
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void WorkControl_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            //Size newSize = e.NewSize;
            //Size previousSize = e.PreviousSize;
            //double xRate = newSize.Width / previousSize.Width;
            //double yRate = newSize.Height / previousSize.Height;
            //for (int i = 0; i < VisualTreeHelper.GetChildrenCount(WorkArea); i++)
            //{
            //    UIElement child = VisualTreeHelper.GetChild(WorkArea, i) as UIElement;
            //    Canvas.SetLeft(child, Canvas.GetLeft(child) * xRate);
            //    Canvas.SetTop(child, Canvas.GetTop(child) * yRate);
            //}
            //for (int i = 0; i < VisualTreeHelper.GetChildrenCount(WorkArea); i++)
            //{
            //    UIElement child = VisualTreeHelper.GetChild(WorkArea, i) as UIElement;
            //    if (Canvas.GetLeft(child) >= newSize.Width)
            //    {
            //        Canvas.SetLeft(child, Canvas.GetLeft(child) + newSize.Width - previousSize.Width);
            //    }
            //    if (Canvas.GetTop(child) >= newSize.Height)
            //    {
            //        Canvas.SetTop(child, Canvas.GetTop(child) + newSize.Height - previousSize.Height);
            //    }
            //}
        }
        #endregion
        #region 底部MinInnerWindow相关
        /// <summary>
        /// 底部MinInnerWindow处理
        /// </summary>
        /// <param name="inner"></param>
        private void HandleMinInnerWindow(InnerWindow inner)
        {
            MinInnerWindow min = new MinInnerWindow(inner);
            min.MaxEvent += MinInnerWindowMax;
            min.CloseEvent += MinInnerWindowClose;
            BottomBar.AddMinWindow(min);
        }
        /// <summary>
        /// 底部MinInnerWindow展开
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MinInnerWindowMax(object sender, System.EventArgs e)
        {
            MinInnerWindow min = sender as MinInnerWindow;
            min.Inner.Visibility = Visibility.Visible;
            CanvasHelper.SetTopZIndex(min.Inner, WorkArea, typeof(InnerWindow));
            BottomBar.RemoveMinWindow(min);
        }
        /// <summary>
        /// 底部MinInnerWin关闭
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MinInnerWindowClose(object sender, System.EventArgs e)
        {
            MinInnerWindow min = sender as MinInnerWindow;
            BottomBar.RemoveMinWindow(min);
        }
        #endregion
        public void OnTabChange(object sender, SelectionChangedEventArgs args)
        {
            if (args.AddedItems.Count > 0)
            {
                IconTabItem newTab = args.AddedItems[0] as IconTabItem;
                if (newTab != null && newTab.Content == this)
                {
                }
            }
            if (args.RemovedItems.Count > 0)
            {
                IconTabItem oldTab = args.RemovedItems[0] as IconTabItem;
                if (oldTab != null && oldTab.Content == this)
                {
                }
            }
        }
    }
}
WPFProject/UI/WorkWindow.xaml
WPFProject/UI/WorkWindow.xaml.cs
WPFProject/Utils/CanvasHelper.cs
WPFProject/Utils/DdDragHandler.cs
File was renamed from Utils/DdDragHandler.cs
@@ -1,20 +1,20 @@
using GongSolutions.Wpf.DragDrop;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using WPFProject.Models;
namespace WPFProject.Utils
{
    public class DdDragHandler : DefaultDragHandler
    {
        public override bool CanStartDrag(IDragInfo dragInfo)
        {
            FuncModel model = dragInfo.SourceItem as FuncModel;
            return model.Children ==null || model.Children.Count == 0;
        }
    }
}
using GongSolutions.Wpf.DragDrop;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using WPFProject.Models;
namespace WPFProject.Utils
{
    public class DdDragHandler : DefaultDragHandler
    {
        public override bool CanStartDrag(IDragInfo dragInfo)
        {
            FuncModel model = dragInfo.SourceItem as FuncModel;
            return model.Children ==null || model.Children.Count == 0;
        }
    }
}
WPFProject/Utils/DdDropHandler.cs
File was renamed from Utils/DdDropHandler.cs
@@ -1,94 +1,94 @@
using GongSolutions.Wpf.DragDrop;
using GongSolutions.Wpf.DragDrop.Utilities;
using System.Collections.Generic;
using System.ComponentModel;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup;
using System.Linq;
using System.Collections;
using WPFProject.Models;
namespace WPFProject.Utils
{
    public class DdDropHandler : DefaultDropHandler
    {
        public bool CanConvert(IDropInfo dropInfo)
        {
            bool InterfaceFilter(Type t, object o) => (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable<>));
            Type[] enumerableInterfaces = dropInfo.TargetCollection.GetType().FindInterfaces(InterfaceFilter, null);
            var enumerableTypes = from i in enumerableInterfaces
                                  select i.GetGenericArguments().Single();
            if (enumerableTypes.Any())
            {
                Type dataType = TypeUtilities.GetCommonBaseClass(ExtractData(dropInfo.Data));
                return dataType == typeof(FuncModel) && enumerableTypes.Any(t => t==typeof(Step));
            }
            return false;
        }
        public Step ConvertFunc2Step(FuncModel func) {
            return new Step
            {
                Name = func.Name
            };
        }
        public override void DragOver(IDropInfo dropInfo)
        {
            if (CanAcceptData(dropInfo))
            {
                base.DragOver(dropInfo);
            }
            else if (CanConvert(dropInfo))
            {
                // 固定Copy
                dropInfo.Effects = DragDropEffects.Copy;
                var isTreeViewItem = dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.TargetItemCenter) && dropInfo.VisualTargetItem is TreeViewItem;
                dropInfo.DropTargetAdorner = isTreeViewItem ? DropTargetAdorners.Highlight : DropTargetAdorners.Insert;
            }
        }
        public override void Drop(IDropInfo dropInfo)
        {
            if (CanAcceptData(dropInfo))
            {
                base.Drop(dropInfo);
            }
            else if (CanConvert(dropInfo))
            {
                int insertIndex = GetInsertIndex(dropInfo);
                var destinationList = dropInfo.TargetCollection.TryGetList();
                var data = ExtractData(dropInfo.Data).OfType<object>().ToList();
                if (destinationList != null)
                {
                    var objects2Insert = new List<object>();
                    foreach (var o in data)
                    {
                        var obj2Insert = ConvertFunc2Step(o as FuncModel);
                        objects2Insert.Add(obj2Insert);
                        destinationList.Insert(insertIndex++, obj2Insert);
                        // 下方对象如果实现了 IDragItemSource 接口,会在这里调用 ItemDropped 方法,算是后置处理
                        if (obj2Insert is IDragItemSource dragItemSource)
                        {
                            dragItemSource.ItemDropped(dropInfo);
                        }
                    }
                    SelectDroppedItems(dropInfo, objects2Insert);
                }
            }
        }
    }
}
using GongSolutions.Wpf.DragDrop;
using GongSolutions.Wpf.DragDrop.Utilities;
using System.Collections.Generic;
using System.ComponentModel;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup;
using System.Linq;
using System.Collections;
using WPFProject.Models;
namespace WPFProject.Utils
{
    public class DdDropHandler : DefaultDropHandler
    {
        public bool CanConvert(IDropInfo dropInfo)
        {
            bool InterfaceFilter(Type t, object o) => (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable<>));
            Type[] enumerableInterfaces = dropInfo.TargetCollection.GetType().FindInterfaces(InterfaceFilter, null);
            var enumerableTypes = from i in enumerableInterfaces
                                  select i.GetGenericArguments().Single();
            if (enumerableTypes.Any())
            {
                Type dataType = TypeUtilities.GetCommonBaseClass(ExtractData(dropInfo.Data));
                return dataType == typeof(FuncModel) && enumerableTypes.Any(t => t==typeof(Step));
            }
            return false;
        }
        public Step ConvertFunc2Step(FuncModel func) {
            return new Step
            {
                Name = func.Name
            };
        }
        public override void DragOver(IDropInfo dropInfo)
        {
            if (CanAcceptData(dropInfo))
            {
                base.DragOver(dropInfo);
            }
            else if (CanConvert(dropInfo))
            {
                // 固定Copy
                dropInfo.Effects = DragDropEffects.Copy;
                var isTreeViewItem = dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.TargetItemCenter) && dropInfo.VisualTargetItem is TreeViewItem;
                dropInfo.DropTargetAdorner = isTreeViewItem ? DropTargetAdorners.Highlight : DropTargetAdorners.Insert;
            }
        }
        public override void Drop(IDropInfo dropInfo)
        {
            if (CanAcceptData(dropInfo))
            {
                base.Drop(dropInfo);
            }
            else if (CanConvert(dropInfo))
            {
                int insertIndex = GetInsertIndex(dropInfo);
                var destinationList = dropInfo.TargetCollection.TryGetList();
                var data = ExtractData(dropInfo.Data).OfType<object>().ToList();
                if (destinationList != null)
                {
                    var objects2Insert = new List<object>();
                    foreach (var o in data)
                    {
                        var obj2Insert = ConvertFunc2Step(o as FuncModel);
                        objects2Insert.Add(obj2Insert);
                        destinationList.Insert(insertIndex++, obj2Insert);
                        // 下方对象如果实现了 IDragItemSource 接口,会在这里调用 ItemDropped 方法,算是后置处理
                        if (obj2Insert is IDragItemSource dragItemSource)
                        {
                            dragItemSource.ItemDropped(dropInfo);
                        }
                    }
                    SelectDroppedItems(dropInfo, objects2Insert);
                }
            }
        }
    }
}
WPFProject/Utils/IPlugin.cs
WPFProject/Utils/Resize.cs
File was renamed from Utils/Resize.cs
@@ -420,13 +420,13 @@
                            double oldLeft = double.IsNaN(Canvas.GetLeft(target)) ? 0 : Canvas.GetLeft(target),
                                oldTop = double.IsNaN(Canvas.GetTop(target)) ? 0 : Canvas.GetTop(target),
                                oldWidth = double.IsNaN(target.ActualWidth) ? 0 : target.ActualWidth,
                                oldHeight = double.IsNaN(target.ActualHeight) ? 0 : target.ActualHeight;
                                oldHeight = double.IsNaN(target.ActualHeight) ? 0 : target.ActualHeight;
                            double left, top, width, height;
                            double x = e.HorizontalChange, y = e.VerticalChange;
                            bool toLeft = x < 0, toTop = y < 0;
                            bool isLeft = thumb.HorizontalAlignment == HorizontalAlignment.Left,
                                isTop = thumb.VerticalAlignment == VerticalAlignment.Top;
                            bool toLeft = x < 0, toTop = y < 0;
                            bool isLeft = thumb.HorizontalAlignment == HorizontalAlignment.Left,
                                isTop = thumb.VerticalAlignment == VerticalAlignment.Top;
                            if (isLeft)
                            {
                                // 左侧的拖拽
@@ -461,33 +461,33 @@
                                if (top + height > parent.ActualHeight) height = parent.ActualHeight - top;
                            }
                            if (thumb.HorizontalAlignment != HorizontalAlignment.Center &&
                            if (thumb.HorizontalAlignment != HorizontalAlignment.Center &&
                                thumb.HorizontalAlignment != HorizontalAlignment.Stretch)
                            {
                                // 水平方向最终判断
                                Canvas.SetLeft(target, left);
                                target.Width = width;
                                //if ((isLeft && toLeft && left >= 0) ||
                                //    (isLeft && !toLeft && width >= MinWidth) ||
                                //    (!isLeft && toLeft && width >= MinWidth) ||
                                //    (!isLeft && !toLeft && (left + width) <= parent.ActualWidth))
                                //{
                                //if ((isLeft && toLeft && left >= 0) ||
                                //    (isLeft && !toLeft && width >= MinWidth) ||
                                //    (!isLeft && toLeft && width >= MinWidth) ||
                                //    (!isLeft && !toLeft && (left + width) <= parent.ActualWidth))
                                //{
                                //    Canvas.SetLeft(target, left);
                                //    target.Width = width;
                                //}
                            }
                            if (thumb.VerticalAlignment != VerticalAlignment.Center &&
                            if (thumb.VerticalAlignment != VerticalAlignment.Center &&
                                thumb.VerticalAlignment != VerticalAlignment.Stretch)
                            {
                                // 垂直方向最终判断
                                Canvas.SetTop(target, top);
                                Canvas.SetTop(target, top);
                                target.Height = height;
                                //if ((isTop && toTop && top >= 0) ||
                                //    (isTop && !toTop && height >= MinHeight) ||
                                //    (!isTop && toTop && height >= MinHeight) ||
                                //    (!isTop && !toTop && (top + height) <= parent.ActualHeight))
                                //{
                                //if ((isTop && toTop && top >= 0) ||
                                //    (isTop && !toTop && height >= MinHeight) ||
                                //    (!isTop && toTop && height >= MinHeight) ||
                                //    (!isTop && !toTop && (top + height) <= parent.ActualHeight))
                                //{
                                //    Canvas.SetTop(target, top);
                                //    target.Height = height;
                                //}
WPFProject/Utils/Win32Helper.cs
WPFProject/Utils/XmlUtil.cs
File was renamed from Utils/XmlUtil.cs
@@ -1,41 +1,41 @@
using System;
using System.IO;
using System.Xml.Serialization;
namespace WPFProject.Utils
{
    public class XmlUtil
    {
        /// <summary>
        /// 将对象序列化到Xml文件中
        /// </summary>
        /// <param name="data">对象</param>
        /// <param name="filePath">xml路径</param>
        public static void SerialToFile(object data, string filePath)
        {
            XmlSerializer serializer = new XmlSerializer(data.GetType());
            string content = string.Empty;
            //serialize
            using (StringWriter writer = new StringWriter())
            {
                serializer.Serialize(writer, data);
                content = writer.ToString();
            }
            //save to file
            using (StreamWriter stream_writer = new StreamWriter(filePath))
            {
                stream_writer.Write(content);
            }
        }
        public static T DeserialFromXml<T>(string filePath)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            using (StreamReader reader = new StreamReader(filePath))
            {
                return (T) serializer.Deserialize(reader);
            }
        }
    }
}
using System;
using System.IO;
using System.Xml.Serialization;
namespace WPFProject.Utils
{
    public class XmlUtil
    {
        /// <summary>
        /// 将对象序列化到Xml文件中
        /// </summary>
        /// <param name="data">对象</param>
        /// <param name="filePath">xml路径</param>
        public static void SerialToFile(object data, string filePath)
        {
            XmlSerializer serializer = new XmlSerializer(data.GetType());
            string content = string.Empty;
            //serialize
            using (StringWriter writer = new StringWriter())
            {
                serializer.Serialize(writer, data);
                content = writer.ToString();
            }
            //save to file
            using (StreamWriter stream_writer = new StreamWriter(filePath))
            {
                stream_writer.Write(content);
            }
        }
        public static T DeserialFromXml<T>(string filePath)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            using (StreamReader reader = new StreamReader(filePath))
            {
                return (T) serializer.Deserialize(reader);
            }
        }
    }
}
WPFProject/ViewModels/ProgramListViewModel.cs
WPFProject/WPFProject.csproj
File was renamed from WPFProject.csproj
@@ -1,305 +1,305 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{D47D2314-5DD5-4899-ADF9-15ED057289D3}</ProjectGuid>
    <OutputType>WinExe</OutputType>
    <RootNamespace>WPFProject</RootNamespace>
    <AssemblyName>WPFProject</AssemblyName>
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <WarningLevel>4</WarningLevel>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <Deterministic>true</Deterministic>
    <LangVersion>latest</LangVersion>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="AIStudio.Wpf.Controls, Version=1.2.2.0, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>packages\AIStudio.Wpf.Controls.1.2.2\lib\net461\AIStudio.Wpf.Controls.dll</HintPath>
    </Reference>
    <Reference Include="GongSolutions.WPF.DragDrop, Version=3.0.0.0, Culture=neutral, PublicKeyToken=91f1945125b7a587, processorArchitecture=MSIL">
      <HintPath>packages\gong-wpf-dragdrop.3.2.1\lib\net47\GongSolutions.WPF.DragDrop.dll</HintPath>
    </Reference>
    <Reference Include="HandyControl, Version=3.4.0.0, Culture=neutral, PublicKeyToken=45be8712787a1e5b, processorArchitecture=MSIL">
      <HintPath>packages\HandyControl.3.4.0\lib\net472\HandyControl.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.Xaml.Behaviors, Version=1.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\Microsoft.Xaml.Behaviors.Wpf.1.1.39\lib\net45\Microsoft.Xaml.Behaviors.dll</HintPath>
    </Reference>
    <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>
    <Reference Include="PresentationFramework.Aero" />
    <Reference Include="System" />
    <Reference Include="System.ComponentModel.Composition" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
    <Reference Include="System.Data" />
    <Reference Include="System.Drawing" />
    <Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Web" />
    <Reference Include="System.Web.Extensions" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="System.Xml" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="System.Xaml">
      <RequiredTargetFramework>4.0</RequiredTargetFramework>
    </Reference>
    <Reference Include="UIAutomationProvider" />
    <Reference Include="WindowsBase" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="WindowsFormsIntegration" />
    <Reference Include="WPF.MDI, Version=1.1.4.0, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>packages\WPF.MDI.1.1.4\lib\net40-client\WPF.MDI.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <ApplicationDefinition Include="App.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </ApplicationDefinition>
    <Compile Include="Controls\DpPlugin.cs" />
    <Compile Include="Controls\InnerWindow.xaml.cs">
      <DependentUpon>InnerWindow.xaml</DependentUpon>
    </Compile>
    <Compile Include="Controls\MinInnerWindow.xaml.cs">
      <DependentUpon>MinInnerWindow.xaml</DependentUpon>
    </Compile>
    <Compile Include="Events\TabChange.cs" />
    <Compile Include="Forms\Form1.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Include="Forms\Form1.Designer.cs">
      <DependentUpon>Form1.cs</DependentUpon>
    </Compile>
    <Compile Include="Models\CanvasPosition.cs" />
    <Compile Include="Models\FuncModel.cs" />
    <Compile Include="Models\NotifyBase.cs" />
    <Compile Include="Models\Variable.cs" />
    <Compile Include="Models\Program.cs" />
    <Compile Include="Models\Sequence.cs" />
    <Compile Include="Models\Step.cs" />
    <Compile Include="UI\BottomBar.xaml.cs">
      <DependentUpon>BottomBar.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\StepSetting.xaml.cs">
      <DependentUpon>StepSetting.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\TestWindow.xaml.cs">
      <DependentUpon>TestWindow.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\Test\FunctionSetting.xaml.cs">
      <DependentUpon>FunctionSetting.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\Test\ProgramList.xaml.cs">
      <DependentUpon>ProgramList.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\Test\SequnceList.xaml.cs">
      <DependentUpon>SequnceList.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\WorkControl.xaml.cs">
      <DependentUpon>WorkControl.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\WorkWindow.xaml.cs">
      <DependentUpon>WorkWindow.xaml</DependentUpon>
    </Compile>
    <Compile Include="Utils\CanvasHelper.cs" />
    <Compile Include="Utils\DdDragHandler.cs" />
    <Compile Include="Utils\DdDropHandler.cs" />
    <Compile Include="Utils\IPlugin.cs" />
    <Compile Include="Utils\Resize.cs" />
    <Compile Include="Utils\Win32Helper.cs" />
    <Compile Include="Utils\XmlUtil.cs" />
    <Compile Include="ViewModels\ProgramListViewModel.cs" />
    <Page Include="Controls\InnerWindow.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="Controls\MenuTabControl.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="Controls\MinInnerWindow.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="MainWindow.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Compile Include="Controls\IconTabItem.cs" />
    <Compile Include="Controls\MenuTabControl.xaml.cs">
      <DependentUpon>MenuTabControl.xaml</DependentUpon>
    </Compile>
    <Compile Include="MainWindow.xaml.cs">
      <DependentUpon>MainWindow.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Resource Include="Resources\Font\Font.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Page Include="Style\Colors.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="Style\ListViewStyle.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="Style\CommonTree.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Page Include="Style\MainTab.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="Style\WindowResources.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\BottomBar.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\StepSetting.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\TestWindow.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\Test\FunctionSetting.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\Test\ProgramList.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\Test\SequnceList.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\WorkControl.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\WorkWindow.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Properties\AssemblyInfo.cs">
      <SubType>Code</SubType>
    </Compile>
    <Compile Include="Properties\Resources.Designer.cs">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>Resources.resx</DependentUpon>
    </Compile>
    <Compile Include="Properties\Settings.Designer.cs">
      <AutoGen>True</AutoGen>
      <DependentUpon>Settings.settings</DependentUpon>
      <DesignTimeSharedInput>True</DesignTimeSharedInput>
    </Compile>
    <EmbeddedResource Include="Forms\Form1.resx">
      <DependentUpon>Form1.cs</DependentUpon>
    </EmbeddedResource>
    <EmbeddedResource Include="Properties\Resources.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
    <None Include="packages.config" />
    <None Include="Properties\Settings.settings">
      <Generator>SettingsSingleFileGenerator</Generator>
      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
    </None>
    <Resource Include="Resources\Font\iconfont.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
  </ItemGroup>
  <ItemGroup>
    <None Include="App.config" />
  </ItemGroup>
  <ItemGroup>
    <WCFMetadata Include="Connected Services\" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\VisionBuilder.Core\VisionBuilder.Core.csproj">
      <Project>{65100b0e-1eba-4534-ac73-61ad3ae6ab36}</Project>
      <Name>VisionBuilder.Core</Name>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <Resource Include="Resources\Icon\xinzeng_1.png" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{D47D2314-5DD5-4899-ADF9-15ED057289D3}</ProjectGuid>
    <OutputType>WinExe</OutputType>
    <RootNamespace>WPFProject</RootNamespace>
    <AssemblyName>WPFProject</AssemblyName>
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <WarningLevel>4</WarningLevel>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <Deterministic>true</Deterministic>
    <LangVersion>latest</LangVersion>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="AIStudio.Wpf.Controls, Version=1.2.2.0, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>packages\AIStudio.Wpf.Controls.1.2.2\lib\net461\AIStudio.Wpf.Controls.dll</HintPath>
    </Reference>
    <Reference Include="GongSolutions.WPF.DragDrop, Version=3.0.0.0, Culture=neutral, PublicKeyToken=91f1945125b7a587, processorArchitecture=MSIL">
      <HintPath>packages\gong-wpf-dragdrop.3.2.1\lib\net47\GongSolutions.WPF.DragDrop.dll</HintPath>
    </Reference>
    <Reference Include="HandyControl, Version=3.4.0.0, Culture=neutral, PublicKeyToken=45be8712787a1e5b, processorArchitecture=MSIL">
      <HintPath>packages\HandyControl.3.4.0\lib\net472\HandyControl.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.Xaml.Behaviors, Version=1.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\Microsoft.Xaml.Behaviors.Wpf.1.1.39\lib\net45\Microsoft.Xaml.Behaviors.dll</HintPath>
    </Reference>
    <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>
    <Reference Include="PresentationFramework.Aero" />
    <Reference Include="System" />
    <Reference Include="System.ComponentModel.Composition" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
    <Reference Include="System.Data" />
    <Reference Include="System.Drawing" />
    <Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Web" />
    <Reference Include="System.Web.Extensions" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="System.Xml" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="System.Xaml">
      <RequiredTargetFramework>4.0</RequiredTargetFramework>
    </Reference>
    <Reference Include="UIAutomationProvider" />
    <Reference Include="WindowsBase" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="WindowsFormsIntegration" />
    <Reference Include="WPF.MDI, Version=1.1.4.0, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>packages\WPF.MDI.1.1.4\lib\net40-client\WPF.MDI.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <ApplicationDefinition Include="App.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </ApplicationDefinition>
    <Compile Include="Controls\DpPlugin.cs" />
    <Compile Include="Controls\InnerWindow.xaml.cs">
      <DependentUpon>InnerWindow.xaml</DependentUpon>
    </Compile>
    <Compile Include="Controls\MinInnerWindow.xaml.cs">
      <DependentUpon>MinInnerWindow.xaml</DependentUpon>
    </Compile>
    <Compile Include="Events\TabChange.cs" />
    <Compile Include="Forms\Form1.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Include="Forms\Form1.Designer.cs">
      <DependentUpon>Form1.cs</DependentUpon>
    </Compile>
    <Compile Include="Models\CanvasPosition.cs" />
    <Compile Include="Models\FuncModel.cs" />
    <Compile Include="Models\NotifyBase.cs" />
    <Compile Include="Models\Variable.cs" />
    <Compile Include="Models\Program.cs" />
    <Compile Include="Models\Sequence.cs" />
    <Compile Include="Models\Step.cs" />
    <Compile Include="UI\BottomBar.xaml.cs">
      <DependentUpon>BottomBar.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\StepSetting.xaml.cs">
      <DependentUpon>StepSetting.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\TestWindow.xaml.cs">
      <DependentUpon>TestWindow.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\Test\FunctionSetting.xaml.cs">
      <DependentUpon>FunctionSetting.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\Test\ProgramList.xaml.cs">
      <DependentUpon>ProgramList.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\Test\SequnceList.xaml.cs">
      <DependentUpon>SequnceList.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\WorkControl.xaml.cs">
      <DependentUpon>WorkControl.xaml</DependentUpon>
    </Compile>
    <Compile Include="UI\WorkWindow.xaml.cs">
      <DependentUpon>WorkWindow.xaml</DependentUpon>
    </Compile>
    <Compile Include="Utils\CanvasHelper.cs" />
    <Compile Include="Utils\DdDragHandler.cs" />
    <Compile Include="Utils\DdDropHandler.cs" />
    <Compile Include="Utils\IPlugin.cs" />
    <Compile Include="Utils\Resize.cs" />
    <Compile Include="Utils\Win32Helper.cs" />
    <Compile Include="Utils\XmlUtil.cs" />
    <Compile Include="ViewModels\ProgramListViewModel.cs" />
    <Page Include="Controls\InnerWindow.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="Controls\MenuTabControl.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="Controls\MinInnerWindow.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="MainWindow.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Compile Include="Controls\IconTabItem.cs" />
    <Compile Include="Controls\MenuTabControl.xaml.cs">
      <DependentUpon>MenuTabControl.xaml</DependentUpon>
    </Compile>
    <Compile Include="MainWindow.xaml.cs">
      <DependentUpon>MainWindow.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Resource Include="Resources\Font\Font.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Page Include="Style\Colors.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="Style\ListViewStyle.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="Style\CommonTree.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Page Include="Style\MainTab.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="Style\WindowResources.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\BottomBar.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\StepSetting.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\TestWindow.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\Test\FunctionSetting.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\Test\ProgramList.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\Test\SequnceList.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\WorkControl.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="UI\WorkWindow.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Properties\AssemblyInfo.cs">
      <SubType>Code</SubType>
    </Compile>
    <Compile Include="Properties\Resources.Designer.cs">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>Resources.resx</DependentUpon>
    </Compile>
    <Compile Include="Properties\Settings.Designer.cs">
      <AutoGen>True</AutoGen>
      <DependentUpon>Settings.settings</DependentUpon>
      <DesignTimeSharedInput>True</DesignTimeSharedInput>
    </Compile>
    <EmbeddedResource Include="Forms\Form1.resx">
      <DependentUpon>Form1.cs</DependentUpon>
    </EmbeddedResource>
    <EmbeddedResource Include="Properties\Resources.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
    <None Include="packages.config" />
    <None Include="Properties\Settings.settings">
      <Generator>SettingsSingleFileGenerator</Generator>
      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
    </None>
    <Resource Include="Resources\Font\iconfont.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
  </ItemGroup>
  <ItemGroup>
    <None Include="App.config" />
  </ItemGroup>
  <ItemGroup>
    <WCFMetadata Include="Connected Services\" />
  </ItemGroup>
  <ItemGroup>
    <Resource Include="Resources\Icon\xinzeng_1.png" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\VisionBuilder.Core\VisionBuilder.Core.csproj">
      <Project>{3e3bf44a-0b69-45c5-9512-528cb48a7106}</Project>
      <Name>VisionBuilder.Core</Name>
    </ProjectReference>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
WPFProject/WPFProject.sln
New file
@@ -0,0 +1,43 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.33328.57
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFProject", "WPFProject.csproj", "{D47D2314-5DD5-4899-ADF9-15ED057289D3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.Core", "..\VisionBuilder.Core\VisionBuilder.Core.csproj", "{3E3BF44A-0B69-45C5-9512-528CB48A7106}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.Test", "..\VisionBuilder.Test\VisionBuilder.Test.csproj", "{6E1CC97A-B3CB-4E9F-94E0-F264DE0D8298}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisionBuilder.Engine", "..\VisionBuilder.Engine\VisionBuilder.Engine.csproj", "{8E5E8A68-0B9D-4A6A-B325-730C64603FDF}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Release|Any CPU = Release|Any CPU
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {D47D2314-5DD5-4899-ADF9-15ED057289D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {D47D2314-5DD5-4899-ADF9-15ED057289D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {D47D2314-5DD5-4899-ADF9-15ED057289D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {D47D2314-5DD5-4899-ADF9-15ED057289D3}.Release|Any CPU.Build.0 = Release|Any CPU
        {3E3BF44A-0B69-45C5-9512-528CB48A7106}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {3E3BF44A-0B69-45C5-9512-528CB48A7106}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {3E3BF44A-0B69-45C5-9512-528CB48A7106}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {3E3BF44A-0B69-45C5-9512-528CB48A7106}.Release|Any CPU.Build.0 = Release|Any CPU
        {6E1CC97A-B3CB-4E9F-94E0-F264DE0D8298}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {6E1CC97A-B3CB-4E9F-94E0-F264DE0D8298}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {6E1CC97A-B3CB-4E9F-94E0-F264DE0D8298}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {6E1CC97A-B3CB-4E9F-94E0-F264DE0D8298}.Release|Any CPU.Build.0 = Release|Any CPU
        {8E5E8A68-0B9D-4A6A-B325-730C64603FDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {8E5E8A68-0B9D-4A6A-B325-730C64603FDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {8E5E8A68-0B9D-4A6A-B325-730C64603FDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {8E5E8A68-0B9D-4A6A-B325-730C64603FDF}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
    GlobalSection(ExtensibilityGlobals) = postSolution
        SolutionGuid = {784CEA1D-A890-4625-B0C1-72294A6B4803}
    EndGlobalSection
EndGlobal
WPFProject/packages.config
File was renamed from packages.config
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AIStudio.Wpf.Controls" version="1.2.2" targetFramework="net472" />
  <package id="gong-wpf-dragdrop" version="3.2.1" targetFramework="net472" />
  <package id="HandyControl" version="3.4.0" targetFramework="net472" />
  <package id="Microsoft.Xaml.Behaviors.Wpf" version="1.1.39" targetFramework="net472" />
  <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
  <package id="System.IO" version="4.3.0" targetFramework="net472" />
  <package id="System.Net.Http" version="4.3.4" targetFramework="net472" />
  <package id="System.Runtime" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net472" />
  <package id="WPF.MDI" version="1.1.4" targetFramework="net472" />
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AIStudio.Wpf.Controls" version="1.2.2" targetFramework="net472" />
  <package id="gong-wpf-dragdrop" version="3.2.1" targetFramework="net472" />
  <package id="HandyControl" version="3.4.0" targetFramework="net472" />
  <package id="Microsoft.Xaml.Behaviors.Wpf" version="1.1.39" targetFramework="net472" />
  <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
  <package id="System.IO" version="4.3.0" targetFramework="net472" />
  <package id="System.Net.Http" version="4.3.4" targetFramework="net472" />
  <package id="System.Runtime" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net472" />
  <package id="WPF.MDI" version="1.1.4" targetFramework="net472" />
</packages>
WPFProject/test.xml
File was renamed from test.xml
@@ -1,65 +1,65 @@
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfProgram xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Program>
    <Name>123</Name>
    <Sequences>
      <Sequence>
        <Name>S123</Name>
        <Steps>
          <Step>
            <Index>0</Index>
            <Name>000</Name>
          </Step>
          <Step>
            <Index>0</Index>
            <Name>111</Name>
          </Step>
        </Steps>
      </Sequence>
      <Sequence>
        <Name>S223</Name>
        <Steps>
          <Step>
            <Index>0</Index>
            <Name>000</Name>
          </Step>
          <Step>
            <Index>0</Index>
            <Name>111</Name>
          </Step>
        </Steps>
      </Sequence>
    </Sequences>
  </Program>
  <Program>
    <Name>223</Name>
    <Sequences>
      <Sequence>
        <Name>D123</Name>
        <Steps>
          <Step>
            <Index>0</Index>
            <Name>000</Name>
          </Step>
          <Step>
            <Index>0</Index>
            <Name>111</Name>
          </Step>
        </Steps>
      </Sequence>
      <Sequence>
        <Name>D223</Name>
        <Steps>
          <Step>
            <Index>0</Index>
            <Name>000</Name>
          </Step>
          <Step>
            <Index>0</Index>
            <Name>111</Name>
          </Step>
        </Steps>
      </Sequence>
    </Sequences>
  </Program>
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfProgram xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Program>
    <Name>123</Name>
    <Sequences>
      <Sequence>
        <Name>S123</Name>
        <Steps>
          <Step>
            <Index>0</Index>
            <Name>000</Name>
          </Step>
          <Step>
            <Index>0</Index>
            <Name>111</Name>
          </Step>
        </Steps>
      </Sequence>
      <Sequence>
        <Name>S223</Name>
        <Steps>
          <Step>
            <Index>0</Index>
            <Name>000</Name>
          </Step>
          <Step>
            <Index>0</Index>
            <Name>111</Name>
          </Step>
        </Steps>
      </Sequence>
    </Sequences>
  </Program>
  <Program>
    <Name>223</Name>
    <Sequences>
      <Sequence>
        <Name>D123</Name>
        <Steps>
          <Step>
            <Index>0</Index>
            <Name>000</Name>
          </Step>
          <Step>
            <Index>0</Index>
            <Name>111</Name>
          </Step>
        </Steps>
      </Sequence>
      <Sequence>
        <Name>D223</Name>
        <Steps>
          <Step>
            <Index>0</Index>
            <Name>000</Name>
          </Step>
          <Step>
            <Index>0</Index>
            <Name>111</Name>
          </Step>
        </Steps>
      </Sequence>
    </Sequences>
  </Program>
</ArrayOfProgram>