From 1a2bcaa7bec4f0bc681e55d1ccc61b14427c98ce Mon Sep 17 00:00:00 2001
From: lixiaojun <1287241240@qq.com>
Date: 星期六, 25 一月 2025 12:45:20 +0800
Subject: [PATCH] 增加构件自定义参数

---
 WinFrmUI/Yw.WinFrmUI.Core/04-property/DictionaryPropertyAdapter.cs                                              |  128 ++++++
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/01-import/00-core/ImportXhsProjectHelper.cs                      |    8 
 WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasDlg.resx                                                   |  120 ++++++
 WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasGridCtrl.cs                                                |  148 +++++++
 Desktop/HStation.Desktop.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user                          |    2 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/01-parter/HydroParterViewModel.cs                                  |   17 
 Entry/HStation.Entry.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user                              |    2 
 WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/ParasItemViewModel.cs                                              |   26 +
 WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasDlg.cs                                                     |   46 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj                                                   |    2 
 Hydro/HStation.Hydro.Core/HStation.Hydro.Core.csproj                                                            |    2 
 WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasGridCtrl.Designer.cs                                       |  150 +++++++
 Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj                                                                        |    2 
 WinFrmUI/Yw.WinFrmUI.Core/Yw.WinFrmUI.Core.csproj                                                               |    6 
 WinFrmUI/Yw.WinFrmUI.Core/04-property/DictionaryPropertyDescriptor.cs                                           |   94 ++++
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/03-calcu/02-label/SimulationCalcuResultLabelHelper.cs |   64 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/05-attribute/HydroParasProAttribute.cs                             |   18 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs                                          |   38 +
 WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasDlg.Designer.cs                                            |  131 ++++++
 Entry/HStation.Entry.Xhs.Core/HStation.Entry.Xhs.Core.csproj                                                    |    2 
 WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasGridCtrl.resx                                              |  145 +++++++
 21 files changed, 1,123 insertions(+), 28 deletions(-)

diff --git a/Desktop/HStation.Desktop.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user b/Desktop/HStation.Desktop.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
index 3e9889c..a49b31f 100644
--- a/Desktop/HStation.Desktop.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
+++ b/Desktop/HStation.Desktop.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -4,7 +4,7 @@
 -->
 <Project>
   <PropertyGroup>
-    <History>True|2025-01-23T06:29:01.1814366Z;True|2025-01-23T14:28:18.0513868+08:00;True|2025-01-23T13:53:07.5061161+08:00;True|2025-01-23T12:58:32.3093753+08:00;True|2025-01-23T12:58:02.8169460+08:00;True|2025-01-23T12:57:05.6740839+08:00;True|2025-01-23T11:07:51.4564403+08:00;True|2025-01-13T11:03:21.1732352+08:00;True|2024-10-21T12:02:00.7754536+08:00;False|2024-10-21T11:51:29.4414327+08:00;False|2024-10-21T11:50:51.8640100+08:00;False|2024-10-21T11:49:14.9169777+08:00;</History>
+    <History>True|2025-01-25T04:27:20.2443551Z;True|2025-01-24T09:16:09.4525881+08:00;True|2025-01-23T14:29:01.1814366+08:00;True|2025-01-23T14:28:18.0513868+08:00;True|2025-01-23T13:53:07.5061161+08:00;True|2025-01-23T12:58:32.3093753+08:00;True|2025-01-23T12:58:02.8169460+08:00;True|2025-01-23T12:57:05.6740839+08:00;True|2025-01-23T11:07:51.4564403+08:00;True|2025-01-13T11:03:21.1732352+08:00;True|2024-10-21T12:02:00.7754536+08:00;False|2024-10-21T11:51:29.4414327+08:00;False|2024-10-21T11:50:51.8640100+08:00;False|2024-10-21T11:49:14.9169777+08:00;</History>
     <LastFailureDetails />
   </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/Entry/HStation.Entry.Xhs.Core/HStation.Entry.Xhs.Core.csproj b/Entry/HStation.Entry.Xhs.Core/HStation.Entry.Xhs.Core.csproj
index 8c71ca7..0156368 100644
--- a/Entry/HStation.Entry.Xhs.Core/HStation.Entry.Xhs.Core.csproj
+++ b/Entry/HStation.Entry.Xhs.Core/HStation.Entry.Xhs.Core.csproj
@@ -20,7 +20,7 @@
 	  <PackageReference Include="Yw.Application.Basic.Core" Version="3.3.2" />
 	  <PackageReference Include="Yw.Application.Bimface.Core" Version="3.2.0" />
 	  <PackageReference Include="Yw.Application.Dict.Core" Version="3.1.3" />
-	  <PackageReference Include="Yw.Application.Hydro.Core" Version="3.8.0" />
+	  <PackageReference Include="Yw.Application.Hydro.Core" Version="3.8.1" />
 	  <PackageReference Include="Yw.Application.Map.Core" Version="3.2.2" />
 	  <PackageReference Include="Yw.Application.Phart.Core" Version="3.3.1" />
 	  <PackageReference Include="Yw.Application.Unit.Core" Version="3.1.8" />
diff --git a/Entry/HStation.Entry.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user b/Entry/HStation.Entry.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
index e948a76..ba9f489 100644
--- a/Entry/HStation.Entry.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
+++ b/Entry/HStation.Entry.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -5,7 +5,7 @@
 <Project>
   <PropertyGroup>
     <_PublishTargetUrl>D:\WorkData\git\HStation\XHS\Entry\HStation.Entry.Xhs.Core\bin\Release\net6.0\publish\</_PublishTargetUrl>
-    <History>True|2025-01-24T01:10:22.0248945Z;True|2025-01-23T10:54:42.2796686+08:00;True|2025-01-22T07:53:29.9931150+08:00;True|2025-01-21T11:37:36.9296374+08:00;True|2025-01-20T10:42:21.8992153+08:00;True|2025-01-20T10:41:30.8562468+08:00;True|2025-01-20T10:36:54.9849821+08:00;True|2025-01-20T10:31:16.0442319+08:00;True|2025-01-13T15:07:40.9182715+08:00;True|2025-01-13T12:08:58.0115763+08:00;True|2025-01-13T12:08:44.3187386+08:00;True|2025-01-13T12:07:41.4659157+08:00;True|2025-01-13T11:53:47.1828627+08:00;True|2025-01-13T11:38:53.6150404+08:00;True|2025-01-13T11:37:14.9075336+08:00;True|2025-01-13T11:35:23.3939940+08:00;True|2025-01-13T11:33:41.6199459+08:00;True|2025-01-13T11:32:15.2734783+08:00;True|2025-01-13T11:30:39.9296756+08:00;True|2025-01-13T11:25:02.3605923+08:00;True|2025-01-13T11:21:03.0110309+08:00;True|2025-01-13T11:17:46.3662069+08:00;True|2025-01-08T09:44:09.5132234+08:00;True|2024-09-03T11:22:43.3813050+08:00;True|2024-09-03T11:06:18.0799295+08:00;True|2024-09-03T10:52:25.3198740+08:00;True|2024-09-02T09:16:17.5197059+08:00;False|2024-09-02T09:08:02.4504522+08:00;True|2024-06-20T12:16:07.3854116+08:00;True|2024-06-18T09:13:21.8960491+08:00;True|2024-06-12T18:55:43.2697624+08:00;True|2024-06-12T18:54:42.2191664+08:00;True|2024-06-12T18:37:39.2735086+08:00;True|2024-06-12T18:32:59.2340941+08:00;True|2024-06-12T18:18:57.9018714+08:00;True|2024-06-12T18:13:13.4471521+08:00;True|2024-06-12T18:11:38.4803257+08:00;True|2024-06-12T18:10:00.3753638+08:00;True|2024-06-12T18:03:08.9521607+08:00;True|2024-06-12T17:59:46.2755740+08:00;True|2024-06-12T17:58:01.8017051+08:00;True|2024-06-12T17:56:20.6946001+08:00;True|2024-06-12T17:32:53.8291604+08:00;True|2024-06-12T17:32:38.6492118+08:00;False|2024-06-12T17:32:17.0260105+08:00;True|2024-06-12T17:08:59.9367775+08:00;True|2024-06-12T16:32:42.3320305+08:00;True|2024-06-07T13:34:17.3014803+08:00;True|2024-06-07T13:20:33.5124438+08:00;True|2024-06-07T10:24:47.0351087+08:00;True|2024-06-05T17:04:55.4017239+08:00;True|2024-06-05T16:05:35.1432805+08:00;True|2024-06-05T15:18:06.1797165+08:00;True|2024-06-05T13:53:59.9366676+08:00;True|2024-06-05T13:43:45.7009774+08:00;True|2024-06-05T13:38:18.1415782+08:00;True|2024-06-05T12:14:05.4745826+08:00;True|2024-06-05T12:10:02.8443283+08:00;True|2024-06-02T18:41:28.5233205+08:00;True|2024-06-02T18:21:27.5679625+08:00;True|2024-06-02T17:34:02.6234679+08:00;True|2024-06-02T16:58:23.9422671+08:00;True|2024-06-02T16:16:43.6949096+08:00;True|2024-06-02T14:44:06.8963915+08:00;True|2024-06-02T11:10:51.5587482+08:00;True|2024-06-01T11:30:39.5033584+08:00;True|2024-05-30T16:29:38.0730664+08:00;True|2024-05-30T15:16:14.5429969+08:00;True|2024-05-29T17:31:27.5349115+08:00;True|2024-05-29T16:49:44.3085849+08:00;True|2024-05-29T10:46:15.3071701+08:00;True|2024-05-28T16:21:22.2987178+08:00;True|2024-05-28T11:55:02.0680294+08:00;True|2024-05-24T09:27:50.0479340+08:00;True|2024-05-23T14:16:32.3824342+08:00;True|2024-05-23T10:51:43.4383910+08:00;True|2024-05-22T11:19:10.1709647+08:00;True|2024-05-22T11:12:47.8835237+08:00;True|2024-05-22T10:43:34.7720709+08:00;True|2024-05-21T17:25:46.9831973+08:00;True|2024-05-21T12:11:55.2774332+08:00;True|2024-05-13T10:32:18.9951394+08:00;True|2024-05-09T09:53:09.1673089+08:00;True|2024-05-08T17:18:58.3017566+08:00;True|2024-05-08T11:15:08.3734126+08:00;True|2024-05-07T10:59:04.2016283+08:00;True|2024-05-07T10:58:56.6254107+08:00;True|2024-05-07T10:56:03.7274034+08:00;True|2024-05-07T10:55:53.5496684+08:00;True|2024-05-07T10:55:41.1246352+08:00;True|2024-05-07T09:57:18.3908307+08:00;True|2024-05-06T18:17:15.0427456+08:00;True|2024-05-06T17:38:00.0855585+08:00;True|2024-05-06T14:04:15.4665470+08:00;True|2024-05-06T09:38:06.9447096+08:00;False|2024-05-06T09:37:21.4257032+08:00;True|2024-04-30T10:27:11.6268274+08:00;True|2024-04-29T17:32:47.8657162+08:00;True|2024-04-29T17:26:03.4222331+08:00;True|2024-04-29T15:01:02.7501034+08:00;</History>
+    <History>True|2025-01-25T04:24:10.7702918Z;True|2025-01-24T09:10:22.0248945+08:00;True|2025-01-23T10:54:42.2796686+08:00;True|2025-01-22T07:53:29.9931150+08:00;True|2025-01-21T11:37:36.9296374+08:00;True|2025-01-20T10:42:21.8992153+08:00;True|2025-01-20T10:41:30.8562468+08:00;True|2025-01-20T10:36:54.9849821+08:00;True|2025-01-20T10:31:16.0442319+08:00;True|2025-01-13T15:07:40.9182715+08:00;True|2025-01-13T12:08:58.0115763+08:00;True|2025-01-13T12:08:44.3187386+08:00;True|2025-01-13T12:07:41.4659157+08:00;True|2025-01-13T11:53:47.1828627+08:00;True|2025-01-13T11:38:53.6150404+08:00;True|2025-01-13T11:37:14.9075336+08:00;True|2025-01-13T11:35:23.3939940+08:00;True|2025-01-13T11:33:41.6199459+08:00;True|2025-01-13T11:32:15.2734783+08:00;True|2025-01-13T11:30:39.9296756+08:00;True|2025-01-13T11:25:02.3605923+08:00;True|2025-01-13T11:21:03.0110309+08:00;True|2025-01-13T11:17:46.3662069+08:00;True|2025-01-08T09:44:09.5132234+08:00;True|2024-09-03T11:22:43.3813050+08:00;True|2024-09-03T11:06:18.0799295+08:00;True|2024-09-03T10:52:25.3198740+08:00;True|2024-09-02T09:16:17.5197059+08:00;False|2024-09-02T09:08:02.4504522+08:00;True|2024-06-20T12:16:07.3854116+08:00;True|2024-06-18T09:13:21.8960491+08:00;True|2024-06-12T18:55:43.2697624+08:00;True|2024-06-12T18:54:42.2191664+08:00;True|2024-06-12T18:37:39.2735086+08:00;True|2024-06-12T18:32:59.2340941+08:00;True|2024-06-12T18:18:57.9018714+08:00;True|2024-06-12T18:13:13.4471521+08:00;True|2024-06-12T18:11:38.4803257+08:00;True|2024-06-12T18:10:00.3753638+08:00;True|2024-06-12T18:03:08.9521607+08:00;True|2024-06-12T17:59:46.2755740+08:00;True|2024-06-12T17:58:01.8017051+08:00;True|2024-06-12T17:56:20.6946001+08:00;True|2024-06-12T17:32:53.8291604+08:00;True|2024-06-12T17:32:38.6492118+08:00;False|2024-06-12T17:32:17.0260105+08:00;True|2024-06-12T17:08:59.9367775+08:00;True|2024-06-12T16:32:42.3320305+08:00;True|2024-06-07T13:34:17.3014803+08:00;True|2024-06-07T13:20:33.5124438+08:00;True|2024-06-07T10:24:47.0351087+08:00;True|2024-06-05T17:04:55.4017239+08:00;True|2024-06-05T16:05:35.1432805+08:00;True|2024-06-05T15:18:06.1797165+08:00;True|2024-06-05T13:53:59.9366676+08:00;True|2024-06-05T13:43:45.7009774+08:00;True|2024-06-05T13:38:18.1415782+08:00;True|2024-06-05T12:14:05.4745826+08:00;True|2024-06-05T12:10:02.8443283+08:00;True|2024-06-02T18:41:28.5233205+08:00;True|2024-06-02T18:21:27.5679625+08:00;True|2024-06-02T17:34:02.6234679+08:00;True|2024-06-02T16:58:23.9422671+08:00;True|2024-06-02T16:16:43.6949096+08:00;True|2024-06-02T14:44:06.8963915+08:00;True|2024-06-02T11:10:51.5587482+08:00;True|2024-06-01T11:30:39.5033584+08:00;True|2024-05-30T16:29:38.0730664+08:00;True|2024-05-30T15:16:14.5429969+08:00;True|2024-05-29T17:31:27.5349115+08:00;True|2024-05-29T16:49:44.3085849+08:00;True|2024-05-29T10:46:15.3071701+08:00;True|2024-05-28T16:21:22.2987178+08:00;True|2024-05-28T11:55:02.0680294+08:00;True|2024-05-24T09:27:50.0479340+08:00;True|2024-05-23T14:16:32.3824342+08:00;True|2024-05-23T10:51:43.4383910+08:00;True|2024-05-22T11:19:10.1709647+08:00;True|2024-05-22T11:12:47.8835237+08:00;True|2024-05-22T10:43:34.7720709+08:00;True|2024-05-21T17:25:46.9831973+08:00;True|2024-05-21T12:11:55.2774332+08:00;True|2024-05-13T10:32:18.9951394+08:00;True|2024-05-09T09:53:09.1673089+08:00;True|2024-05-08T17:18:58.3017566+08:00;True|2024-05-08T11:15:08.3734126+08:00;True|2024-05-07T10:59:04.2016283+08:00;True|2024-05-07T10:58:56.6254107+08:00;True|2024-05-07T10:56:03.7274034+08:00;True|2024-05-07T10:55:53.5496684+08:00;True|2024-05-07T10:55:41.1246352+08:00;True|2024-05-07T09:57:18.3908307+08:00;True|2024-05-06T18:17:15.0427456+08:00;True|2024-05-06T17:38:00.0855585+08:00;True|2024-05-06T14:04:15.4665470+08:00;True|2024-05-06T09:38:06.9447096+08:00;False|2024-05-06T09:37:21.4257032+08:00;True|2024-04-30T10:27:11.6268274+08:00;True|2024-04-29T17:32:47.8657162+08:00;True|2024-04-29T17:26:03.4222331+08:00;</History>
     <LastFailureDetails />
   </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/Hydro/HStation.Hydro.Core/HStation.Hydro.Core.csproj b/Hydro/HStation.Hydro.Core/HStation.Hydro.Core.csproj
index 8cf6007..6496326 100644
--- a/Hydro/HStation.Hydro.Core/HStation.Hydro.Core.csproj
+++ b/Hydro/HStation.Hydro.Core/HStation.Hydro.Core.csproj
@@ -7,7 +7,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Yw.Service.Hydro.Core" Version="5.0.8" />
+    <PackageReference Include="Yw.Service.Hydro.Core" Version="5.0.9" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj b/Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj
index 857575b..422ca54 100644
--- a/Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj
+++ b/Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj
@@ -8,7 +8,7 @@
 
   <ItemGroup>
     <PackageReference Include="Yw.Geometry.Core" Version="3.3.2" />
-    <PackageReference Include="Yw.Service.Hydro.Core" Version="5.0.8" />
+    <PackageReference Include="Yw.Service.Hydro.Core" Version="5.0.9" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/01-import/00-core/ImportXhsProjectHelper.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/01-import/00-core/ImportXhsProjectHelper.cs
index 2e564da..77f9dda 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/01-import/00-core/ImportXhsProjectHelper.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/01-import/00-core/ImportXhsProjectHelper.cs
@@ -333,8 +333,8 @@
                 return true;
             }
 
-            //var bimfaceId = await Yw.WinFrmUI.BimfaceHelper.UploadFile(rvtFileInfo.FullName);//姝e紡浠g爜
-            var bimfaceId = 10000884893369;//娴嬭瘯鐢ㄤ緥  鍒舵爱寰幆:10000884893369  10000894297457  10000895957527  10000896316958 10000896755736 10000899666805
+            var bimfaceId = await Yw.WinFrmUI.BimfaceHelper.UploadFile(rvtFileInfo.FullName);//姝e紡浠g爜
+            //var bimfaceId = 10000884893369;//娴嬭瘯鐢ㄤ緥  鍒舵爱寰幆:10000884893369   10000896755736 10000899666805
             if (bimfaceId < 1)
             {
                 feedBackMsg?.Invoke("Revit妯″瀷鏂囦欢涓婁紶澶辫触锛侊紒锛�", Color.Red);
@@ -404,8 +404,8 @@
 
             feedBackProgress?.Invoke(100, 60);
             feedBackMsg?.Invoke("姝e湪杩涜妯″瀷杞婚噺鍖�...", Color.Black);
-            //var bimfaceTranslateStatus = await Yw.WinFrmUI.BimfaceHelper.TranslateRvtFile(bimfaceId);//鍙戣捣杞崲
-            var bimfaceTranslateStatus = Yw.BIMFace.eTranslateStatus.Processing;//娴嬭瘯浠g爜
+            var bimfaceTranslateStatus = await Yw.WinFrmUI.BimfaceHelper.TranslateRvtFile(bimfaceId);//鍙戣捣杞崲
+            //var bimfaceTranslateStatus = Yw.BIMFace.eTranslateStatus.Processing;//娴嬭瘯浠g爜
 
             if (bimfaceTranslateStatus != Yw.BIMFace.eTranslateStatus.Success)
             {
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/03-calcu/02-label/SimulationCalcuResultLabelHelper.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/03-calcu/02-label/SimulationCalcuResultLabelHelper.cs
index 6a2765e..e549194 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/03-calcu/02-label/SimulationCalcuResultLabelHelper.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/03-calcu/02-label/SimulationCalcuResultLabelHelper.cs
@@ -97,6 +97,18 @@
                                     new LogicCalcuCustomLabelItem(){ Name="杩涘彛鍘嬪姏",Value=Math.Round(calcuPumpResult.CalcuPr1.Value,2).ToString(),Unit="m"},
                                     new LogicCalcuCustomLabelItem(){ Name="鍑哄彛鍘嬪姏",Value=Math.Round(calcuPumpResult.CalcuPr2.Value,2).ToString(),Unit="m"},
                         };
+                    if (x.Paras != null && x.Paras.Count > 0)
+                    {
+                        foreach (var item in x.Paras)
+                        {
+                            pumpCustomLabel.Data.Add(new LogicCalcuCustomLabelItem()
+                            {
+                                Name = item.Key,
+                                Value = item.Value,
+                                Unit = string.Empty
+                            });
+                        }
+                    }
                     allCalcuLabels.Add(pumpCustomLabel);
                 }
             });
@@ -136,6 +148,18 @@
                           new LogicCalcuCustomLabelItem(){ Name="娴侀噺",Value=Math.Round(calcuEmitter.CalcuQ.Value,1).ToString(),Unit="m鲁/h"},
                           new LogicCalcuCustomLabelItem(){ Name="鍘嬪姏",Value=Math.Round(calcuEmitter.CalcuPr.Value,2).ToString(),Unit="m"}
                     };
+                if (x.Paras != null && x.Paras.Count > 0)
+                {
+                    foreach (var item in x.Paras)
+                    {
+                        emitterCustomLabel.Data.Add(new LogicCalcuCustomLabelItem()
+                        {
+                            Name = item.Key,
+                            Value = item.Value,
+                            Unit = string.Empty
+                        });
+                    }
+                }
                 allCalcuLabels.Add(emitterCustomLabel);
             });
 
@@ -143,20 +167,32 @@
 
             #region 姘村姏闃讳欢
 
-            //_calcuResultHelper.HydroInfo.GetAllResistances()?.ForEach(x =>
-            //{
-            //    var calcuResistanceResult = allCalcuResultVisualDict.GetValue(x.Code) as HydroCalcuResistanceResult;
-            //    var resistanceCustomLabel = new LogicCalcuCustomLabel();
-            //    resistanceCustomLabel.Id = x.Code;
-            //    resistanceCustomLabel.Distance = 50000;
-            //    resistanceCustomLabel.Data = new List<LogicCalcuCustomLabelItem>()
-            //        {
-            //              new LogicCalcuCustomLabelItem(){ Name="娴侀噺",Value=Math.Round(calcuResistanceResult.CalcuQ.Value,1).ToString(),Unit="m鲁/h"},
-            //              new LogicCalcuCustomLabelItem(){ Name="杩涘彛鍘嬪姏",Value=Math.Round(calcuResistanceResult.CalcuPr1.Value,2).ToString(),Unit="m"},
-            //              new LogicCalcuCustomLabelItem(){ Name="鍑哄彛鍘嬪姏",Value=Math.Round(calcuResistanceResult.CalcuPr2.Value,2).ToString(),Unit="m"}
-            //        };
-            //    allCalcuLabels.Add(resistanceCustomLabel);
-            //});
+            _calcuResultHelper.HydroInfo.GetAllResistances()?.ForEach(x =>
+            {
+                var calcuResistanceResult = allCalcuResultVisualDict.GetValue(x.Code) as HydroCalcuResistanceResult;
+                var resistanceCustomLabel = new LogicCalcuCustomLabel();
+                resistanceCustomLabel.Id = x.Code;
+                resistanceCustomLabel.Distance = 50000;
+                resistanceCustomLabel.Data = new List<LogicCalcuCustomLabelItem>()
+                    {
+                          new LogicCalcuCustomLabelItem(){ Name="娴侀噺",Value=Math.Round(calcuResistanceResult.CalcuQ.Value,1).ToString(),Unit="m鲁/h"},
+                          new LogicCalcuCustomLabelItem(){ Name="杩涘彛鍘嬪姏",Value=Math.Round(calcuResistanceResult.CalcuPr1.Value,2).ToString(),Unit="m"},
+                          new LogicCalcuCustomLabelItem(){ Name="鍑哄彛鍘嬪姏",Value=Math.Round(calcuResistanceResult.CalcuPr2.Value,2).ToString(),Unit="m"}
+                    };
+                if (x.Paras != null && x.Paras.Count > 0)
+                {
+                    foreach (var item in x.Paras)
+                    {
+                        resistanceCustomLabel.Data.Add(new LogicCalcuCustomLabelItem()
+                        {
+                            Name = item.Key,
+                            Value = item.Value,
+                            Unit = string.Empty
+                        });
+                    }
+                }
+                allCalcuLabels.Add(resistanceCustomLabel);
+            });
 
             #endregion
 
diff --git a/WinFrmUI/Yw.WinFrmUI.Core/04-property/DictionaryPropertyAdapter.cs b/WinFrmUI/Yw.WinFrmUI.Core/04-property/DictionaryPropertyAdapter.cs
new file mode 100644
index 0000000..6e43170
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Core/04-property/DictionaryPropertyAdapter.cs
@@ -0,0 +1,128 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    [TypeConverter(typeof(ExpandableObjectConverter))]
+    public class DictionaryPropertyAdapter : ICustomTypeDescriptor
+    {
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public DictionaryPropertyAdapter(IDictionary d)
+        {
+            _dictionary = d;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public IDictionary Dictionary
+        {
+            get { return _dictionary; }
+        }
+        private IDictionary _dictionary;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public string GetComponentName()
+        {
+            return TypeDescriptor.GetComponentName(this, true);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public EventDescriptor GetDefaultEvent()
+        {
+            return TypeDescriptor.GetDefaultEvent(this, true);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public string GetClassName()
+        {
+            return TypeDescriptor.GetClassName(this, true);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public EventDescriptorCollection GetEvents(Attribute[] attributes)
+        {
+            return TypeDescriptor.GetEvents(this, attributes, true);
+        }
+
+        EventDescriptorCollection System.ComponentModel.ICustomTypeDescriptor.GetEvents()
+        {
+            return TypeDescriptor.GetEvents(this, true);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public TypeConverter GetConverter()
+        {
+            return TypeDescriptor.GetConverter(this, true);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public object GetPropertyOwner(PropertyDescriptor pd)
+        {
+            return _dictionary;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public AttributeCollection GetAttributes()
+        {
+            return TypeDescriptor.GetAttributes(this, true);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public object GetEditor(Type editorBaseType)
+        {
+            return TypeDescriptor.GetEditor(this, editorBaseType, true);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public PropertyDescriptor GetDefaultProperty()
+        {
+            return null;
+        }
+
+        PropertyDescriptorCollection System.ComponentModel.ICustomTypeDescriptor.GetProperties()
+        {
+            return ((ICustomTypeDescriptor)this).GetProperties(new Attribute[0]);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+        {
+            ArrayList properties = new ArrayList();
+            foreach (DictionaryEntry e in _dictionary)
+            {
+                properties.Add(new DictionaryPropertyDescriptor(_dictionary, e.Key));
+            }
+
+            PropertyDescriptor[] props =
+            (PropertyDescriptor[])properties.ToArray(typeof(PropertyDescriptor));
+
+            return new PropertyDescriptorCollection(props);
+        }
+
+
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Core/04-property/DictionaryPropertyDescriptor.cs b/WinFrmUI/Yw.WinFrmUI.Core/04-property/DictionaryPropertyDescriptor.cs
new file mode 100644
index 0000000..245d559
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Core/04-property/DictionaryPropertyDescriptor.cs
@@ -0,0 +1,94 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public class DictionaryPropertyDescriptor : PropertyDescriptor
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public DictionaryPropertyDescriptor(IDictionary d, object key) : base(key.ToString(), null)
+        {
+            _dictionary = d;
+            _key = key;
+        }
+
+        private IDictionary _dictionary;
+        private object _key;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public override Type PropertyType
+        {
+            get
+            {
+                var value = _dictionary[_key];
+                if (value == null)
+                {
+                    return typeof(string);
+                }
+                return value.GetType();
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public override void SetValue(object component, object value)
+        {
+            _dictionary[_key] = value;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public override object GetValue(object component)
+        {
+            return _dictionary[_key];
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public override bool IsReadOnly
+        {
+            get { return false; }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public override Type ComponentType
+        {
+            get { return null; }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public override bool CanResetValue(object component)
+        {
+            return false;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public override void ResetValue(object component)
+        {
+
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public override bool ShouldSerializeValue(object component)
+        {
+            return false;
+        }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/ParasItemViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/ParasItemViewModel.cs
new file mode 100644
index 0000000..6081b0a
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/ParasItemViewModel.cs
@@ -0,0 +1,26 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public class ParasItemViewModel
+    {
+        /// <summary>
+        /// 灞炴�у悕绉�
+        /// </summary>
+        [Display(Name = "灞炴�у悕绉�")]
+        public string PropName { get; set; }
+
+        /// <summary>
+        /// 灞炴�у��
+        /// </summary>
+        [Display(Name = "灞炴�у��")]
+        public string PropValue { get; set; }
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasDlg.Designer.cs
new file mode 100644
index 0000000..a86edf5
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasDlg.Designer.cs
@@ -0,0 +1,131 @@
+锘縩amespace Yw.WinFrmUI
+{
+    partial class SetParasDlg
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            layoutControl1 = new LayoutControl();
+            Root = new LayoutControlGroup();
+            setParasGridCtrl1 = new SetParasGridCtrl();
+            layoutControlItem1 = new LayoutControlItem();
+            generalOkAndCancelCtrl1 = new GeneralOkAndCancelCtrl();
+            layoutControlItem4 = new LayoutControlItem();
+            ((ISupportInitialize)layoutControl1).BeginInit();
+            layoutControl1.SuspendLayout();
+            ((ISupportInitialize)Root).BeginInit();
+            ((ISupportInitialize)layoutControlItem1).BeginInit();
+            ((ISupportInitialize)layoutControlItem4).BeginInit();
+            SuspendLayout();
+            // 
+            // layoutControl1
+            // 
+            layoutControl1.Controls.Add(generalOkAndCancelCtrl1);
+            layoutControl1.Controls.Add(setParasGridCtrl1);
+            layoutControl1.Dock = DockStyle.Fill;
+            layoutControl1.Location = new Point(0, 0);
+            layoutControl1.Name = "layoutControl1";
+            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(763, 142, 650, 400);
+            layoutControl1.Root = Root;
+            layoutControl1.Size = new Size(497, 240);
+            layoutControl1.TabIndex = 0;
+            layoutControl1.Text = "layoutControl1";
+            // 
+            // Root
+            // 
+            Root.EnableIndentsWithoutBorders = DefaultBoolean.True;
+            Root.GroupBordersVisible = false;
+            Root.Items.AddRange(new BaseLayoutItem[] { layoutControlItem1, layoutControlItem4 });
+            Root.Name = "Root";
+            Root.Size = new Size(497, 240);
+            Root.TextVisible = false;
+            // 
+            // setParasGridCtrl1
+            // 
+            setParasGridCtrl1.Location = new Point(12, 12);
+            setParasGridCtrl1.Name = "setParasGridCtrl1";
+            setParasGridCtrl1.Size = new Size(473, 186);
+            setParasGridCtrl1.TabIndex = 7;
+            // 
+            // layoutControlItem1
+            // 
+            layoutControlItem1.Control = setParasGridCtrl1;
+            layoutControlItem1.Location = new Point(0, 0);
+            layoutControlItem1.Name = "layoutControlItem1";
+            layoutControlItem1.Size = new Size(477, 190);
+            layoutControlItem1.TextSize = new Size(0, 0);
+            layoutControlItem1.TextVisible = false;
+            // 
+            // generalOkAndCancelCtrl1
+            // 
+            generalOkAndCancelCtrl1.ButtonCancelMaxSize = new Size(100, 26);
+            generalOkAndCancelCtrl1.ButtonCancelMinSize = new Size(100, 26);
+            generalOkAndCancelCtrl1.ButtonOkMaxSize = new Size(100, 26);
+            generalOkAndCancelCtrl1.ButtonOkMinSize = new Size(100, 26);
+            generalOkAndCancelCtrl1.Location = new Point(12, 202);
+            generalOkAndCancelCtrl1.Name = "generalOkAndCancelCtrl1";
+            generalOkAndCancelCtrl1.Size = new Size(473, 26);
+            generalOkAndCancelCtrl1.TabIndex = 8;
+            // 
+            // layoutControlItem4
+            // 
+            layoutControlItem4.Control = generalOkAndCancelCtrl1;
+            layoutControlItem4.Location = new Point(0, 190);
+            layoutControlItem4.MaxSize = new Size(0, 30);
+            layoutControlItem4.MinSize = new Size(205, 30);
+            layoutControlItem4.Name = "layoutControlItem4";
+            layoutControlItem4.Size = new Size(477, 30);
+            layoutControlItem4.SizeConstraintsType = SizeConstraintsType.Custom;
+            layoutControlItem4.TextSize = new Size(0, 0);
+            layoutControlItem4.TextVisible = false;
+            // 
+            // SetParasDlg
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(497, 240);
+            Controls.Add(layoutControl1);
+            Name = "SetParasDlg";
+            StartPosition = FormStartPosition.CenterParent;
+            Text = "璁剧疆鍙傛暟";
+            ((ISupportInitialize)layoutControl1).EndInit();
+            layoutControl1.ResumeLayout(false);
+            ((ISupportInitialize)Root).EndInit();
+            ((ISupportInitialize)layoutControlItem1).EndInit();
+            ((ISupportInitialize)layoutControlItem4).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private LayoutControl layoutControl1;
+        private LayoutControlGroup Root;
+        private GeneralOkAndCancelCtrl generalOkAndCancelCtrl1;
+        private SetParasGridCtrl setParasGridCtrl1;
+        private LayoutControlItem layoutControlItem1;
+        private LayoutControlItem layoutControlItem4;
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasDlg.cs b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasDlg.cs
new file mode 100644
index 0000000..9c7a4f4
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasDlg.cs
@@ -0,0 +1,46 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public partial class SetParasDlg : DevExpress.XtraEditors.XtraForm
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public SetParasDlg()
+        {
+            InitializeComponent();
+            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
+            this.layoutControl1.SetupLayoutControl();
+            this.generalOkAndCancelCtrl1.OkEvent += GeneralOkAndCancelCtrl1_OkEvent;
+        }
+
+        /// <summary>
+        /// 閲嶈浇鏁版嵁浜嬩欢
+        /// </summary>
+        public event Action<Dictionary<string, string>> ReloadDataEvent;
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(Dictionary<string, string> dict)
+        {
+            this.setParasGridCtrl1.SetBindingData(dict);
+        }
+
+        //纭畾
+        private void GeneralOkAndCancelCtrl1_OkEvent()
+        {
+            var paras = this.setParasGridCtrl1.GetParas();
+            this.ReloadDataEvent?.Invoke(paras);
+            this.DialogResult = DialogResult.OK;
+            this.Close();
+        }
+
+       
+
+
+
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasDlg.resx b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasDlg.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasDlg.resx
@@ -0,0 +1,120 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasGridCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasGridCtrl.Designer.cs
new file mode 100644
index 0000000..28f286f
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasGridCtrl.Designer.cs
@@ -0,0 +1,150 @@
+锘縩amespace Yw.WinFrmUI
+{
+    partial class SetParasGridCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new Container();
+            DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions2 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions();
+            ComponentResourceManager resources = new ComponentResourceManager(typeof(SetParasGridCtrl));
+            SerializableAppearanceObject serializableAppearanceObject5 = new SerializableAppearanceObject();
+            SerializableAppearanceObject serializableAppearanceObject6 = new SerializableAppearanceObject();
+            SerializableAppearanceObject serializableAppearanceObject7 = new SerializableAppearanceObject();
+            SerializableAppearanceObject serializableAppearanceObject8 = new SerializableAppearanceObject();
+            gridControl1 = new GridControl();
+            parasItemViewModelBindingSource1 = new BindingSource(components);
+            gridView1 = new GridView();
+            colPropName = new GridColumn();
+            colPropValue = new GridColumn();
+            colDelete = new GridColumn();
+            repositoryItemButtonEdit1 = new DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit();
+            repositoryItemColorPickEdit1 = new DevExpress.XtraEditors.Repository.RepositoryItemColorPickEdit();
+            ((ISupportInitialize)gridControl1).BeginInit();
+            ((ISupportInitialize)parasItemViewModelBindingSource1).BeginInit();
+            ((ISupportInitialize)gridView1).BeginInit();
+            ((ISupportInitialize)repositoryItemButtonEdit1).BeginInit();
+            ((ISupportInitialize)repositoryItemColorPickEdit1).BeginInit();
+            SuspendLayout();
+            // 
+            // gridControl1
+            // 
+            gridControl1.DataSource = parasItemViewModelBindingSource1;
+            gridControl1.Dock = DockStyle.Fill;
+            gridControl1.Location = new Point(0, 0);
+            gridControl1.MainView = gridView1;
+            gridControl1.Name = "gridControl1";
+            gridControl1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemColorPickEdit1, repositoryItemButtonEdit1 });
+            gridControl1.Size = new Size(452, 355);
+            gridControl1.TabIndex = 0;
+            gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridView1 });
+            // 
+            // gridView1
+            // 
+            gridView1.Columns.AddRange(new GridColumn[] { colPropName, colPropValue, colDelete });
+            gridView1.GridControl = gridControl1;
+            gridView1.Name = "gridView1";
+            gridView1.RowCellClick += gridView1_RowCellClick;
+            gridView1.CustomRowCellEdit += gridView1_CustomRowCellEdit;
+            gridView1.ShowingEditor += gridView1_ShowingEditor;
+            gridView1.InitNewRow += gridView1_InitNewRow;
+            gridView1.ValidatingEditor += gridView1_ValidatingEditor;
+            // 
+            // colPropName
+            // 
+            colPropName.Caption = "灞炴�у悕绉�";
+            colPropName.FieldName = "PropName";
+            colPropName.Name = "colPropName";
+            colPropName.Visible = true;
+            colPropName.VisibleIndex = 0;
+            colPropName.Width = 675;
+            // 
+            // colPropValue
+            // 
+            colPropValue.Caption = "灞炴�у��";
+            colPropValue.FieldName = "PropValue";
+            colPropValue.Name = "colPropValue";
+            colPropValue.Visible = true;
+            colPropValue.VisibleIndex = 1;
+            colPropValue.Width = 653;
+            // 
+            // colDelete
+            // 
+            colDelete.Caption = "鍒犻櫎";
+            colDelete.ColumnEdit = repositoryItemButtonEdit1;
+            colDelete.MaxWidth = 60;
+            colDelete.MinWidth = 60;
+            colDelete.Name = "colDelete";
+            colDelete.OptionsColumn.AllowEdit = false;
+            colDelete.Visible = true;
+            colDelete.VisibleIndex = 2;
+            colDelete.Width = 60;
+            // 
+            // repositoryItemButtonEdit1
+            // 
+            repositoryItemButtonEdit1.AutoHeight = false;
+            editorButtonImageOptions2.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("editorButtonImageOptions2.SvgImage");
+            editorButtonImageOptions2.SvgImageSize = new Size(20, 20);
+            repositoryItemButtonEdit1.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "", -1, true, true, false, editorButtonImageOptions2, new KeyShortcut(Keys.None), serializableAppearanceObject5, serializableAppearanceObject6, serializableAppearanceObject7, serializableAppearanceObject8, "", null, null, ToolTipAnchor.Default) });
+            repositoryItemButtonEdit1.Name = "repositoryItemButtonEdit1";
+            repositoryItemButtonEdit1.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.HideTextEditor;
+            // 
+            // repositoryItemColorPickEdit1
+            // 
+            repositoryItemColorPickEdit1.AutoHeight = false;
+            repositoryItemColorPickEdit1.AutomaticColor = Color.Black;
+            repositoryItemColorPickEdit1.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo) });
+            repositoryItemColorPickEdit1.Name = "repositoryItemColorPickEdit1";
+            repositoryItemColorPickEdit1.NullColor = Color.Empty;
+            repositoryItemColorPickEdit1.ShowWebSafeColors = true;
+            // 
+            // SetParasGridCtrl
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(gridControl1);
+            Name = "SetParasGridCtrl";
+            Size = new Size(452, 355);
+            ((ISupportInitialize)gridControl1).EndInit();
+            ((ISupportInitialize)parasItemViewModelBindingSource1).EndInit();
+            ((ISupportInitialize)gridView1).EndInit();
+            ((ISupportInitialize)repositoryItemButtonEdit1).EndInit();
+            ((ISupportInitialize)repositoryItemColorPickEdit1).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private DevExpress.XtraGrid.GridControl gridControl1;
+        private DevExpress.XtraGrid.Views.Grid.GridView gridView1;
+        private BindingSource parasItemViewModelBindingSource1;
+        private DevExpress.XtraEditors.Repository.RepositoryItemColorPickEdit repositoryItemColorPickEdit1;
+        private DevExpress.XtraGrid.Columns.GridColumn colDelete;
+        private DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit repositoryItemButtonEdit1;
+        private DevExpress.XtraGrid.Columns.GridColumn colPropName;
+        private GridColumn colPropValue;
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasGridCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasGridCtrl.cs
new file mode 100644
index 0000000..43c9366
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasGridCtrl.cs
@@ -0,0 +1,148 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public partial class SetParasGridCtrl : DevExpress.XtraEditors.XtraUserControl
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public SetParasGridCtrl()
+        {
+            InitializeComponent();
+            this.gridView1.SetBindingLimitEditView();
+        }
+
+        private BindingList<ParasItemViewModel> _allBindingList = null;
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(Dictionary<string, string> dict)
+        {
+            _allBindingList = new BindingList<ParasItemViewModel>();
+            if (dict != null && dict.Count > 0)
+            {
+                foreach (var item in dict)
+                {
+                    _allBindingList.Add(new ParasItemViewModel()
+                    {
+                        PropName = item.Key,
+                        PropValue = item.Value
+                    });
+                }
+            }
+            this.parasItemViewModelBindingSource1.DataSource = _allBindingList;
+            this.parasItemViewModelBindingSource1.ResetBindings(false);
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟
+        /// </summary>
+        public Dictionary<string, string> GetParas()
+        {
+            var dict = new Dictionary<string, string>();
+            if (_allBindingList != null && _allBindingList.Count > 0)
+            {
+                foreach (var item in _allBindingList)
+                {
+                    if (!string.IsNullOrEmpty(item.PropName))
+                    {
+                        if (!dict.ContainsKey(item.PropName))
+                        {
+                            dict.Add(item.PropName, item.PropValue);
+                        }
+                    }
+                }
+            }
+            return dict;
+        }
+
+        //鑷畾涔変笅鎷夋
+        private void gridView1_CustomRowCellEdit(object sender, DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventArgs e)
+        {
+            if (e.Column == this.colPropName)
+            {
+
+            }
+        }
+
+        //鍒濆鍖�
+        private void gridView1_InitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e)
+        {
+            if (_allBindingList == null)
+            {
+                return;
+            }
+            var row = this.gridView1.GetRow(e.RowHandle) as ParasItemViewModel;
+            if (row != null)
+            {
+                row.PropValue = string.Empty;
+            }
+        }
+
+        //缂栬緫妗嗘樉绀�
+        private void gridView1_ShowingEditor(object sender, CancelEventArgs e)
+        {
+            if (_allBindingList == null)
+            {
+                e.Cancel = true;
+                return;
+            }
+            var row = this.gridView1.GetFocusedRow() as ParasItemViewModel;
+            if (row == null)
+            {
+                var col = this.gridView1.FocusedColumn;
+                if (col != this.colPropName)
+                {
+                    e.Cancel = true;
+                    return;
+                }
+            }
+        }
+
+        //鍒犻櫎
+        private void gridView1_RowCellClick(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventArgs e)
+        {
+            if (e.Column == this.colDelete)
+            {
+                var row = this.gridView1.GetRow(e.RowHandle) as ParasItemViewModel;
+                if (row != null)
+                {
+                    _allBindingList?.Remove(row);
+                }
+            }
+        }
+
+        //楠岃瘉
+        private void gridView1_ValidatingEditor(object sender, DevExpress.XtraEditors.Controls.BaseContainerValidateEditorEventArgs e)
+        {
+            if (_allBindingList == null)
+            {
+                return;
+            }
+            var row = this.gridView1.GetFocusedRow() as ParasItemViewModel;
+            if (row != null)
+            {
+                var col = this.gridView1.FocusedColumn;
+                if (col == this.colPropName)
+                {
+                    if (e.Value != null)
+                    {
+                        var propName = e.Value.ToString();
+                        var count = _allBindingList.Count(x => x.PropName == propName && x != row);
+                        if (count > 0)
+                        {
+                            e.Valid = false;
+                            e.ErrorText = "閲嶅";
+                        }
+                    }
+                }
+            }
+
+        }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasGridCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasGridCtrl.resx
new file mode 100644
index 0000000..024c28b
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Core/09-common/08-paras/SetParasGridCtrl.resx
@@ -0,0 +1,145 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="parasItemViewModelBindingSource1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+  <data name="editorButtonImageOptions2.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAD0DAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJs
+        YWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQoJLkdyZWVue2ZpbGw6IzAzOUMy
+        Mzt9CgkuWWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQo8L3N0eWxlPg0KICA8ZyBpZD0iRGVsZXRlIj4N
+        CiAgICA8Zz4NCiAgICAgIDxwYXRoIGQ9Ik0xOC44LDE2bDYuOS02LjljMC40LTAuNCwwLjQtMSwwLTEu
+        NGwtMS40LTEuNGMtMC40LTAuNC0xLTAuNC0xLjQsMEwxNiwxMy4yTDkuMSw2LjNjLTAuNC0wLjQtMS0w
+        LjQtMS40LDAgICAgTDYuMyw3LjdjLTAuNCwwLjQtMC40LDEsMCwxLjRsNi45LDYuOWwtNi45LDYuOWMt
+        MC40LDAuNC0wLjQsMSwwLDEuNGwxLjQsMS40YzAuNCwwLjQsMSwwLjQsMS40LDBsNi45LTYuOWw2Ljks
+        Ni45ICAgIGMwLjQsMC40LDEsMC40LDEuNCwwbDEuNC0xLjRjMC40LTAuNCwwLjQtMSwwLTEuNEwxOC44
+        LDE2eiIgY2xhc3M9IlJlZCIgLz4NCiAgICA8L2c+DQogIDwvZz4NCjwvc3ZnPgs=
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Core/Yw.WinFrmUI.Core.csproj b/WinFrmUI/Yw.WinFrmUI.Core/Yw.WinFrmUI.Core.csproj
index 151c0a6..bd983c2 100644
--- a/WinFrmUI/Yw.WinFrmUI.Core/Yw.WinFrmUI.Core.csproj
+++ b/WinFrmUI/Yw.WinFrmUI.Core/Yw.WinFrmUI.Core.csproj
@@ -49,6 +49,12 @@
     <Compile Update="09-common\07-search\GeneralSearchCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
+    <Compile Update="09-common\08-paras\SetParasDlg.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Update="09-common\08-paras\SetParasGridCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Update="11-tree\01-simple\SimpleTreeViewCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/01-parter/HydroParterViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/01-parter/HydroParterViewModel.cs
index 1387a53..9b088be 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/01-parter/HydroParterViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/01-parter/HydroParterViewModel.cs
@@ -28,7 +28,7 @@
             this.DbLocked = rhs.DbLocked;
             this.Flags = Yw.Untity.FlagsHelper.ToString(rhs.Flags);
             this.Description = rhs.Description;
-
+            this.Paras = new DictionaryPropertyAdapter(rhs.Paras);
             this.Vmo = rhs;
             this.HydroInfo = hydroInfo;
         }
@@ -102,11 +102,22 @@
         public virtual string Flags { get; set; }
 
         /// <summary>
+        /// 鍙傛暟
+        /// </summary>
+        [Category("鍩虹淇℃伅")]
+        [DisplayName("鍙傛暟")]
+        [HydroParasPro]
+        [PropertyOrder(7)]
+        [Browsable(true)]
+        public virtual DictionaryPropertyAdapter Paras { get; set; }
+
+
+        /// <summary>
         /// 璇存槑
         /// </summary>
         [Category("鍩虹淇℃伅")]
         [DisplayName("璇存槑")]
-        [PropertyOrder(7)]
+        [PropertyOrder(8)]
         [MultiText]
         [Browsable(true)]
         public virtual string Description { get; set; }
@@ -161,6 +172,7 @@
             this.ModelType = this.Vmo.ModelType;
             this.DbId = this.Vmo.DbId;
             this.Flags = Yw.Untity.FlagsHelper.ToString(this.Vmo.Flags);
+            this.Paras = new DictionaryPropertyAdapter(this.Vmo.Paras);
             this.Description = this.Vmo.Description;
             this.DbLocked = this.Vmo.DbLocked;
         }
@@ -177,6 +189,7 @@
             this.Vmo.DbId = this.DbId;
             this.Vmo.DbLocked = this.DbLocked;
             this.Vmo.Flags = Yw.Untity.FlagsHelper.ToList(this.Flags);
+            this.Vmo.Paras = (Dictionary<string, string>)this.Paras?.Dictionary;
             this.Vmo.Description = this.Description;
         }
 
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/05-attribute/HydroParasProAttribute.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/05-attribute/HydroParasProAttribute.cs
new file mode 100644
index 0000000..b64526d
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/05-attribute/HydroParasProAttribute.cs
@@ -0,0 +1,18 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鐢ㄤ簬鏍囪瘑姘村姏鍙傛暟灞炴�х壒鎬�
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
+    public class HydroParasProAttribute : Attribute
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroParasProAttribute() { }
+
+
+
+    }
+
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs
index da2f1f2..cea843b 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs
@@ -231,10 +231,12 @@
                 var stringValue = (string[])e.Properties.Value;
                 e.CellText = stringValue?.Length.ToString();
             }
+            else if (fullTypeName == typeof(DictionaryPropertyAdapter).FullName)
+            {
+                e.CellText = string.Empty;
+            }
             else
             {
-
-
                 var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row);
                 if (descriptor != null)
                 {
@@ -427,6 +429,7 @@
                 {
                     var buttonEdit = new RepositoryItemButtonEdit();
                     buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor;
+
                     buttonEdit.ButtonClick += async delegate
                     {
                         var vm = GetPropertyViewModel(e.Row);
@@ -450,6 +453,37 @@
 
             #endregion
 
+            #region 鍙傛暟
+
+            if (descriptor != null)
+            {
+                var parasProAttri = (HydroParasProAttribute)descriptor.Attributes[typeof(HydroParasProAttribute)];
+                if (parasProAttri != null)
+                {
+                    var buttonEdit = new RepositoryItemButtonEdit();
+                    buttonEdit.TextEditStyle = TextEditStyles.HideTextEditor;
+                    buttonEdit.ButtonClick += delegate
+                    {
+                        var vm = GetPropertyViewModel(e.Row);
+                        var dlg = new SetParasDlg();
+                        dlg.SetBindingData(vm.Vmo.Paras);
+                        dlg.ReloadDataEvent += (paras) =>
+                        {
+                            vm.Vmo.Paras = paras;
+                            vm.Paras = new DictionaryPropertyAdapter(paras);
+                            this.propertyGridControl1.UpdateRows();
+                            this.propertyGridControl1.RefreshEditor();
+                            this.PropertyValueChangedEvent?.Invoke(vm);
+                        };
+                        dlg.ShowDialog();
+                    };
+                    e.RepositoryItem = buttonEdit;
+                }
+            }
+
+
+            #endregion
+
             #region 杩炴帴
 
             if (e.Row.Properties.Value != null)
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
index 4e5466b..e8e7f67 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
@@ -57,7 +57,7 @@
 	<ItemGroup>
 		<PackageReference Include="DevExpress.Win.Design" Version="23.2.4" />
 		<PackageReference Include="Yw.BLL.Basic.Core" Version="3.3.3" />
-		<PackageReference Include="Yw.BLL.Hydro.Core" Version="3.8.7" />
+		<PackageReference Include="Yw.BLL.Hydro.Core" Version="3.8.8" />
 		<PackageReference Include="Yw.Pump.Core" Version="3.2.4" />
 	</ItemGroup>
 

--
Gitblit v1.9.3