ntminer 4 年之前
父节点
当前提交
9c0b6ab163
共有 100 个文件被更改,包括 3859 次插入2782 次删除
  1. 2 0
      NTMiner.sln
  2. 4 4
      README.md
  3. 3 1
      docs/Index.md
  4. 53 0
      docs/代号系统.md
  5. 32 0
      docs/关于杀毒软件.txt
  6. 2 1
      src/AppModels/AppModels.csproj
  7. 7 7
      src/AppModels/AppRoot.cs
  8. 4 4
      src/AppModels/AppRoot.partials.CoinGroupViewModels.cs
  9. 5 5
      src/AppModels/AppRoot.partials.CoinKernelViewModels.cs
  10. 3 3
      src/AppModels/AppRoot.partials.CoinProfileViewModels.cs
  11. 8 8
      src/AppModels/AppRoot.partials.CoinViewModels.cs
  12. 5 5
      src/AppModels/AppRoot.partials.FileWriterViewModels.cs
  13. 5 5
      src/AppModels/AppRoot.partials.FragmentWriterViewModels.cs
  14. 2 3
      src/AppModels/AppRoot.partials.GpuProfileViewModels.cs
  15. 27 0
      src/AppModels/AppRoot.partials.GpuSpeedViewModels.cs
  16. 34 0
      src/AppModels/AppRoot.partials.GpuViewModels.cs
  17. 5 5
      src/AppModels/AppRoot.partials.GroupViewModels.cs
  18. 5 5
      src/AppModels/AppRoot.partials.KernelInputViewModels.cs
  19. 5 5
      src/AppModels/AppRoot.partials.KernelOutputTranslaterViewModels.cs
  20. 5 5
      src/AppModels/AppRoot.partials.KernelOutputViewModels.cs
  21. 5 5
      src/AppModels/AppRoot.partials.KernelViewModels.cs
  22. 5 5
      src/AppModels/AppRoot.partials.PackageViewModels.cs
  23. 5 5
      src/AppModels/AppRoot.partials.PoolKernelViewModels.cs
  24. 2 2
      src/AppModels/AppRoot.partials.PoolProfileViewModels.cs
  25. 5 5
      src/AppModels/AppRoot.partials.PoolViewModels.cs
  26. 5 5
      src/AppModels/AppRoot.partials.SysDicItemViewModels.cs
  27. 5 5
      src/AppModels/AppRoot.partials.SysDicViewModels.cs
  28. 4 4
      src/AppModels/AppRoot.partials.WalletViewModels.cs
  29. 12 4
      src/AppModels/AppStatic.cs
  30. 1 0
      src/AppModels/Messages.cs
  31. 1 1
      src/AppModels/MinerStudio/Impl/LocalMinerStudioService.cs
  32. 27 20
      src/AppModels/MinerStudio/Impl/ServerMinerStudioService.cs
  33. 5 0
      src/AppModels/MinerStudio/Messages.cs
  34. 19 3
      src/AppModels/MinerStudio/MinerStudioRoot.cs
  35. 3 3
      src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerClientConsoleViewModel.cs
  36. 3 3
      src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerClientMessagesViewModel.cs
  37. 3 3
      src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerClientOperationResultsViewModel.cs
  38. 0 123
      src/AppModels/MinerStudio/MinerStudioService.cs
  39. 34 0
      src/AppModels/MinerStudio/Vms/ActionCountViewModel.cs
  40. 105 0
      src/AppModels/MinerStudio/Vms/ActionCountsViewModel.cs
  41. 2 1
      src/AppModels/MinerStudio/Vms/CalcConfigViewModel.cs
  42. 22 0
      src/AppModels/MinerStudio/Vms/CalcConfigViewModels.cs
  43. 1 1
      src/AppModels/MinerStudio/Vms/ChangePasswordViewModel.cs
  44. 1 1
      src/AppModels/MinerStudio/Vms/GpuNameCountsViewModel.cs
  45. 1 1
      src/AppModels/MinerStudio/Vms/GpuProfilesPageViewModel.cs
  46. 1 1
      src/AppModels/MinerStudio/Vms/LocalIpConfigViewModel.cs
  47. 4 4
      src/AppModels/MinerStudio/Vms/MineWorkViewModel.cs
  48. 2 2
      src/AppModels/MinerStudio/Vms/MinerClientAddViewModel.cs
  49. 1 1
      src/AppModels/MinerStudio/Vms/MinerClientSettingViewModel.cs
  50. 100 20
      src/AppModels/MinerStudio/Vms/MinerClientViewModel.cs
  51. 37 18
      src/AppModels/MinerStudio/Vms/MinerClientsWindowViewModel.cs
  52. 10 1
      src/AppModels/MinerStudio/Vms/MinerGroupViewModel.cs
  53. 6 3
      src/AppModels/MinerStudio/Vms/NTMinerFileSelectViewModel.cs
  54. 10 0
      src/AppModels/MinerStudio/Vms/OverClockDataViewModel.cs
  55. 1 1
      src/AppModels/MinerStudio/Vms/VirtualMemoryViewModel.cs
  56. 28 0
      src/AppModels/MinerStudio/Vms/WebApiServerStateViewModel.cs
  57. 8 2
      src/AppModels/MinerStudio/Vms/WsServerNodePageViewModel.cs
  58. 15 0
      src/AppModels/MinerStudio/Vms/WsServerNodeStateViewModel.cs
  59. 2 2
      src/AppModels/View/AbstractAppViewFactory.cs
  60. 1 1
      src/AppModels/View/IAppViewFactory.cs
  61. 30 0
      src/AppModels/Vms/CoinProfileViewModel.cs
  62. 15 0
      src/AppModels/Vms/GpuProfileViewModel.cs
  63. 130 2
      src/AppModels/Vms/GpuViewModel.cs
  64. 4 5
      src/AppModels/Vms/KernelOutputKeywordViewModel.cs
  65. 60 9
      src/AppModels/Vms/KernelOutputViewModel.cs
  66. 1 1
      src/AppModels/Vms/KernelsWindowViewModel.cs
  67. 0 8
      src/AppModels/Vms/MainWindowViewModel.cs
  68. 26 9
      src/AppModels/Vms/MinerProfileViewModel.cs
  69. 28 14
      src/AppModels/Vms/SpeedViewModel.cs
  70. 1 1
      src/AppModels/Vms/StartStopMineButtonViewModel.cs
  71. 20 0
      src/AppModels/Vms/UserViewModel.cs
  72. 5 0
      src/AppViews0/AppViewFactory.cs
  73. 11 0
      src/AppViews0/AppViews0.csproj
  74. 2 0
      src/AppViews0/MinerStudio/Views/Design/ActionCountsViewModel.xaml
  75. 0 33
      src/AppViews0/MinerStudio/Views/MinerClientsWindow.xaml
  76. 2 1
      src/AppViews0/MinerStudio/Views/MinerClientsWindow.xaml.cs
  77. 185 0
      src/AppViews0/MinerStudio/Views/Ucs/ActionCounts.xaml
  78. 44 0
      src/AppViews0/MinerStudio/Views/Ucs/ActionCounts.xaml.cs
  79. 46 23
      src/AppViews0/MinerStudio/Views/Ucs/CalcConfig.xaml
  80. 4 4
      src/AppViews0/MinerStudio/Views/Ucs/GpuProfilesPage.xaml.cs
  81. 1 1
      src/AppViews0/MinerStudio/Views/Ucs/LocalIpConfig.xaml.cs
  82. 25 4
      src/AppViews0/MinerStudio/Views/Ucs/MinerClient.xaml
  83. 2265 2231
      src/AppViews0/MinerStudio/Views/Ucs/MinerClients.xaml
  84. 1 1
      src/AppViews0/MinerStudio/Views/Ucs/MinerClientsPagging.xaml
  85. 5 0
      src/AppViews0/MinerStudio/Views/Ucs/MinerClientsPagging.xaml.cs
  86. 2 1
      src/AppViews0/MinerStudio/Views/Ucs/MinerClientsToolBar.xaml.cs
  87. 8 1
      src/AppViews0/MinerStudio/Views/Ucs/UserPage.xaml
  88. 5 0
      src/AppViews0/MinerStudio/Views/Ucs/UserPage.xaml.cs
  89. 1 1
      src/AppViews0/MinerStudio/Views/Ucs/VirtualMemory.xaml.cs
  90. 45 22
      src/AppViews0/MinerStudio/Views/Ucs/WsServerNodePage.xaml
  91. 2 2
      src/AppViews0/MinerStudio/Views/Ucs/WsServerNodePage.xaml.cs
  92. 4 14
      src/AppViews0/Views/MainWindow.xaml
  93. 36 9
      src/AppViews0/Views/MainWindow.xaml.cs
  94. 2 2
      src/AppViews0/Views/Ucs/AboutPage.xaml
  95. 16 1
      src/AppViews0/Views/Ucs/AppMiner.xaml
  96. 0 3
      src/AppViews0/Views/Ucs/CoinPage.xaml
  97. 4 3
      src/AppViews0/Views/Ucs/InnerProperty.xaml.cs
  98. 83 53
      src/AppViews0/Views/Ucs/KernelOutputEdit.xaml
  99. 1 1
      src/AppViews0/Views/Ucs/KernelOutputKeywords.xaml
  100. 21 0
      src/AppViews0/Views/Ucs/MainMenu.xaml

+ 2 - 0
NTMiner.sln

@@ -64,6 +64,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{E32C4009-7
 		docs\NTMinerBkPool.md = docs\NTMinerBkPool.md
 		docs\Overclock.md = docs\Overclock.md
 		docs\TimingEventProducer.md = docs\TimingEventProducer.md
+		docs\代号系统.md = docs\代号系统.md
+		docs\关于杀毒软件.txt = docs\关于杀毒软件.txt
 	EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "View", "View", "{6F255C76-FE02-4484-8368-DD7899E06FDC}"

+ 4 - 4
README.md

@@ -1,4 +1,4 @@
-点击加入 [NTMiner官方QQ群](http://qm.qq.com/cgi-bin/qm/qr?k=cvTZEdM92suKOTy0fjzdCvZkJ-tFFekn): 863725136
+点击加入 [NTMiner官方QQ群](https://jq.qq.com/?_wv=1027&k=NdqW5ONU): 530887262
 
 1. 开源矿工内置的所有内核均为原版,开源矿工永远不会额外增加矿工支出;
 2. 开源矿工永远开源;
@@ -22,7 +22,7 @@
 ## 开发者也是用户
 良好的软件都有一个共性:开发者自己每天都在使用自己开发的软件。这个软件展示给矿工的只是挖矿相关的核心功能,更多的功能是给开发者用的,开发者管理币种、矿池、内核等一切数据的工具也是这个软件本身,开发者在开发者模式写配置导出了放在阿里云OSS上,然后矿工们运行的普通模式从阿里云读配置,最终矿工只需要填写自己的钱包地址一键开挖即可。
 
-## 商业模式
+## 如何盈利/商业逻辑
 开源矿工的原则是永远不增加矿工的支出,永远不非法获取国人内核作者的开发费。开源矿工的源代码是开源的,全世界的人可以围观,杜绝了作恶的可能,因为如果开源矿工做出越界的事情的话人群中一定会有人站出来大喝一声指出的,所以大家可以放心使用,开源是一种态度,作者想表明自己没有作恶的意愿。
 
 ### 为什么可以说开源矿工是0抽水?
@@ -34,10 +34,10 @@
 
 类似开源矿工这些同类挖矿辅助工具降低了挖矿门槛帮助矿工管理矿机,获得一点收入是合理的,但是不能偷。
 
-点击加入 [NTMiner官方QQ群](http://qm.qq.com/cgi-bin/qm/qr?k=cvTZEdM92suKOTy0fjzdCvZkJ-tFFekn): 863725136
+点击加入 [NTMiner官方QQ群](https://jq.qq.com/?_wv=1027&k=NdqW5ONU): 530887262
 
 # 授权协议
 The LGPL license。
 
 # 友情链接
-[蜜蜂矿池](https://www.beepool.org/)    [BMiner](https://www.bminer.me/)    [loserhub](https://www.loserhub.cn/)    [挖币网](http://www.wabi.com/)
+[蜜蜂矿池](https://www.beepool.org/)    [鱼池](https://www.f2pool.com/)    [星火](https://www.sparkpool.com/)    [BMiner](https://www.bminer.me/)    [NBMiner](https://nbminer.com/)    [loserhub](https://www.loserhub.cn/)    [挖币网](http://www.wabi.com/)

+ 3 - 1
docs/Index.md

@@ -2,6 +2,7 @@
 
 代码的用户有三个:人、IDE、运行时,IDE介于人和运行时之间连接两者。
 
+* 有些项目比如NTMinerDaemon直接引用了别的项目比如NTMinerlib的代码文件而不是引用整个NTMinerlib类库,这是为了消减依赖和共用代码,因为NTMinerlib中有更多NTMinerDaemon用不到的代码。
 * 开源矿工有大量的代码,大部分代码是为了造型为了将信息链条连贯出来避免跳跃避免魔术。
 * 挖矿客户端、群控客户端 共用了相同的类库,类库里面有些地方会根据程序类型的不同执行不同的逻辑,似乎是不应该共用类库,但将挖矿端和群控端看作是一个程序就行了。
 * 源码中到处都是接口,有些接口的意义可能只是为了让IDE帮助监管代码,消灭手误。
@@ -15,4 +16,5 @@
 * 局部性是好事,但也有利弊,凡是有可能变化的事物在开源矿工中都具有唯一性,它们都挂载在VirtualRoot、NTMinerRoot、RpcRoot、AppRoot上,也就是说此类对象不会注入到当地也不允许当地持有对此类对象的引用,只允许在过程中(方法或函数)从Root根开始索引。
 * 新版本的C#语法不要求对只读属性声明private set访问器,这不是一个好特性,开源矿工不会使用这个语法,因为没有private set访问器的声明就没法在set上右键查找引用位置了。
 * 用属性不要用字段,因为字段上没有IDE提供的引用计数信息。
-* 数据常驻内存,数据在内存中列表、字典排布。内存中是存在形如Dictionary<TId, List<TValue>>类型的数据的,其中的List<TValue>可能会直接以引用的形式返回给调用者,调用者拿到后可能会foreach,但List<TValue>可能会在foreach期间被另外的线程修改,所以这里需要两点约定:1,使用数组传达不可变性;2,枚举List前应ToArray个快照,枚举快照。
+* 数据常驻内存,数据在内存中列表、字典排布。内存中是存在形如Dictionary<TId, List<TValue>>类型的数据的,其中的List<TValue>可能会直接以引用的形式返回给调用者,调用者拿到后可能会foreach,但List<TValue>可能会在foreach期间被另外的线程修改,所以这里需要两点约定:1,使用数组传达不可变性;2,枚举List前应ToArray个快照,枚举快照。
+* 开源矿工运行时对内存空间的布置通常都是延迟到直到第一次行走进那个空间时才会布置那个空间,这很好理解因为布置内存的数据可能来自于磁盘或网络等IO,延迟布置可以加快开源矿工的启动速度。布置且只布置一次,所以会有个_isInited和_locker,需要注意的是某些内存集布置完成时会向总线报告布置完成事件,而别处对布置完成事件的响应中可能又会访问到这份刚刚布置完还没来得急将_isInited置为true的内存集导致死循环,这个死循环我线下开发时遇到过一次特此记录,解决办法很简单:确保在发布布置完成事件到总线上之前将_isInited置为true,为了保证这个确保所以整了一个SetBase抽象基类在基类中确保。

+ 53 - 0
docs/代号系统.md

@@ -0,0 +1,53 @@
+## 开源矿工的取名体系来自国产动画片《魁拔》;
+
+* 挖矿端(蛮吉):
+蛮吉是第六代魁拔;
+
+* 群控客户端(蛮小满):
+蛮小满是一个兽族妖侠,他收养了蛮吉;
+
+* 矿机雷达(敖江):
+敖江是16队的后裔,他的任务是寻找魁拔;
+
+* 涡流岛:
+第四代魁拔迷麟的兵器“冲天槊”遗留在涡流岛,蛮吉将去那里取回冲天槊,蛮吉的朋友和战士在那里等他。
+这是开源矿工外网群控服务端程序,和官方运行的服务端功能上完全一样,唯一的区别是官方程序运行在集
+群上,这个程序运行在用户自己的比如阿里云服务器上,如果您没有上千台矿机建议您直接连接官方的外网
+群控服务器。
+搁置,以后再实现,只要能保证官方外网服务器集群的可用性就不需要用户自己部署外网服务器。
+
+
+魁拔这个故事中有很多好听的名字,这些名字将来可能被开源矿工借用,他们是:
+## 命名集合
+* 迷麟(上一代魁拔)
+* 蛮吉(第六代魁拔,本故事的主人公)
+* 蛮小满
+* 奇衡三
+* 海问香
+* 大仓
+* 秋落木
+* 幽弥狂
+* 幽若离
+* 雷光
+* 吧咕嗒
+* 万两
+* 梅龙尼卡·嘉
+* 卡拉肖克·玲
+* 燃谷
+* 卡拉肖克·潘
+* 雪伦
+* 镜心
+* 远浪
+* 敖江
+* ……
+
+## 故事概述
+### 故事中的角色分为两派:
+* 魁拔的朋友和战士;
+* 魁拔的敌人。
+
+故事的整体逻辑是:魁拔是个坏人,但整个故事从头到尾未让魁拔干过坏事,魁拔的朋友和战士在追随魁拔
+之前大都是魁拔的敌人,魁拔不会被允许成功,但允许魁拔一代代复活,演绎一场场美丽动人的故事,循环
+下去,每333年一个周期。
+
+我是奇衡三

+ 32 - 0
docs/关于杀毒软件.txt

@@ -0,0 +1,32 @@
+开源矿工本身不具有任何恶意代码,且开源矿工100%开源没有任何一行代码不开源,且
+开源矿工运行时不会自动下载任何可执行代码,之所以这样设计就是为了防止被人恶意
+抹黑,如果您觉得中木马或者病毒了(您和杀毒软件认为的木马或病毒对于挖矿领域来
+说通常不是木马和病毒)如果安装过其它挖矿软件请去找其它挖矿软件作者或内核作者
+,开源矿工不接受任何恶意抹黑。
+
+多数挖矿内核和挖矿软件会报毒,矿机不安装杀毒软件是常识。挖矿这个行业有认知
+门槛,还没有被大众认可,但也因此存在认知差时间差有利可图。
+
+## 不要用CPU挖矿
+开源矿工不支持CPU挖矿。像门罗这种使用CPU挖矿的币给整个挖矿行业带来持久的负
+面影响,人人喊打,因为CPU一挖矿电脑就卡死就干不了别的了,CPU挖矿严重影响工
+作和生活干扰人们的核心日常活动,甚至吸引黑产侵占他人财产进行挖矿。
+
+## 为什么报毒
+所以多数挖矿内核和挖矿软件都会报毒,虽然显卡挖矿不使用CPU不会让电脑卡死,虽
+然99%的家用和办公电脑的显卡达不到显卡挖矿的最低需求从而保护了工作和生活,但
+杀毒软件不会考虑那么多,只要挖矿就杀。
+
+## 开源透明
+开源矿工的原则是永远不增加矿工的支出,永远不非法获取国人内核作者的开发费。开
+源矿工的源代码是开源的,全世界的人可以围观,杜绝了作恶的可能,因为如果开源矿
+工做出越界的事情的话人群中一定会有人站出来大喝一声指出的,所以大家可以放心使
+用,开源是一种态度,作者想表明自己没有作恶的意愿。
+
+## 有损网页浏览体验
+开源矿工的官网多次被人向谷歌举报,所以当您用谷歌浏览器打开开源矿工的官网时可
+能会得到红色的警告信息,大意是“传播有损网页浏览体验的程序”,仔细看谷歌并没
+有说开源矿工是病毒或木马,说的是有损网页浏览体验,谷歌以为开源矿工是用CPU挖矿
+的是让电脑卡死的,但实际上开源矿工是用显卡挖矿的不会让电脑卡死,且矿机也根本
+不是用来浏览网页的。官网多次遇到这种情况,我朋友说是有人举报的,每次我去找谷
+歌申诉过几天会好,但竞品还是会举报。

+ 2 - 1
src/AppModels/AppModels.csproj

@@ -70,7 +70,6 @@
     <Compile Include="AppRoot.partials.CoinKernelViewModels.cs" />
     <Compile Include="AppRoot.partials.CoinProfileViewModels.cs" />
     <Compile Include="MinerStudio\Impl\EmptyWsClient.cs" />
-    <Compile Include="MinerStudio\MinerStudioService.cs" />
     <Compile Include="AppRoot.partials.CoinViewModels.cs" />
     <Compile Include="MinerStudio\MinerStudioRoot.partials.ColumnsShowViewModels.cs" />
     <Compile Include="AppRoot.partials.DriveSetViewModel.cs" />
@@ -102,6 +101,7 @@
     <Compile Include="ExtendedNotifyIcon.cs" />
     <Compile Include="MinerStudio\Messages.cs" />
     <Compile Include="MinerStudio\MinerStudioRoot.cs" />
+    <Compile Include="MinerStudio\Vms\ActionCountsViewModel.cs" />
     <Compile Include="MinerStudio\Vms\ChangePasswordViewModel.cs" />
     <Compile Include="MinerStudio\Vms\CpuDataViewModel.cs" />
     <Compile Include="MinerStudio\Vms\GpuNameCountsViewModel.cs" />
@@ -125,6 +125,7 @@
     <Compile Include="View\AbstractAppViewFactory.cs" />
     <Compile Include="View\IAppViewFactory.cs" />
     <Compile Include="Vms\AboutPageViewModel.cs" />
+    <Compile Include="MinerStudio\Vms\ActionCountViewModel.cs" />
     <Compile Include="Vms\AlgoSelectItem.cs" />
     <Compile Include="Vms\BrandTagViewModel.cs" />
     <Compile Include="MinerStudio\Vms\CalcConfigViewModel.cs" />

+ 7 - 7
src/AppModels/AppRoot.cs

@@ -23,9 +23,9 @@ namespace NTMiner {
 
         #region methods
         // 因为是上下文路径,无需返回路径标识
-        public static void BuildCmdPath<TCmd>(string description, LogEnum logType, Action<TCmd> path, Type location)
+        public static void BuildCmdPath<TCmd>(LogEnum logType, Action<TCmd> path, Type location)
             where TCmd : ICmd {
-            var messagePathId = VirtualRoot.BuildMessagePath(description, logType, path, location);
+            var messagePathId = VirtualRoot.BuildCmdPath(path, location, logType);
             _contextPathIds.Add(messagePathId);
         }
 
@@ -92,7 +92,7 @@ namespace NTMiner {
         public static string NppPackageUrl {
             get {
                 const string url = "https://minerjson.oss-cn-beijing.aliyuncs.com/npp.zip";
-                if (WpfUtil.IsDevMode) {
+                if (WpfUtil.IsInDesignMode) {
                     return url;
                 }
                 return NTMinerContext.Instance.ServerContext.SysDicItemSet.TryGetDicItemValue("Tool", "npp", defaultValue: url);
@@ -103,10 +103,10 @@ namespace NTMiner {
         public static double OsVmPerGpu {
             get {
                 double value = 5.0;
-                if (WpfUtil.IsDevMode) {
+                if (WpfUtil.IsInDesignMode) {
                     return value;
                 }
-                return NTMinerContext.Instance.ServerContext.SysDicItemSet.TryGetDicItemValue(NTKeyword.ThisSystemSysDicCode, "OsVmPerGpu", value);
+                return NTMinerContext.Instance.ServerContext.SysDicItemSet.TryGetDicItemValue(NTKeyword.ThisSystemSysDicCode, NTKeyword.OsVmPerGpuSysDicItemCode, value);
             }
         }
 
@@ -132,14 +132,14 @@ namespace NTMiner {
             }));
         }
 
-        public static void Upgrade(NTMinerAppType appType, string fileName, Action callback) {
+        public static void Upgrade(string fileName, Action callback) {
             RpcRoot.OfficialServer.FileUrlService.GetNTMinerUpdaterUrlAsync((downloadFileUrl, e) => {
                 try {
                     string argument = string.Empty;
                     if (!string.IsNullOrEmpty(fileName)) {
                         argument = "ntminerFileName=" + fileName;
                     }
-                    if (appType == NTMinerAppType.MinerStudio) {
+                    if (ClientAppType.IsMinerStudio) {
                         argument += " --minerstudio";
                     }
                     if (string.IsNullOrEmpty(downloadFileUrl)) {

+ 4 - 4
src/AppModels/AppRoot.partials.CoinGroupViewModels.cs

@@ -13,17 +13,17 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         _listByGroupId.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         // 什么也不做,因为该集合没有什么属性
                     }, location: this.GetType());
-                BuildEventPath<CoinGroupAddedEvent>("添加了币组后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<CoinGroupAddedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             CoinGroupViewModel coinGroupVm = new CoinGroupViewModel(message.Source);
@@ -35,7 +35,7 @@ namespace NTMiner {
                             OnGroupPropertyChanged(coinGroupVm.GroupId);
                         }
                     }, location: this.GetType());
-                BuildEventPath<CoinGroupRemovedEvent>("删除了币组后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<CoinGroupRemovedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (_dicById.ContainsKey(message.Source.GetId())) {
                             var entity = _dicById[message.Source.GetId()];

+ 5 - 5
src/AppModels/AppRoot.partials.CoinKernelViewModels.cs

@@ -13,16 +13,16 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         OnPropertyChanged(nameof(AllCoinKernels));
                     }, location: this.GetType());
-                BuildEventPath<CoinKernelAddedEvent>("添加了币种内核后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<CoinKernelAddedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         var coinKernelVm = new CoinKernelViewModel(message.Source);
                         _dicById.Add(message.Source.GetId(), coinKernelVm);
@@ -36,7 +36,7 @@ namespace NTMiner {
                         }
                         VirtualRoot.RaiseEvent(new CoinKernelVmAddedEvent(message));
                     }, location: this.GetType());
-                BuildEventPath<CoinKernelUpdatedEvent>("更新了币种内核后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<CoinKernelUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out CoinKernelViewModel vm)) {
                             var supportedGpu = vm.SupportedGpu;
@@ -55,7 +55,7 @@ namespace NTMiner {
                             }
                         }
                     }, location: this.GetType());
-                BuildEventPath<CoinKernelRemovedEvent>("移除了币种内核后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<CoinKernelRemovedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out CoinKernelViewModel coinKernelVm)) {
                             _dicById.Remove(message.Source.GetId());

+ 3 - 3
src/AppModels/AppRoot.partials.CoinProfileViewModels.cs

@@ -15,19 +15,19 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                BuildEventPath<CoinKernelProfilePropertyChangedEvent>("币种内核设置变更后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<CoinKernelProfilePropertyChangedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (_coinKernelProfileDicById.ContainsKey(message.CoinKernelId)) {
                             _coinKernelProfileDicById[message.CoinKernelId].OnPropertyChanged(message.PropertyName);
                         }
                     }, location: this.GetType());
-                BuildEventPath<CoinProfilePropertyChangedEvent>("币种设置变更后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<CoinProfilePropertyChangedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (_coinProfileDicById.ContainsKey(message.CoinId)) {
                             _coinProfileDicById[message.CoinId].OnPropertyChanged(message.PropertyName);
                         }
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("LocalContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _coinKernelProfileDicById.Clear();
                         _coinProfileDicById.Clear();

+ 8 - 8
src/AppModels/AppRoot.partials.CoinViewModels.cs

@@ -16,42 +16,42 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         AllPropertyChanged();
                     }, location: this.GetType());
-                BuildEventPath<CoinAddedEvent>("添加了币种后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<CoinAddedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         _dicById.Add(message.Source.GetId(), new CoinViewModel(message.Source));
                         AllPropertyChanged();
                         VirtualRoot.RaiseEvent(new CoinVmAddedEvent(message));
                     }, location: this.GetType());
-                BuildEventPath<CoinRemovedEvent>("移除了币种后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<CoinRemovedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Remove(message.Source.GetId());
                         AllPropertyChanged();
                         VirtualRoot.RaiseEvent(new CoinVmRemovedEvent(message));
                     }, location: this.GetType());
-                BuildEventPath<CoinKernelVmAddedEvent>("币种内核Vm集添加了新Vm后刷新币种Vm集的关联内存", LogEnum.DevConsole, path: message => {
+                BuildEventPath<CoinKernelVmAddedEvent>("刷新币种Vm集的关联内存", LogEnum.DevConsole, path: message => {
                     if (_dicById.TryGetValue(message.Event.Source.CoinId, out CoinViewModel coinVm)) {
                         coinVm.OnPropertyChanged(nameof(CoinViewModel.CoinKernel));
                         coinVm.OnPropertyChanged(nameof(CoinViewModel.CoinKernels));
                         coinVm.OnPropertyChanged(nameof(CoinViewModel.IsSupported));
                     }
                 }, this.GetType());
-                BuildEventPath<CoinKernelVmRemovedEvent>("币种内核Vm集删除了新Vm后刷新币种Vm集的关联内存", LogEnum.DevConsole, path: message => {
+                BuildEventPath<CoinKernelVmRemovedEvent>("刷新币种Vm集的关联内存", LogEnum.DevConsole, path: message => {
                     if (_dicById.TryGetValue(message.Event.Source.CoinId, out CoinViewModel coinVm)) {
                         coinVm.OnPropertyChanged(nameof(CoinViewModel.CoinKernel));
                         coinVm.OnPropertyChanged(nameof(CoinViewModel.CoinKernels));
                         coinVm.OnPropertyChanged(nameof(CoinViewModel.IsSupported));
                     }
                 }, this.GetType());
-                BuildEventPath<CoinUpdatedEvent>("更新了币种后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<CoinUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out CoinViewModel vm)) {
                             bool justAsDualCoin = vm.JustAsDualCoin;
@@ -73,7 +73,7 @@ namespace NTMiner {
                             }
                         }
                     }, location: this.GetType());
-                BuildEventPath<CoinIconDownloadedEvent>("下载了币种图标后", LogEnum.DevConsole,
+                BuildEventPath<CoinIconDownloadedEvent>("刷新图标", LogEnum.DevConsole,
                     path: message => {
                         try {
                             if (string.IsNullOrEmpty(message.Source.Icon)) {

+ 5 - 5
src/AppModels/AppRoot.partials.FileWriterViewModels.cs

@@ -17,16 +17,16 @@ namespace NTMiner {
                 this.Add = new DelegateCommand(() => {
                     new FileWriterViewModel(Guid.NewGuid()).Edit.Execute(FormType.Add);
                 });
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         OnPropertyChangeds();
                     }, location: this.GetType());
-                BuildEventPath<FileWriterAddedEvent>("添加了文件书写器后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<FileWriterAddedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             FileWriterViewModel groupVm = new FileWriterViewModel(message.Source);
@@ -34,13 +34,13 @@ namespace NTMiner {
                             OnPropertyChangeds();
                         }
                     }, location: this.GetType());
-                BuildEventPath<FileWriterUpdatedEvent>("更新了文件书写器后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<FileWriterUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out FileWriterViewModel vm)) {
                             vm.Update(message.Source);
                         }
                     }, location: this.GetType());
-                BuildEventPath<FileWriterRemovedEvent>("删除了文件书写器后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<FileWriterRemovedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChangeds();

+ 5 - 5
src/AppModels/AppRoot.partials.FragmentWriterViewModels.cs

@@ -17,16 +17,16 @@ namespace NTMiner {
                 this.Add = new DelegateCommand(() => {
                     new FragmentWriterViewModel(Guid.NewGuid()).Edit.Execute(FormType.Add);
                 });
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         OnPropertyChangeds();
                     }, location: this.GetType());
-                BuildEventPath<FragmentWriterAddedEvent>("添加了命令行片段书写器后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<FragmentWriterAddedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             FragmentWriterViewModel vm = new FragmentWriterViewModel(message.Source);
@@ -34,13 +34,13 @@ namespace NTMiner {
                             OnPropertyChangeds();
                         }
                     }, location: this.GetType());
-                BuildEventPath<FragmentWriterUpdatedEvent>("更新了命令行片段书写器后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<FragmentWriterUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out FragmentWriterViewModel vm)) {
                             vm.Update(message.Source);
                         }
                     }, location: this.GetType());
-                BuildEventPath<FragmentWriterRemovedEvent>("删除了命令行片段书写器后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<FragmentWriterRemovedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChangeds();

+ 2 - 3
src/AppModels/AppRoot.partials.GpuProfileViewModels.cs

@@ -16,7 +16,7 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<GpuProfileSetRefreshedEvent>("Gpu超频集合刷新后刷新附着在当前币种上的超频数据", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<GpuProfileSetRefreshedEvent>("刷新附着在当前币种上的超频数据", LogEnum.DevConsole,
                     path: message => {
                         lock (_locker) {
                             _listByCoinId.Clear();
@@ -25,10 +25,9 @@ namespace NTMiner {
                         var coinVm = MinerProfileVm.CoinVm;
                         if (coinVm != null) {
                             coinVm.OnOverClockPropertiesChanges();
-                            VirtualRoot.Execute(new CoinOverClockCommand(coinVm.Id));
                         }
                     }, location: this.GetType());
-                BuildEventPath<GpuProfileAddedOrUpdatedEvent>("添加或更新了Gpu超频数据后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<GpuProfileAddedOrUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         lock (_locker) {
                             if (_listByCoinId.TryGetValue(message.Source.CoinId, out List<GpuProfileViewModel> list)) {

+ 27 - 0
src/AppModels/AppRoot.partials.GpuSpeedViewModels.cs

@@ -78,6 +78,33 @@ namespace NTMiner {
                             gpuSpeedVm.MainCoinSpeed.AcceptShare = message.Source.MainCoinSpeed.AcceptShare;
                         }
                     }, location: this.GetType());
+                BuildEventPath<AcceptShareSetedEvent>("刷新显卡接受份额VM内存", LogEnum.DevConsole,
+                    path: message => {
+                        ResetIfMainCoinSwitched();
+                        int index = message.Source.Gpu.Index;
+                        GpuSpeedViewModel gpuSpeedVm = _list.FirstOrDefault(a => a.GpuVm.Index == index);
+                        if (gpuSpeedVm != null) {
+                            gpuSpeedVm.MainCoinSpeed.AcceptShare = message.Source.MainCoinSpeed.AcceptShare;
+                        }
+                    }, location: this.GetType());
+                BuildEventPath<RejectShareSetedEvent>("刷新显卡拒绝份额VM内存", LogEnum.DevConsole,
+                    path: message => {
+                        ResetIfMainCoinSwitched();
+                        int index = message.Source.Gpu.Index;
+                        GpuSpeedViewModel gpuSpeedVm = _list.FirstOrDefault(a => a.GpuVm.Index == index);
+                        if (gpuSpeedVm != null) {
+                            gpuSpeedVm.MainCoinSpeed.RejectShare = message.Source.MainCoinSpeed.RejectShare;
+                        }
+                    }, location: this.GetType());
+                BuildEventPath<IncorrectShareSetedEvent>("刷新显卡计算错误份额VM内存", LogEnum.DevConsole,
+                    path: message => {
+                        ResetIfMainCoinSwitched();
+                        int index = message.Source.Gpu.Index;
+                        GpuSpeedViewModel gpuSpeedVm = _list.FirstOrDefault(a => a.GpuVm.Index == index);
+                        if (gpuSpeedVm != null) {
+                            gpuSpeedVm.MainCoinSpeed.IncorrectShare = message.Source.MainCoinSpeed.IncorrectShare;
+                        }
+                    }, location: this.GetType());
                 BuildEventPath<RejectShareIncreasedEvent>("拒绝一个份额后刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         ResetIfMainCoinSwitched();

+ 34 - 0
src/AppModels/AppRoot.partials.GpuViewModels.cs

@@ -14,6 +14,8 @@ namespace NTMiner {
             private string _fanSpeedMaxText = "0 %";
             private string _temperatureMinText = "0 ℃";
             private string _temperatureMaxText = "0 ℃";
+            private string _memTemperatureMinText = "0 ℃";
+            private string _memTemperatureMaxText = "0 ℃";
             private SolidColorBrush _temperatureMaxForeground;
             private readonly GpuViewModel _gpuAllVm;
             private GpuViewModels() {
@@ -54,6 +56,7 @@ namespace NTMiner {
                         if (_gpuVms.ContainsKey(message.Source.Index)) {
                             GpuViewModel vm = _gpuVms[message.Source.Index];
                             vm.Temperature = message.Source.Temperature;
+                            vm.MemTemperature = message.Source.MemTemperature;
                             vm.FanSpeed = message.Source.FanSpeed;
                             vm.PowerUsage = message.Source.PowerUsage;
                             vm.CoreClockDelta = message.Source.CoreClockDelta;
@@ -62,6 +65,7 @@ namespace NTMiner {
                             vm.CoreClockDeltaMax = message.Source.CoreClockDeltaMax;
                             vm.MemoryClockDeltaMin = message.Source.MemoryClockDeltaMin;
                             vm.MemoryClockDeltaMax = message.Source.MemoryClockDeltaMax;
+                            vm.CurrentMemoryTimingLevel = message.Source.CurrentMemoryTimingLevel;
                             vm.Cool = message.Source.Cool;
                             vm.CoolMin = message.Source.CoolMin;
                             vm.CoolMax = message.Source.CoolMax;
@@ -79,6 +83,7 @@ namespace NTMiner {
                             vm.VoltDefault = message.Source.VoltDefault;
                             if (_gpuAllVm != null) {
                                 _gpuAllVm.OnPropertyChanged(nameof(_gpuAllVm.TemperatureText));
+                                _gpuAllVm.OnPropertyChanged(nameof(_gpuAllVm.MemTemperatureText));
                                 _gpuAllVm.OnPropertyChanged(nameof(_gpuAllVm.FanSpeedText));
                                 _gpuAllVm.OnPropertyChanged(nameof(_gpuAllVm.PowerUsageWText));
                                 _gpuAllVm.OnPropertyChanged(nameof(_gpuAllVm.CoreClockDeltaMText));
@@ -112,6 +117,7 @@ namespace NTMiner {
                 this.FanSpeedMaxText = maxFan + " %";
                 this.FanSpeedMinText = minFan + " %";
                 int minTemp = int.MaxValue, maxTemp = int.MinValue;
+                int memMinTemp = int.MaxValue, memMaxTemp = int.MinValue;
                 foreach (var item in _gpuVms.Values) {
                     if (item.Index == NTMinerContext.GpuAllId) {
                         continue;
@@ -122,9 +128,17 @@ namespace NTMiner {
                     if (item.Temperature < minTemp) {
                         minTemp = item.Temperature;
                     }
+                    if (item.MemTemperature > memMaxTemp) {
+                        memMaxTemp = item.MemTemperature;
+                    }
+                    if (item.MemTemperature < memMinTemp) {
+                        memMinTemp = item.MemTemperature;
+                    }
                 }
                 this.TemperatureMinText = minTemp + " ℃";
                 this.TemperatureMaxText = maxTemp + " ℃";
+                this.MemTemperatureMinText = memMinTemp + " ℃";
+                this.MemTemperatureMaxText = memMaxTemp + " ℃";
                 if (maxTemp >= MinerProfileVm.MaxTemp) {
                     this.TemperatureMaxForeground = WpfUtil.RedBrush;
                 }
@@ -168,6 +182,26 @@ namespace NTMiner {
                 }
             }
 
+            public string MemTemperatureMinText {
+                get => _memTemperatureMinText;
+                set {
+                    if (_memTemperatureMinText != value) {
+                        _memTemperatureMinText = value;
+                        OnPropertyChanged(nameof(MemTemperatureMinText));
+                    }
+                }
+            }
+
+            public string MemTemperatureMaxText {
+                get => _memTemperatureMaxText;
+                set {
+                    if (_memTemperatureMaxText != value) {
+                        _memTemperatureMaxText = value;
+                        OnPropertyChanged(nameof(MemTemperatureMaxText));
+                    }
+                }
+            }
+
             public SolidColorBrush TemperatureMaxForeground {
                 get => _temperatureMaxForeground;
                 set {

+ 5 - 5
src/AppModels/AppRoot.partials.GroupViewModels.cs

@@ -19,16 +19,16 @@ namespace NTMiner {
                         SortNumber = Count + 1
                     }.Edit.Execute(FormType.Add);
                 });
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         OnPropertyChangeds();
                     }, location: this.GetType());
-                BuildEventPath<GroupAddedEvent>("添加了组后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<GroupAddedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             GroupViewModel groupVm = new GroupViewModel(message.Source);
@@ -36,7 +36,7 @@ namespace NTMiner {
                             OnPropertyChangeds();
                         }
                     }, location: this.GetType());
-                BuildEventPath<GroupUpdatedEvent>("更新了组后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<GroupUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out GroupViewModel vm)) {
                             int sortNumber = vm.SortNumber;
@@ -47,7 +47,7 @@ namespace NTMiner {
                             }
                         }
                     }, location: this.GetType());
-                BuildEventPath<GroupRemovedEvent>("删除了组后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<GroupRemovedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChangeds();

+ 5 - 5
src/AppModels/AppRoot.partials.KernelInputViewModels.cs

@@ -13,22 +13,22 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         OnPropertyChangeds();
                     }, location: this.GetType());
-                BuildEventPath<KernelInputAddedEvent>("添加了内核输入后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<KernelInputAddedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         var vm = new KernelInputViewModel(message.Source);
                         _dicById.Add(message.Source.GetId(), vm);
                         OnPropertyChangeds();
                     }, location: this.GetType());
-                BuildEventPath<KernelInputUpdatedEvent>("更新了内核输入后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<KernelInputUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out KernelInputViewModel vm)) {
                             if (vm != null) {
@@ -49,7 +49,7 @@ namespace NTMiner {
                             }
                         }
                     }, location: this.GetType());
-                BuildEventPath<KernelInputRemovedEvent>("移除了内核输入后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<KernelInputRemovedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (_dicById.ContainsKey(message.Source.GetId())) {
                             _dicById.Remove(message.Source.GetId());

+ 5 - 5
src/AppModels/AppRoot.partials.KernelOutputTranslaterViewModels.cs

@@ -14,17 +14,17 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         _dicByKernelOutputId.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         OnPropertyChanged(nameof(AllKernelOutputTranslaterVms));
                     }, location: this.GetType());
-                BuildEventPath<KernelOutputTranslaterAddedEvent>("添加了内核输出翻译器后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<KernelOutputTranslaterAddedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (KernelOutputVms.TryGetKernelOutputVm(message.Source.KernelOutputId, out KernelOutputViewModel kernelOutputVm)) {
                             if (!_dicByKernelOutputId.ContainsKey(message.Source.KernelOutputId)) {
@@ -36,7 +36,7 @@ namespace NTMiner {
                             kernelOutputVm.OnPropertyChanged(nameof(kernelOutputVm.KernelOutputTranslaters));
                         }
                     }, location: this.GetType());
-                BuildEventPath<KernelOutputTranslaterUpdatedEvent>("更新了内核输出翻译器后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<KernelOutputTranslaterUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (_dicByKernelOutputId.TryGetValue(message.Source.KernelOutputId, out List<KernelOutputTranslaterViewModel> vms)) {
                             var vm = vms.FirstOrDefault(a => a.Id == message.Source.GetId());
@@ -45,7 +45,7 @@ namespace NTMiner {
                             }
                         }
                     }, location: this.GetType());
-                BuildEventPath<KernelOutputTranslaterRemovedEvent>("移除了内核输出翻译器后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<KernelOutputTranslaterRemovedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (_dicByKernelOutputId.ContainsKey(message.Source.KernelOutputId)) {
                             var item = _dicByKernelOutputId[message.Source.KernelOutputId].FirstOrDefault(a => a.Id == message.Source.GetId());

+ 5 - 5
src/AppModels/AppRoot.partials.KernelOutputViewModels.cs

@@ -13,23 +13,23 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         AllPropertyChanged();
                     }, location: this.GetType());
-                BuildEventPath<KernelOutputAddedEvent>("添加了内核输出组后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<KernelOutputAddedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         var vm = new KernelOutputViewModel(message.Source);
                         _dicById.Add(message.Source.GetId(), vm);
                         OnPropertyChanged(nameof(AllKernelOutputVms));
                         OnPropertyChanged(nameof(PleaseSelectVms));
                     }, location: this.GetType());
-                BuildEventPath<KernelOutputUpdatedEvent>("更新了内核输出组后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<KernelOutputUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out KernelOutputViewModel vm)) {
                             if (vm != null) {
@@ -37,7 +37,7 @@ namespace NTMiner {
                             }
                         }
                     }, location: this.GetType());
-                BuildEventPath<KernelOutputRemovedEvent>("移除了内核输出组后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<KernelOutputRemovedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (_dicById.ContainsKey(message.Source.GetId())) {
                             _dicById.Remove(message.Source.GetId());

+ 5 - 5
src/AppModels/AppRoot.partials.KernelViewModels.cs

@@ -19,16 +19,16 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         OnPropertyChanged(nameof(AllKernels));
                     }, location: this.GetType());
-                BuildEventPath<KernelAddedEvent>("添加了内核后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<KernelAddedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         _dicById.Add(message.Source.GetId(), new KernelViewModel(message.Source));
                         OnPropertyChanged(nameof(AllKernels));
@@ -36,7 +36,7 @@ namespace NTMiner {
                             coinKernelVm.OnPropertyChanged(nameof(coinKernelVm.IsSupportDualMine));
                         }
                     }, location: this.GetType());
-                BuildEventPath<KernelRemovedEvent>("删除了内核后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<KernelRemovedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChanged(nameof(AllKernels));
@@ -44,7 +44,7 @@ namespace NTMiner {
                             coinKernelVm.OnPropertyChanged(nameof(coinKernelVm.IsSupportDualMine));
                         }
                     }, location: this.GetType());
-                BuildEventPath<KernelUpdatedEvent>("更新了内核后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<KernelUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out KernelViewModel vm)) {
                             PublishStatus publishStatus = vm.PublishState;

+ 5 - 5
src/AppModels/AppRoot.partials.PackageViewModels.cs

@@ -13,16 +13,16 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         OnPropertyChanged(nameof(AllPackages));
                     }, location: this.GetType());
-                BuildEventPath<PackageAddedEvent>("添加了包后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<PackageAddedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         _dicById.Add(message.Source.GetId(), new PackageViewModel(message.Source));
                         OnPropertyChanged(nameof(AllPackages));
@@ -30,7 +30,7 @@ namespace NTMiner {
                             item.OnPropertyChanged(nameof(item.IsPackageValid));
                         }
                     }, location: this.GetType());
-                BuildEventPath<PackageRemovedEvent>("删除了包后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<PackageRemovedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChanged(nameof(AllPackages));
@@ -38,7 +38,7 @@ namespace NTMiner {
                             item.OnPropertyChanged(nameof(item.IsPackageValid));
                         }
                     }, location: this.GetType());
-                BuildEventPath<PackageUpdatedEvent>("更新了包后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<PackageUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out PackageViewModel vm)) {
                             vm.Update(message.Source);

+ 5 - 5
src/AppModels/AppRoot.partials.PoolKernelViewModels.cs

@@ -14,16 +14,16 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         OnPropertyChanged(nameof(AllPoolKernels));
                     }, location: this.GetType());
-                BuildEventPath<PoolKernelAddedEvent>("新添了矿池内核后刷新矿池内核VM内存", LogEnum.DevConsole,
+                BuildEventPath<PoolKernelAddedEvent>("刷新矿池内核VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             if (PoolVms.TryGetPoolVm(message.Source.PoolId, out PoolViewModel poolVm)) {
@@ -32,7 +32,7 @@ namespace NTMiner {
                             }
                         }
                     }, location: this.GetType());
-                BuildEventPath<PoolKernelRemovedEvent>("移除了币种内核后刷新矿池内核VM内存", LogEnum.DevConsole,
+                BuildEventPath<PoolKernelRemovedEvent>("刷新矿池内核VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (_dicById.ContainsKey(message.Source.GetId())) {
                             var vm = _dicById[message.Source.GetId()];
@@ -42,7 +42,7 @@ namespace NTMiner {
                             }
                         }
                     }, location: this.GetType());
-                BuildEventPath<PoolKernelUpdatedEvent>("更新了矿池内核后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<PoolKernelUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out PoolKernelViewModel vm)) {
                             vm.Update(message.Source);

+ 2 - 2
src/AppModels/AppRoot.partials.PoolProfileViewModels.cs

@@ -12,13 +12,13 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                BuildEventPath<PoolProfilePropertyChangedEvent>("矿池设置变更后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<PoolProfilePropertyChangedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         if (_dicById.TryGetValue(message.PoolId, out PoolProfileViewModel vm)) {
                             vm.OnPropertyChanged(message.PropertyName);
                         }
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("LocalContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                     }, location: this.GetType());

+ 5 - 5
src/AppModels/AppRoot.partials.PoolViewModels.cs

@@ -12,16 +12,16 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         OnPropertyChanged(nameof(AllPools));
                     }, location: this.GetType());
-                BuildEventPath<PoolAddedEvent>("添加矿池后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<PoolAddedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         _dicById.Add(message.Source.GetId(), new PoolViewModel(message.Source));
                         OnPropertyChanged(nameof(AllPools));
@@ -32,7 +32,7 @@ namespace NTMiner {
                             coinVm.OnPropertyChanged(nameof(CoinViewModel.OptionPools));
                         }
                     }, location: this.GetType());
-                BuildEventPath<PoolRemovedEvent>("删除矿池后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<PoolRemovedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChanged(nameof(AllPools));
@@ -43,7 +43,7 @@ namespace NTMiner {
                             coinVm.OnPropertyChanged(nameof(CoinViewModel.OptionPools));
                         }
                     }, location: this.GetType());
-                BuildEventPath<PoolUpdatedEvent>("更新矿池后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<PoolUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out PoolViewModel vm)) {
                             vm.Update(message.Source);

+ 5 - 5
src/AppModels/AppRoot.partials.SysDicItemViewModels.cs

@@ -13,16 +13,16 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         AllPropertyChanged();
                     }, location: this.GetType());
-                BuildEventPath<SysDicItemAddedEvent>("添加了系统字典项后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<SysDicItemAddedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             _dicById.Add(message.Source.GetId(), new SysDicItemViewModel(message.Source));
@@ -33,7 +33,7 @@ namespace NTMiner {
                             }
                         }
                     }, location: this.GetType());
-                BuildEventPath<SysDicItemUpdatedEvent>("更新了系统字典项后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<SysDicItemUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out SysDicItemViewModel vm)) {
                             int sortNumber = vm.SortNumber;
@@ -46,7 +46,7 @@ namespace NTMiner {
                             }
                         }
                     }, location: this.GetType());
-                BuildEventPath<SysDicItemRemovedEvent>("删除了系统字典项后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<SysDicItemRemovedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         AllPropertyChanged();

+ 5 - 5
src/AppModels/AppRoot.partials.SysDicViewModels.cs

@@ -16,20 +16,20 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("ServerContext刷新后刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
                     path: message => {
                         _dicByCode.Clear();
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("ServerContext的VM集刷新后刷新视图界面", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
                     path: message => {
                         OnPropertyChangeds();
                     }, location: this.GetType());
                 this.Add = new DelegateCommand(() => {
                     new SysDicViewModel(Guid.NewGuid()).Edit.Execute(null);
                 });
-                BuildEventPath<SysDicAddedEvent>("添加了系统字典后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<SysDicAddedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             SysDicViewModel sysDicVm = new SysDicViewModel(message.Source);
@@ -40,7 +40,7 @@ namespace NTMiner {
                             OnPropertyChangeds();
                         }
                     }, location: this.GetType());
-                BuildEventPath<SysDicUpdatedEvent>("更新了系统字典后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<SysDicUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out SysDicViewModel vm)) {
                             int sortNumber = vm.SortNumber;
@@ -50,7 +50,7 @@ namespace NTMiner {
                             }
                         }
                     }, location: this.GetType());
-                BuildEventPath<SysDicRemovedEvent>("删除了系统字典后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<SysDicRemovedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         _dicByCode.Remove(message.Source.Code);

+ 4 - 4
src/AppModels/AppRoot.partials.WalletViewModels.cs

@@ -12,12 +12,12 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("LocalContext刷新后刷新钱包Vm内存", LogEnum.None,
+                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("刷新钱包Vm内存", LogEnum.None,
                     path: message=> {
                         _dicById.Clear();
                         Init();
                     }, location: this.GetType());
-                BuildEventPath<WalletAddedEvent>("添加了钱包后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<WalletAddedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         _dicById.Add(message.Source.GetId(), new WalletViewModel(message.Source));
                         OnPropertyChanged(nameof(WalletList));
@@ -28,7 +28,7 @@ namespace NTMiner {
                         }
                         VirtualRoot.RaiseEvent(new WalletVmAddedEvent(message));
                     }, location: this.GetType());
-                BuildEventPath<WalletRemovedEvent>("删除了钱包后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<WalletRemovedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChanged(nameof(WalletList));
@@ -40,7 +40,7 @@ namespace NTMiner {
                         }
                         VirtualRoot.RaiseEvent(new WalletVmRemovedEvent(message));
                     }, location: this.GetType());
-                BuildEventPath<WalletUpdatedEvent>("更新了钱包后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<WalletUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out WalletViewModel vm)) {
                             vm.Update(message.Source);

+ 12 - 4
src/AppModels/AppStatic.cs

@@ -485,6 +485,10 @@ namespace NTMiner {
         }
         #endregion
 
+        public static ICommand ExtractCosturaCompressedDlls { get; private set; } = new DelegateCommand(() => {
+            CosturaUtil.ExtractCosturaCompressedDlls();
+        });
+
         public static ICommand WindowsProperty { get; private set; } = new DelegateCommand(() => {
             Process.Start("control.exe", "system");
         });
@@ -585,6 +589,10 @@ namespace NTMiner {
             VirtualRoot.Execute(new ShowGpuNamePageCommand());
         });
 
+        public static ICommand ShowActionCountPage { get; private set; } = new DelegateCommand(() => {
+            VirtualRoot.Execute(new ShowActionCountPageCommand());
+        });
+
         public static ICommand ShowChangePassword { get; private set; } = new DelegateCommand(() => {
             VirtualRoot.Execute(new ShowChangePassword());
         });
@@ -751,7 +759,7 @@ namespace NTMiner {
         public static string OfficialSiteName {
             get {
                 string url = "NTMiner.com";
-                if (WpfUtil.IsDevMode) {
+                if (WpfUtil.IsInDesignMode) {
                     return url;
                 }
                 string dicItemValue = NTMinerContext.Instance.ServerContext.SysDicItemSet.TryGetDicItemValue(NTKeyword.ThisSystemSysDicCode, "HomePageUrl", defaultValue: url);
@@ -773,7 +781,7 @@ namespace NTMiner {
         public static string AppMinerName {
             get {
                 const string txt = "开源矿工";
-                if (WpfUtil.IsDevMode) {
+                if (WpfUtil.IsInDesignMode) {
                     return txt;
                 }
                 return NTMinerContext.Instance.ServerContext.SysDicItemSet.TryGetDicItemValue(NTKeyword.ThisSystemSysDicCode, "AppMinerName", txt);
@@ -783,7 +791,7 @@ namespace NTMiner {
         public static string AppMinerDescription {
             get {
                 const string txt = " - 做最好的矿工";
-                if (WpfUtil.IsDevMode) {
+                if (WpfUtil.IsInDesignMode) {
                     return txt;
                 }
                 return NTMinerContext.Instance.ServerContext.SysDicItemSet.TryGetDicItemDescription(NTKeyword.ThisSystemSysDicCode, "AppMinerName", txt);
@@ -793,7 +801,7 @@ namespace NTMiner {
         public static string AppMinerIntro {
             get {
                 const string txt = "开源、开放、安全、专业、更高收益。QQ群863725136";
-                if (WpfUtil.IsDevMode) {
+                if (WpfUtil.IsInDesignMode) {
                     return txt;
                 }
                 return NTMinerContext.Instance.ServerContext.SysDicItemSet.TryGetDicItemValue(NTKeyword.ThisSystemSysDicCode, "AppMinerIntro", txt);

+ 1 - 0
src/AppModels/Messages.cs

@@ -246,6 +246,7 @@ namespace NTMiner {
         }
     }
 
+    [MessageType(description: "打开文件下载器界面")]
     public class ShowFileDownloaderCommand : Cmd {
         public ShowFileDownloaderCommand(
             string downloadFileUrl,

+ 1 - 1
src/AppModels/MinerStudio/Impl/LocalMinerStudioService.cs

@@ -14,7 +14,7 @@ using System.Net.Http;
 
 namespace NTMiner.MinerStudio.Impl {
     public class LocalMinerStudioService : ILocalMinerStudioService {
-        private readonly string _daemonControllerName = RpcRoot.GetControllerName<INTMinerDaemonController>();
+        private readonly string _daemonControllerName = ControllerUtil.GetControllerName<INTMinerDaemonController>();
 
         private readonly IClientDataSet _clientDataSet;
 

+ 27 - 20
src/AppModels/MinerStudio/Impl/ServerMinerStudioService.cs

@@ -8,13 +8,20 @@ using System.Collections.Generic;
 
 namespace NTMiner.MinerStudio.Impl {
     public class ServerMinerStudioService : IServerMinerStudioService {
-        public ServerMinerStudioService() {
+        internal ServerMinerStudioService() {
         }
 
+        private static void ShowWarn() {
+            VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+        }
         #region QueryClientsAsync
         public void QueryClientsAsync(QueryClientsRequest query) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                // 如果是刚刚登录,Ws连接可能正在连接中还没连上了就不用提示和服务器失去连接了。
+                if ((DateTime.Now - RpcRoot.LoginedOn).Seconds < 2) {
+                    return;
+                }
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.QueryClientDatas) {
@@ -44,7 +51,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region EnableRemoteDesktopAsync
         public void EnableRemoteDesktopAsync(IMinerData client) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.EnableRemoteDesktop) {
@@ -78,7 +85,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region BlockWAUAsync
         public void BlockWAUAsync(IMinerData client) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.BlockWAU) {
@@ -92,7 +99,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region SwitchRadeonGpuAsync
         public void SwitchRadeonGpuAsync(IMinerData client, bool on) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.SwitchRadeonGpu) {
@@ -107,7 +114,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region RestartWindowsAsync
         public void RestartWindowsAsync(IMinerData client) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.RestartWindows) {
@@ -121,7 +128,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region ShutdownWindowsAsync
         public void ShutdownWindowsAsync(IMinerData client) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.ShutdownWindows) {
@@ -136,7 +143,7 @@ namespace NTMiner.MinerStudio.Impl {
         // ReSharper disable once InconsistentNaming
         public void UpgradeNTMinerAsync(IMinerData client, string ntminerFileName) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.UpgradeNTMiner) {
@@ -151,7 +158,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region SetAutoBootStartAsync
         public void SetAutoBootStartAsync(IMinerData client, SetAutoBootStartRequest request) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.SetAutoBootStart) {
@@ -166,7 +173,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region StartMineAsync
         public void StartMineAsync(IMinerData client, Guid workId) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             // localJson和serverJson在服务端将消息通过ws通道发送给挖矿端前根据workId填充
@@ -182,7 +189,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region StopMineAsync
         public void StopMineAsync(IMinerData client) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.StopMine) {
@@ -196,7 +203,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region GetDrivesAsync
         public void GetDrivesAsync(IMinerData client) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.GetDrives) {
@@ -210,7 +217,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region SetVirtualMemoryAsync
         public void SetVirtualMemoryAsync(IMinerData client, Dictionary<string, int> data) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.SetVirtualMemory) {
@@ -225,7 +232,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region GetLocalIpsAsync
         public void GetLocalIpsAsync(IMinerData client) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.GetLocalIps) {
@@ -239,7 +246,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region SetLocalIpsAsync
         public void SetLocalIpsAsync(IMinerData client, List<LocalIpInput> data) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.SetLocalIps) {
@@ -254,7 +261,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region GetOperationResultsAsync
         public void GetOperationResultsAsync(IMinerData client, long afterTime) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.GetOperationResults) {
@@ -269,7 +276,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region GetSelfWorkLocalJsonAsync
         public void GetSelfWorkLocalJsonAsync(IMinerData client) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.GetSelfWorkLocalJson) {
@@ -283,7 +290,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region SaveSelfWorkLocalJsonAsync
         public void SaveSelfWorkLocalJsonAsync(IMinerData client, string localJson, string serverJson) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             if (string.IsNullOrEmpty(localJson) || string.IsNullOrEmpty(serverJson)) {
@@ -307,7 +314,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region GetGpuProfilesJsonAsync
         public void GetGpuProfilesJsonAsync(IMinerData client) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.GetGpuProfilesJson) {
@@ -321,7 +328,7 @@ namespace NTMiner.MinerStudio.Impl {
         #region SaveGpuProfilesJsonAsync
         public void SaveGpuProfilesJsonAsync(IMinerData client, string json) {
             if (!MinerStudioRoot.WsClient.IsOpen) {
-                VirtualRoot.Out.ShowWarn("和服务器失去连接", autoHideSeconds: 4);
+                ShowWarn();
                 return;
             }
             MinerStudioRoot.WsClient.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.SaveGpuProfilesJson) {

+ 5 - 0
src/AppModels/MinerStudio/Messages.cs

@@ -21,6 +21,11 @@ namespace NTMiner.MinerStudio {
         public ShowGpuNamePageCommand() { }
     }
 
+    [MessageType(description: "打开WebApi Action Count页")]
+    public class ShowActionCountPageCommand : Cmd {
+        public ShowActionCountPageCommand() { }
+    }
+
     [MessageType(description: "打开密码修改界面")]
     public class ShowChangePassword : Cmd {
         public ShowChangePassword() { }

+ 19 - 3
src/AppModels/MinerStudio/MinerStudioRoot.cs

@@ -1,6 +1,7 @@
-using NTMiner.MinerStudio.Impl;
+using NTMiner.Core;
+using NTMiner.Core.Impl;
+using NTMiner.MinerStudio.Impl;
 using NTMiner.MinerStudio.Vms;
-using NTMiner.Views;
 using NTMiner.Ws;
 using System;
 
@@ -10,13 +11,28 @@ namespace NTMiner.MinerStudio {
         public static MinerClientConsoleViewModel MinerClientConsoleVm { get; private set; } = new MinerClientConsoleViewModel();
         public static MinerClientMessagesViewModel MinerClientMessagesVm { get; private set; } = new MinerClientMessagesViewModel();
         public static MinerClientOperationResultsViewModel MinerClientOperationResultsVm { get; private set; } = new MinerClientOperationResultsViewModel();
+        public static IReadOnlyNTMinerFileSet ReadOnlyNTMinerFileSet { get; private set; } = new ReadOnlyNTMinerFileSet();
+
+        public static readonly LocalMinerStudioService LocalMinerStudioService = new LocalMinerStudioService();
+        private static readonly ServerMinerStudioService _serverMinerStudioService = new ServerMinerStudioService();
+
+        public static IMinerStudioService MinerStudioService {
+            get {
+                if (RpcRoot.IsOuterNet) {
+                    return _serverMinerStudioService;
+                }
+                else {
+                    return LocalMinerStudioService;
+                }
+            }
+        }
 
         public static void Init(IWsClient wsClient) {
             WsClient = wsClient;
         }
 
         public static void Login(Action onLoginSuccess, string serverHost = null, Action btnCloseClick = null) {
-            LoginWindow.Login(onLoginSuccess: () => {
+            WpfUtil.Login(onLoginSuccess: () => {
                 NTMinerContext.MinerStudioContext.UserAppSettingSet.Init(RpcRoot.RpcUser.LoginedUser.UserAppSettings);
                 onLoginSuccess?.Invoke();
             }, serverHost, btnCloseClick);

+ 3 - 3
src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerClientConsoleViewModel.cs

@@ -34,7 +34,7 @@ namespace NTMiner.MinerStudio {
 
             public MinerClientConsoleViewModel() {
                 if (ClientAppType.IsMinerStudio) {
-                    VirtualRoot.BuildEventPath<MinerClientSelectionChangedEvent>("矿机列表页选中了和上次选中的不同的矿机时刷新矿机控制台输出", LogEnum.DevConsole, path: message => {
+                    VirtualRoot.BuildEventPath<MinerClientSelectionChangedEvent>("刷新矿机控制台输出", LogEnum.DevConsole, path: message => {
                         bool isChanged = true;
                         if (message.MinerClientVm != null && this._minerClientVm != null && this._minerClientVm.ClientId == message.MinerClientVm.ClientId) {
                             isChanged = false;
@@ -53,7 +53,7 @@ namespace NTMiner.MinerStudio {
                             SendGetConsoleOutLinesMqMessage();
                         }
                     }, this.GetType());
-                    VirtualRoot.BuildEventPath<ClientConsoleOutLinesEvent>("收到了挖矿端控制台消息", LogEnum.DevConsole, path: message => {
+                    VirtualRoot.BuildEventPath<ClientConsoleOutLinesEvent>("将收到的挖矿端控制台消息输出到输出窗口", LogEnum.DevConsole, path: message => {
                         if (this._minerClientVm == null
                             || this._minerClientVm.ClientId != message.ClientId
                             || message.Data == null
@@ -93,7 +93,7 @@ namespace NTMiner.MinerStudio {
                         afterTime = item.Timestamp;
                     }
                 }
-                MinerStudioService.Instance.GetConsoleOutLinesAsync(minerClientVm, afterTime);
+                MinerStudioService.GetConsoleOutLinesAsync(minerClientVm, afterTime);
             }
         }
     }

+ 3 - 3
src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerClientMessagesViewModel.cs

@@ -22,7 +22,7 @@ namespace NTMiner.MinerStudio {
                     return;
                 }
                 if (ClientAppType.IsMinerStudio) {
-                    VirtualRoot.BuildEventPath<MinerClientSelectionChangedEvent>("矿机列表页选中了和上次选中的不同的矿机时刷新矿机消息列表", LogEnum.DevConsole, path: message => {
+                    VirtualRoot.BuildEventPath<MinerClientSelectionChangedEvent>("刷新矿机消息列表", LogEnum.DevConsole, path: message => {
                         bool isChanged = true;
                         if (message.MinerClientVm != null && this._minerClientVm != null && this._minerClientVm.ClientId == message.MinerClientVm.ClientId) {
                             isChanged = false;
@@ -36,7 +36,7 @@ namespace NTMiner.MinerStudio {
                             SendGetLocalMessagesMqMessage();
                         }
                     }, this.GetType());
-                    VirtualRoot.BuildEventPath<ClientLocalMessagesEvent>("收到了挖矿端本地消息", LogEnum.DevConsole,
+                    VirtualRoot.BuildEventPath<ClientLocalMessagesEvent>("将收到的挖矿端本地消息展示到消息列表", LogEnum.DevConsole,
                         path: message => {
                             if (this._minerClientVm == null || this._minerClientVm.ClientId != message.ClientId) {
                                 return;
@@ -91,7 +91,7 @@ namespace NTMiner.MinerStudio {
                         afterTime = item.Timestamp;
                     }
                 }
-                MinerStudioService.Instance.GetLocalMessagesAsync(minerClientVm, afterTime);
+                MinerStudioService.GetLocalMessagesAsync(minerClientVm, afterTime);
             }
         }
     }

+ 3 - 3
src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerClientOperationResultsViewModel.cs

@@ -26,7 +26,7 @@ namespace NTMiner.MinerStudio {
                     return;
                 }
                 if (ClientAppType.IsMinerStudio) {
-                    VirtualRoot.BuildEventPath<MinerClientSelectionChangedEvent>("矿机列表页选中了和上次选中的不同的矿机时刷新矿机本地群控响应消息列表", LogEnum.DevConsole, path: message => {
+                    VirtualRoot.BuildEventPath<MinerClientSelectionChangedEvent>("刷新矿机本地群控响应消息列表", LogEnum.DevConsole, path: message => {
                         bool isChanged = true;
                         if (message.MinerClientVm != null && this._minerClientVm != null && this._minerClientVm.ClientId == message.MinerClientVm.ClientId) {
                             isChanged = false;
@@ -46,7 +46,7 @@ namespace NTMiner.MinerStudio {
                             SendGetOperationResultsMqMessage();
                         }
                     }, this.GetType());
-                    VirtualRoot.BuildEventPath<ClientOperationResultsEvent>("收到了挖矿端本地群控响应消息", LogEnum.DevConsole,
+                    VirtualRoot.BuildEventPath<ClientOperationResultsEvent>("将收到的挖矿端本地群控响应消息刷到展示层", LogEnum.DevConsole,
                         path: message => {
                             if (this._minerClientVm == null || this._minerClientVm.ClientId != message.ClientId) {
                                 return;
@@ -122,7 +122,7 @@ namespace NTMiner.MinerStudio {
                         afterTime = item.Timestamp;
                     }
                 }
-                MinerStudioService.Instance.GetOperationResultsAsync(minerClientVm, afterTime);
+                MinerStudioService.GetOperationResultsAsync(minerClientVm, afterTime);
             }
         }
     }

+ 0 - 123
src/AppModels/MinerStudio/MinerStudioService.cs

@@ -1,123 +0,0 @@
-using NTMiner.Core.MinerClient;
-using NTMiner.Core.MinerServer;
-using NTMiner.MinerStudio.Impl;
-using System;
-using System.Collections.Generic;
-
-namespace NTMiner.MinerStudio {
-    public class MinerStudioService : IMinerStudioService {
-        public static MinerStudioService Instance { get; private set; } = new MinerStudioService();
-
-        public readonly LocalMinerStudioService LocalMinerStudioService = new LocalMinerStudioService();
-        private readonly ServerMinerStudioService _serverMinerStudioService = new ServerMinerStudioService();
-
-        private MinerStudioService() { }
-
-        private IMinerStudioService Service {
-            get {
-                if (RpcRoot.IsOuterNet) {
-                    return _serverMinerStudioService;
-                }
-                else {
-                    return LocalMinerStudioService;
-                }
-            }
-        }
-
-        public void QueryClientsAsync(QueryClientsRequest query) {
-            Service.QueryClientsAsync(query);
-        }
-
-        public void UpdateClientAsync(string objectId, string propertyName, object value, Action<ResponseBase, Exception> callback) {
-            Service.UpdateClientAsync(objectId, propertyName, value, callback);
-        }
-
-        public void UpdateClientsAsync(string propertyName, Dictionary<string, object> values, Action<ResponseBase, Exception> callback) {
-            Service.UpdateClientsAsync(propertyName, values, callback);
-        }
-
-        public void RemoveClientsAsync(List<string> objectIds, Action<ResponseBase, Exception> callback) {
-            Service.RemoveClientsAsync(objectIds, callback);
-        }
-
-        public void GetConsoleOutLinesAsync(IMinerData client, long afterTime) {
-            Service.GetConsoleOutLinesAsync(client, afterTime);
-        }
-
-        public void GetLocalMessagesAsync(IMinerData client, long afterTime) {
-            Service.GetLocalMessagesAsync(client, afterTime);
-        }
-
-        public void EnableRemoteDesktopAsync(IMinerData client) {
-            Service.EnableRemoteDesktopAsync(client);
-        }
-
-        public void BlockWAUAsync(IMinerData client) {
-            Service.BlockWAUAsync(client);
-        }
-
-        public void SwitchRadeonGpuAsync(IMinerData client, bool on) {
-            Service.SwitchRadeonGpuAsync(client, on);
-        }
-
-        public void RestartWindowsAsync(IMinerData client) {
-            Service.RestartWindowsAsync(client);
-        }
-
-        public void ShutdownWindowsAsync(IMinerData client) {
-            Service.ShutdownWindowsAsync(client);
-        }
-
-        public void SetAutoBootStartAsync(IMinerData client, SetAutoBootStartRequest request) {
-            Service.SetAutoBootStartAsync(client, request);
-        }
-
-        public void StartMineAsync(IMinerData client, Guid workId) {
-            Service.StartMineAsync(client, workId);
-        }
-
-        public void StopMineAsync(IMinerData client) {
-            Service.StopMineAsync(client);
-        }
-
-        public void UpgradeNTMinerAsync(IMinerData client, string ntminerFileName) {
-            Service.UpgradeNTMinerAsync(client, ntminerFileName);
-        }
-
-        public void GetDrivesAsync(IMinerData client) {
-            Service.GetDrivesAsync(client);
-        }
-
-        public void SetVirtualMemoryAsync(IMinerData client, Dictionary<string, int> data) {
-            Service.SetVirtualMemoryAsync(client, data);
-        }
-
-        public void GetLocalIpsAsync(IMinerData client) {
-            Service.GetLocalIpsAsync(client);
-        }
-
-        public void SetLocalIpsAsync(IMinerData client, List<LocalIpInput> data) {
-            Service.SetLocalIpsAsync(client, data);
-        }
-
-        public void GetOperationResultsAsync(IMinerData client, long afterTime) {
-            Service.GetOperationResultsAsync(client, afterTime);
-        }
-
-        public void GetSelfWorkLocalJsonAsync(IMinerData client) {
-            Service.GetSelfWorkLocalJsonAsync(client);
-        }
-
-        public void SaveSelfWorkLocalJsonAsync(IMinerData client, string localJson, string serverJson) {
-            Service.SaveSelfWorkLocalJsonAsync(client, localJson, serverJson);
-        }
-
-        public void GetGpuProfilesJsonAsync(IMinerData client) {
-            Service.GetGpuProfilesJsonAsync(client);
-        }
-
-        public void SaveGpuProfilesJsonAsync(IMinerData client, string json) {
-            Service.SaveGpuProfilesJsonAsync(client, json);
-        }
-    }
-}

+ 34 - 0
src/AppModels/MinerStudio/Vms/ActionCountViewModel.cs

@@ -0,0 +1,34 @@
+using NTMiner.ServerNode;
+using NTMiner.Vms;
+
+namespace NTMiner.MinerStudio.Vms {
+    public class ActionCountViewModel : ViewModelBase, IActionCount {
+        private string _actionName;
+        private int _count;
+
+        public ActionCountViewModel(IActionCount data) {
+            _actionName = data.ActionName;
+            _count = data.Count;
+        }
+
+        public string ActionName {
+            get => _actionName;
+            set {
+                if (_actionName != value) {
+                    _actionName = value;
+                    OnPropertyChanged(nameof(ActionName));
+                }
+            }
+        }
+
+        public int Count {
+            get => _count;
+            set {
+                if (_count != value) {
+                    _count = value;
+                    OnPropertyChanged(nameof(Count));
+                }
+            }
+        }
+    }
+}

+ 105 - 0
src/AppModels/MinerStudio/Vms/ActionCountsViewModel.cs

@@ -0,0 +1,105 @@
+using NTMiner.ServerNode;
+using NTMiner.Vms;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Input;
+
+namespace NTMiner.MinerStudio.Vms {
+    public class ActionCountsViewModel : ViewModelBase {
+        private List<ActionCountViewModel> _actionCounts = new List<ActionCountViewModel>();
+        private int _pageIndex = 1;
+        private int _pageSize = 100;
+        private string _keyword;
+        private readonly PagingViewModel _pagingVm;
+
+        public ICommand ClearKeyword { get; private set; }
+
+        public ICommand PageSub { get; private set; }
+        public ICommand PageAdd { get; private set; }
+
+        public ICommand Search { get; private set; }
+
+        public ActionCountsViewModel() {
+            this._pagingVm = new PagingViewModel(() => this.PageIndex, () => this.PageSize);
+            this.Search = new DelegateCommand(() => {
+                this.PageIndex = 1;
+            });
+            this.ClearKeyword = new DelegateCommand(() => {
+                Keyword = string.Empty;
+            });
+            this.PageSub = new DelegateCommand(() => {
+                this.PageIndex -= 1;
+            });
+            this.PageAdd = new DelegateCommand(() => {
+                this.PageIndex += 1;
+            });
+            this.Query();
+        }
+
+        public void Query() {
+            RpcRoot.OfficialServer.ActionCountService.QueryActionCountsAsync(new QueryActionCountsRequest {
+                PageIndex = this.PageIndex,
+                PageSize = this.PageSize,
+                Keyword = this.Keyword
+            }, (response, e) => {
+                if (response.IsSuccess()) {
+                    this.ActionCounts = response.Data.OrderByDescending(a => a.Count).Select(a => new ActionCountViewModel(a)).ToList();
+                    _pagingVm.Init(response.Total);
+                }
+                else {
+                    this.ActionCounts = new List<ActionCountViewModel>();
+                    _pagingVm.Init(0);
+                }
+            });
+        }
+
+        public int PageIndex {
+            get => _pageIndex;
+            set {
+                // 注意PageIndex任何时候都应刷新而不是不等时才刷新
+                _pageIndex = value;
+                OnPropertyChanged(nameof(PageIndex));
+                this.Query();
+            }
+        }
+
+        public int PageSize {
+            get => _pageSize;
+            set {
+                if (_pageSize != value) {
+                    _pageSize = value;
+                    OnPropertyChanged(nameof(PageSize));
+                    this.PageIndex = 1;
+                }
+            }
+        }
+
+        public string Keyword {
+            get => _keyword;
+            set {
+                if (_keyword != value) {
+                    _keyword = value;
+                    OnPropertyChanged(nameof(Keyword));
+                    this.PageIndex = 1;
+                }
+            }
+        }
+
+        public PagingViewModel PagingVm {
+            get { return _pagingVm; }
+        }
+
+        public List<ActionCountViewModel> ActionCounts {
+            get => _actionCounts;
+            set {
+                if (_actionCounts != value) {
+                    if (value == null) {
+                        value = new List<ActionCountViewModel>();
+                    }
+                    _actionCounts = value;
+                    OnPropertyChanged(nameof(ActionCounts));
+                }
+            }
+        }
+    }
+}

+ 2 - 1
src/AppModels/MinerStudio/Vms/CalcConfigViewModel.cs

@@ -1,7 +1,8 @@
 using NTMiner.Core.MinerServer;
+using NTMiner.Vms;
 using System;
 
-namespace NTMiner.Vms {
+namespace NTMiner.MinerStudio.Vms {
     public class CalcConfigViewModel : ViewModelBase, ICalcConfig {
         private double _incomePerDay;
         private double _incomeUsdPerDay;

+ 22 - 0
src/AppModels/MinerStudio/Vms/CalcConfigViewModels.cs

@@ -10,6 +10,7 @@ namespace NTMiner.MinerStudio.Vms {
         private List<CalcConfigViewModel> _calcConfigVms = new List<CalcConfigViewModel>();
         public readonly Guid Id = Guid.NewGuid();
         public ICommand Save { get; private set; }
+        public ICommand Clear { get; private set; }
 
         public CalcConfigViewModels() {
             if (WpfUtil.IsInDesignMode) {
@@ -19,6 +20,27 @@ namespace NTMiner.MinerStudio.Vms {
                 NTMinerContext.Instance.CalcConfigSet.SaveCalcConfigs(this.CalcConfigVms.Select(a => CalcConfigData.Create(a)).ToList());
                 VirtualRoot.Execute(new CloseWindowCommand(this.Id));
             });
+            this.Clear = new DelegateCommand(() => {
+                var coins = NTMinerContext.Instance.ServerContext.CoinSet.AsEnumerable();
+                if (coins != null && coins.Any()) {
+                    List<CalcConfigViewModel> toRemoves = new List<CalcConfigViewModel>();
+                    foreach (var calConfigVm in _calcConfigVms) {
+                        if (!coins.Any(a=>a.Code == calConfigVm.CoinCode)) {
+                            toRemoves.Add(calConfigVm);
+                        }
+                    }
+                    if (toRemoves.Count != 0) {
+                        foreach (var item in toRemoves) {
+                            _calcConfigVms.Remove(item);
+                        }
+                        this.Save.Execute(null);
+                        VirtualRoot.Out.ShowSuccess("清理成功");
+                    }
+                    else {
+                        VirtualRoot.Out.ShowSuccess("没有要清理的币种");
+                    }
+                }
+            });
             Refresh();
         }
 

+ 1 - 1
src/AppModels/MinerStudio/Vms/ChangePasswordViewModel.cs

@@ -105,7 +105,7 @@ namespace NTMiner.MinerStudio.Vms {
 
         public string CaptchaUrl {
             get {
-                return $"http://{RpcRoot.OfficialServerAddress}/api/{RpcRoot.GetControllerName<ICaptchaController<string>>()}/{nameof(ICaptchaController<string>.Get)}?id={ActionCaptchaId.ToString()}";
+                return $"http://{RpcRoot.OfficialServerAddress}/api/{ControllerUtil.GetControllerName<ICaptchaController<string>>()}/{nameof(ICaptchaController<string>.Get)}?id={ActionCaptchaId.ToString()}";
             }
         }
     }

+ 1 - 1
src/AppModels/MinerStudio/Vms/GpuNameCountsViewModel.cs

@@ -10,7 +10,7 @@ namespace NTMiner.MinerStudio.Vms {
         private int _pageIndex = 1;
         private int _pageSize = 100;
         private string _keyword;
-        private PagingViewModel _pagingVm;
+        private readonly PagingViewModel _pagingVm;
 
         public ICommand ClearKeyword { get; private set; }
 

+ 1 - 1
src/AppModels/MinerStudio/Vms/GpuProfilesPageViewModel.cs

@@ -64,7 +64,7 @@ namespace NTMiner.MinerStudio.Vms {
                 }
                 string json = VirtualRoot.JsonSerializer.Serialize(jsonObj);
                 foreach (var client in minerClientsWindowVm.SelectedMinerClients) {
-                    MinerStudioService.Instance.SaveGpuProfilesJsonAsync(client, json);
+                    MinerStudioRoot.MinerStudioService.SaveGpuProfilesJsonAsync(client, json);
                 }
                 VirtualRoot.Execute(new CloseWindowCommand(this.Id));
             });

+ 1 - 1
src/AppModels/MinerStudio/Vms/LocalIpConfigViewModel.cs

@@ -24,7 +24,7 @@ namespace NTMiner.MinerStudio.Vms {
                         vm.DNSServer1Vm.SetAddress(NTKeyword.DNSServer1);
                     }
                 }
-                MinerStudioService.Instance.SetLocalIpsAsync(minerClientVm, _localIpVms.Select(a => LocalIpInput.Create(a, a.IsAutoDNSServer)).ToList());
+                MinerStudioRoot.MinerStudioService.SetLocalIpsAsync(minerClientVm, _localIpVms.Select(a => LocalIpInput.Create(a, a.IsAutoDNSServer)).ToList());
                 if (_localIpVms.Count == 1) {
                     VirtualRoot.Execute(new CloseWindowCommand(this.Id));
                 }

+ 4 - 4
src/AppModels/MinerStudio/Vms/MineWorkViewModel.cs

@@ -104,13 +104,13 @@ namespace NTMiner.MinerStudio.Vms {
                             VirtualRoot.Out.ShowError("无法操作,因为选中的矿机未开启外网群控。", autoHideSeconds: 6);
                             return;
                         }
-                        VirtualRoot.BuildOnecePath<GetSelfWorkLocalJsonResponsedEvent>("获取到响应结果后填充Vm内存", LogEnum.DevConsole, path: message => {
+                        VirtualRoot.BuildOnecePath<GetSelfWorkLocalJsonResponsedEvent>("填充Vm内存", LogEnum.DevConsole, path: message => {
                             if (message.ClientId == _minerClientVm.ClientId) {
                                 string data = message.Data;
                                 EditJson(formType, WorkType.SelfWork, data);
                             }
                         }, PathId.Empty, typeof(MineWorkViewModel));
-                        MinerStudioService.Instance.GetSelfWorkLocalJsonAsync(_minerClientVm);
+                        MinerStudioRoot.MinerStudioService.GetSelfWorkLocalJsonAsync(_minerClientVm);
                     }
                     else {
                         RpcRoot.Client.NTMinerDaemonService.GetSelfWorkLocalJsonAsync(_minerClientVm, (json, e) => {
@@ -245,7 +245,7 @@ namespace NTMiner.MinerStudio.Vms {
                     if (isMinerProfileChanged) {
                         NTMinerContext.Instance.ExportWorkJson(mineWorkData, out string localJson, out string serverJson);
                         if (!string.IsNullOrEmpty(localJson) && !string.IsNullOrEmpty(serverJson)) {
-                            MinerStudioService.Instance.SaveSelfWorkLocalJsonAsync(_minerClientVm, localJson, serverJson);
+                            MinerStudioRoot.MinerStudioService.SaveSelfWorkLocalJsonAsync(_minerClientVm, localJson, serverJson);
                         }
                         if (mineWorkData.ServerJsonSha1 != this.ServerJsonSha1) {
                             this.ServerJsonSha1 = mineWorkData.ServerJsonSha1;
@@ -287,7 +287,7 @@ namespace NTMiner.MinerStudio.Vms {
                     if (isMinerProfileChanged) {
                         NTMinerContext.Instance.ExportWorkJson(mineWorkData, out string localJson, out string serverJson);
                         if (!string.IsNullOrEmpty(localJson) && !string.IsNullOrEmpty(serverJson)) {
-                            MinerStudioService.Instance.SaveSelfWorkLocalJsonAsync(_minerClientVm, localJson, serverJson);
+                            MinerStudioRoot.MinerStudioService.SaveSelfWorkLocalJsonAsync(_minerClientVm, localJson, serverJson);
                         }
                         if (mineWorkData.ServerJsonSha1 != this.ServerJsonSha1) {
                             this.ServerJsonSha1 = mineWorkData.ServerJsonSha1;

+ 2 - 2
src/AppModels/MinerStudio/Vms/MinerClientAddViewModel.cs

@@ -41,7 +41,7 @@ namespace NTMiner.MinerStudio.Vms {
                         VirtualRoot.Out.ShowError("没有IP", autoHideSeconds: 4);
                         return;
                     }
-                    MinerStudioService.Instance.LocalMinerStudioService.AddClientsAsync(clientIps, (response, e) => {
+                    MinerStudioRoot.LocalMinerStudioService.AddClientsAsync(clientIps, (response, e) => {
                         if (!response.IsSuccess()) {
                             VirtualRoot.Out.ShowError(response.ReadMessage(e));
                         }
@@ -52,7 +52,7 @@ namespace NTMiner.MinerStudio.Vms {
                     });
                 }
                 else {
-                    MinerStudioService.Instance.LocalMinerStudioService.AddClientsAsync(new List<string> { this.LeftIp }, (response, e) => {
+                    MinerStudioRoot.LocalMinerStudioService.AddClientsAsync(new List<string> { this.LeftIp }, (response, e) => {
                         if (!response.IsSuccess()) {
                             VirtualRoot.Out.ShowError(response.ReadMessage(e));
                         }

+ 1 - 1
src/AppModels/MinerStudio/Vms/MinerClientSettingViewModel.cs

@@ -26,7 +26,7 @@ namespace NTMiner.MinerStudio.Vms {
             this.Save = new DelegateCommand(() => {
                 if (minerClients != null && minerClients.Length != 0) {
                     foreach (var item in minerClients) {
-                        MinerStudioService.Instance.SetAutoBootStartAsync(item, new SetAutoBootStartRequest {
+                        MinerStudioRoot.MinerStudioService.SetAutoBootStartAsync(item, new SetAutoBootStartRequest {
                             AutoStart = this.IsAutoStart,
                             AutoBoot = this.IsAutoBoot
                         });

+ 100 - 20
src/AppModels/MinerStudio/Vms/MinerClientViewModel.cs

@@ -55,7 +55,7 @@ namespace NTMiner.MinerStudio.Vms {
             this.Remove = new DelegateCommand(() => {
                 #region
                 this.ShowSoftDialog(new DialogWindowViewModel(message: $"确定删除该矿机吗?", title: "确认", onYes: () => {
-                    MinerStudioService.Instance.RemoveClientsAsync(new List<string> { this.Id }, (response, e) => {
+                    MinerStudioRoot.MinerStudioService.RemoveClientsAsync(new List<string> { this.Id }, (response, e) => {
                         if (!response.IsSuccess()) {
                             VirtualRoot.Out.ShowError("删除矿机失败:" + response.ReadMessage(e), autoHideSeconds: 4, toConsole: true);
                         }
@@ -98,22 +98,22 @@ namespace NTMiner.MinerStudio.Vms {
             });
             this.RestartWindows = new DelegateCommand(() => {
                 this.ShowSoftDialog(new DialogWindowViewModel(message: $"您确定重启{this.GetMinerText()}电脑吗?", title: "确认", onYes: () => {
-                    MinerStudioService.Instance.RestartWindowsAsync(this);
+                    MinerStudioRoot.MinerStudioService.RestartWindowsAsync(this);
                 }));
             });
             this.ShutdownWindows = new DelegateCommand(() => {
                 this.ShowSoftDialog(new DialogWindowViewModel(message: $"确定关闭{this.GetMinerText()}电脑吗?", title: "确认", onYes: () => {
-                    MinerStudioService.Instance.ShutdownWindowsAsync(this);
+                    MinerStudioRoot.MinerStudioService.ShutdownWindowsAsync(this);
                 }));
             });
             this.StartMine = new DelegateCommand(() => {
                 this.ShowSoftDialog(new DialogWindowViewModel(message: $"{this.GetMinerText()}:确定开始挖矿吗?", title: "确认", onYes: () => {
-                    MinerStudioService.Instance.StartMineAsync(this, WorkId);
+                    MinerStudioRoot.MinerStudioService.StartMineAsync(this, WorkId);
                 }));
             });
             this.StopMine = new DelegateCommand(() => {
                 this.ShowSoftDialog(new DialogWindowViewModel(message: $"{this.GetMinerText()}:确定停止挖矿吗?", title: "确认", onYes: () => {
-                    MinerStudioService.Instance.StopMineAsync(this);
+                    MinerStudioRoot.MinerStudioService.StopMineAsync(this);
                 }));
             });
         }
@@ -191,16 +191,6 @@ namespace NTMiner.MinerStudio.Vms {
             }
         }
 
-        public string CpuId {
-            get { return _data.CpuId; }
-            set {
-                if (_data.CpuId != value) {
-                    _data.CpuId = value;
-                    OnPropertyChanged(nameof(CpuId));
-                }
-            }
-        }
-
         public string LocalIp {
             get { return _data.LocalIp; }
             set {
@@ -294,7 +284,7 @@ namespace NTMiner.MinerStudio.Vms {
                     var old = _selectedMineWork;
                     this.WorkId = value.Id;
                     _selectedMineWork = value;
-                    MinerStudioService.Instance.UpdateClientAsync(this.Id, nameof(WorkId), value.Id, (response, exception) => {
+                    MinerStudioRoot.MinerStudioService.UpdateClientAsync(this.Id, nameof(WorkId), value.Id, (response, exception) => {
                         if (!response.IsSuccess()) {
                             _selectedMineWork = old;
                             this.WorkId = old.Id;
@@ -496,7 +486,7 @@ namespace NTMiner.MinerStudio.Vms {
                 if (_data.WorkerName != value) {
                     var old = _data.WorkerName;
                     _data.WorkerName = value;
-                    MinerStudioService.Instance.UpdateClientAsync(this.Id, nameof(WorkerName), value, (response, e) => {
+                    MinerStudioRoot.MinerStudioService.UpdateClientAsync(this.Id, nameof(WorkerName), value, (response, e) => {
                         if (!response.IsSuccess()) {
                             _data.WorkerName = old;
                             VirtualRoot.Out.ShowError($"设置群控名失败:{this.WorkerName} {this.MinerIp} {response.ReadMessage(e)}", toConsole: true);
@@ -564,7 +554,7 @@ namespace NTMiner.MinerStudio.Vms {
                     var old = _selectedMinerGroup;
                     _selectedMinerGroup = value;
                     this.GroupId = value.Id;
-                    MinerStudioService.Instance.UpdateClientAsync(this.Id, nameof(GroupId), value.Id, (response, exception) => {
+                    MinerStudioRoot.MinerStudioService.UpdateClientAsync(this.Id, nameof(GroupId), value.Id, (response, exception) => {
                         if (!response.IsSuccess()) {
                             _selectedMinerGroup = old;
                             this.GroupId = old.Id;
@@ -593,7 +583,7 @@ namespace NTMiner.MinerStudio.Vms {
                 if (_data.WindowsLoginName != value) {
                     var old = _data.WindowsLoginName;
                     _data.WindowsLoginName = value;
-                    MinerStudioService.Instance.UpdateClientAsync(this.Id, nameof(WindowsLoginName), value, (response, exception) => {
+                    MinerStudioRoot.MinerStudioService.UpdateClientAsync(this.Id, nameof(WindowsLoginName), value, (response, exception) => {
                         if (!response.IsSuccess()) {
                             _data.WindowsLoginName = old;
                             VirtualRoot.Out.ShowError($"设置Windows远程登录用户名失败:{this.MinerName} {this.MinerIp} {response.ReadMessage(exception)}", toConsole: true);
@@ -620,7 +610,7 @@ namespace NTMiner.MinerStudio.Vms {
                 if (_data.WindowsPassword != value) {
                     var old = _data.WindowsPassword;
                     _data.WindowsPassword = value;
-                    MinerStudioService.Instance.UpdateClientAsync(this.Id, nameof(WindowsPassword), value, (response, exception) => {
+                    MinerStudioRoot.MinerStudioService.UpdateClientAsync(this.Id, nameof(WindowsPassword), value, (response, exception) => {
                         if (!response.IsSuccess()) {
                             _data.WindowsPassword = old;
                             VirtualRoot.Out.ShowError($"设置Widnows远程登录密码失败:{this.MinerName} {this.MinerIp} {response.ReadMessage(exception)}", toConsole: true);
@@ -1587,6 +1577,16 @@ namespace NTMiner.MinerStudio.Vms {
             }
         }
 
+        public bool Is1080PillEnabled {
+            get { return _data.Is1080PillEnabled; }
+            set {
+                if (_data.Is1080PillEnabled != value) {
+                    _data.Is1080PillEnabled = value;
+                    OnPropertyChanged(nameof(Is1080PillEnabled));
+                }
+            }
+        }
+
         public bool IsDisableAntiSpyware {
             get { return _data.IsDisableAntiSpyware; }
             set {
@@ -1597,6 +1597,16 @@ namespace NTMiner.MinerStudio.Vms {
             }
         }
 
+        public bool IsAutoReboot {
+            get { return _data.IsAutoReboot; }
+            set {
+                if (_data.IsAutoReboot != value) {
+                    _data.IsAutoReboot = value;
+                    OnPropertyChanged(nameof(IsAutoReboot));
+                }
+            }
+        }
+
         public DateTime MainCoinSpeedOn {
             get { return _data.MainCoinSpeedOn; }
             set {
@@ -1617,6 +1627,76 @@ namespace NTMiner.MinerStudio.Vms {
             }
         }
 
+        public bool IsPreventDisplaySleep {
+            get { return _data.IsPreventDisplaySleep; }
+            set {
+                if (_data.IsPreventDisplaySleep != value) {
+                    _data.IsPreventDisplaySleep = value;
+                    OnPropertyChanged(nameof(IsPreventDisplaySleep));
+                }
+            }
+        }
+
+        public bool IsLowSpeedRestartComputer {
+            get { return _data.IsLowSpeedRestartComputer; }
+            set {
+                if (_data.IsLowSpeedRestartComputer != value) {
+                    _data.IsLowSpeedRestartComputer = value;
+                    OnPropertyChanged(nameof(IsLowSpeedRestartComputer));
+                }
+            }
+        }
+
+        public int LowSpeedRestartComputerMinutes {
+            get { return _data.LowSpeedRestartComputerMinutes; }
+            set {
+                if (_data.LowSpeedRestartComputerMinutes != value) {
+                    _data.LowSpeedRestartComputerMinutes = value;
+                    OnPropertyChanged(nameof(LowSpeedRestartComputerMinutes));
+                }
+            }
+        }
+
+        public double LowSpeed {
+            get { return _data.LowSpeed; }
+            set {
+                if (_data.LowSpeed != value) {
+                    _data.LowSpeed = value;
+                    OnPropertyChanged(nameof(LowSpeed));
+                }
+            }
+        }
+
+        public bool IsLowSpeedReOverClock {
+            get { return _data.IsLowSpeedReOverClock; }
+            set {
+                if (_data.IsLowSpeedReOverClock != value) {
+                    _data.IsLowSpeedReOverClock = value;
+                    OnPropertyChanged(nameof(IsLowSpeedReOverClock));
+                }
+            }
+        }
+
+        public int LowSpeedReOverClockMinutes {
+            get { return _data.LowSpeedReOverClockMinutes; }
+            set {
+                if (_data.LowSpeedReOverClockMinutes != value) {
+                    _data.LowSpeedReOverClockMinutes = value;
+                    OnPropertyChanged(nameof(LowSpeedReOverClockMinutes));
+                }
+            }
+        }
+
+        public double OverClockLowSpeed {
+            get { return _data.OverClockLowSpeed; }
+            set {
+                if (_data.OverClockLowSpeed != value) {
+                    _data.OverClockLowSpeed = value;
+                    OnPropertyChanged(nameof(OverClockLowSpeed));
+                }
+            }
+        }
+
         public void RefreshGpusForeground(uint minTemp, uint maxTemp) {
             if (GpuTableVm == null) {
                 return;

+ 37 - 18
src/AppModels/MinerStudio/Vms/MinerClientsWindowViewModel.cs

@@ -183,7 +183,7 @@ namespace NTMiner.MinerStudio.Vms {
                     wallet = this.Wallet;
                 }
             }
-            MinerStudioService.Instance.QueryClientsAsync(new QueryClientsRequest {
+            MinerStudioRoot.MinerStudioService.QueryClientsAsync(new QueryClientsRequest {
                 PageIndex = this.PageIndex,
                 PageSize = this.PageSize,
                 WorkId = workId,
@@ -204,7 +204,7 @@ namespace NTMiner.MinerStudio.Vms {
             });
             2.SecondsDelay().ContinueWith(t => {
                 if (this.CountDown == 0) {
-                    this.CountDown = 10;
+                    this.ResetCountDown();
                     this.IsLoading = false;
                 }
             });
@@ -212,7 +212,7 @@ namespace NTMiner.MinerStudio.Vms {
 
         private void AddEventPath() {
             VirtualRoot.BuildEventPath<QueryClientsResponseEvent>("收到QueryClientsResponse响应后刷新界面", LogEnum.DevConsole, path: message => {
-                this.CountDown = 10;
+                this.ResetCountDown();
                 this.IsLoading = false;
                 var response = message.Response;
                 if (response.IsSuccess()) {
@@ -436,8 +436,8 @@ namespace NTMiner.MinerStudio.Vms {
                         suffix: "01",
                         namesByObjectId: this.SelectedMinerClients.Select(a => new Tuple<string, string>(a.Id, string.Empty)).ToList(),
                         onOk: () => {
-                            this.CountDown = 10;
-                            MinerStudioService.Instance.UpdateClientsAsync(nameof(MinerClientViewModel.WorkerName), vm.NamesByObjectId.ToDictionary(a => a.Item1, a => (object)a.Item2), callback: (response, e) => {
+                            this.ResetCountDown();
+                            MinerStudioRoot.MinerStudioService.UpdateClientsAsync(nameof(MinerClientViewModel.WorkerName), vm.NamesByObjectId.ToDictionary(a => a.Item1, a => (object)a.Item2), callback: (response, e) => {
                                 if (response.IsSuccess()) {
                                     foreach (var kv in vm.NamesByObjectId) {
                                         var item = this.SelectedMinerClients.FirstOrDefault(a => a.Id == kv.Item1);
@@ -478,8 +478,8 @@ namespace NTMiner.MinerStudio.Vms {
                 }
                 else {
                     this.ShowSoftDialog(new DialogWindowViewModel(message: $"确定删除选中的矿机吗?", title: "确认", onYes: () => {
-                        this.CountDown = 10;
-                        MinerStudioService.Instance.RemoveClientsAsync(SelectedMinerClients.Select(a => a.Id).ToList(), (response, e) => {
+                        this.ResetCountDown();
+                        MinerStudioRoot.MinerStudioService.RemoveClientsAsync(SelectedMinerClients.Select(a => a.Id).ToList(), (response, e) => {
                             if (!response.IsSuccess()) {
                                 VirtualRoot.Out.ShowError("删除矿机失败:" + response.ReadMessage(e), autoHideSeconds: 4, toConsole: true);
                             }
@@ -499,7 +499,7 @@ namespace NTMiner.MinerStudio.Vms {
                 else {
                     this.ShowSoftDialog(new DialogWindowViewModel(message: $"确定重启选中的电脑吗?", title: "确认", onYes: () => {
                         foreach (var item in SelectedMinerClients) {
-                            MinerStudioService.Instance.RestartWindowsAsync(item);
+                            MinerStudioRoot.MinerStudioService.RestartWindowsAsync(item);
                         }
                     }));
                 }
@@ -513,7 +513,7 @@ namespace NTMiner.MinerStudio.Vms {
                 else {
                     this.ShowSoftDialog(new DialogWindowViewModel(message: $"确定关闭选中的电脑吗?", title: "确认", onYes: () => {
                         foreach (var item in SelectedMinerClients) {
-                            MinerStudioService.Instance.ShutdownWindowsAsync(item);
+                            MinerStudioRoot.MinerStudioService.ShutdownWindowsAsync(item);
                         }
                     }));
                 }
@@ -528,7 +528,7 @@ namespace NTMiner.MinerStudio.Vms {
                     this.ShowSoftDialog(new DialogWindowViewModel(message: $"确定将选中的矿机开始挖矿吗?", title: "确认", onYes: () => {
                         foreach (var item in SelectedMinerClients) {
                             // 不能直接调用item的StopMine命令,因为该命令内部会有弹窗确认
-                            MinerStudioService.Instance.StartMineAsync(item, item.WorkId);
+                            MinerStudioRoot.MinerStudioService.StartMineAsync(item, item.WorkId);
                         }
                     }));
                 }
@@ -543,7 +543,7 @@ namespace NTMiner.MinerStudio.Vms {
                     this.ShowSoftDialog(new DialogWindowViewModel(message: $"确定将选中的矿机停止挖矿吗?", title: "确认", onYes: () => {
                         foreach (var item in SelectedMinerClients) {
                             // 不能直接调用item的StopMine命令,因为该命令内部会有弹窗确认
-                            MinerStudioService.Instance.StopMineAsync(item);
+                            MinerStudioRoot.MinerStudioService.StopMineAsync(item);
                         }
                     }));
                 }
@@ -560,7 +560,7 @@ namespace NTMiner.MinerStudio.Vms {
                 else {
                     this.ShowSoftDialog(new DialogWindowViewModel(message: $"确定启用选中的矿机的Windows远程桌面功能吗?", title: "确认", onYes: () => {
                         foreach (var item in SelectedMinerClients) {
-                            MinerStudioService.Instance.EnableRemoteDesktopAsync(item);
+                            MinerStudioRoot.MinerStudioService.EnableRemoteDesktopAsync(item);
                         }
                     }));
                 }
@@ -599,7 +599,7 @@ namespace NTMiner.MinerStudio.Vms {
                 else {
                     this.ShowSoftDialog(new DialogWindowViewModel(message: $"确定禁用选中的矿机的Windows自动更新功能吗?", title: "确认", onYes: () => {
                         foreach (var item in SelectedMinerClients) {
-                            MinerStudioService.Instance.BlockWAUAsync(item);
+                            MinerStudioRoot.MinerStudioService.BlockWAUAsync(item);
                         }
                     }));
                 }
@@ -633,7 +633,7 @@ namespace NTMiner.MinerStudio.Vms {
                                 ["Auto"] = virtualMemoryMb
                             };
                             foreach (var item in this.SelectedMinerClients) {
-                                MinerStudioService.Instance.SetVirtualMemoryAsync(item, data);
+                                MinerStudioRoot.MinerStudioService.SetVirtualMemoryAsync(item, data);
                             }
                         }
                     });
@@ -657,11 +657,11 @@ namespace NTMiner.MinerStudio.Vms {
                     btnNoToolTip: "注意:关闭计算模式挖矿算力会减半",
                     message: $"过程大概需要花费5到10秒钟,最好矿机没有处在挖矿中否则内核会重启。", title: "A卡计算模式", onYes: () => {
                         foreach (var item in SelectedMinerClients) {
-                            MinerStudioService.Instance.SwitchRadeonGpuAsync(item, on: true);
+                            MinerStudioRoot.MinerStudioService.SwitchRadeonGpuAsync(item, on: true);
                         }
                     }, onNo: () => {
                         foreach (var item in SelectedMinerClients) {
-                            MinerStudioService.Instance.SwitchRadeonGpuAsync(item, on: false);
+                            MinerStudioRoot.MinerStudioService.SwitchRadeonGpuAsync(item, on: false);
                         }
                         return true;
                     }, btnYesText: "开启计算模式", btnNoText: "关闭计算模式");
@@ -837,7 +837,18 @@ namespace NTMiner.MinerStudio.Vms {
             VirtualRoot.BuildEventPath<MinerStudioServiceSwitchedEvent>("切换了群控后台客户端服务类型后刷新矿机列表", LogEnum.DevConsole, path: message => {
                 this.OnPropertyChanged(nameof(NetTypeToolTip));
                 this.OnPropertyChanged(nameof(NetTypeText));
-                this.QueryMinerClients();
+                if (message.ServiceType == MinerStudioServiceType.Out) {
+                    if (!MinerStudioRoot.WsClient.IsOpen) {
+                        // 等它1秒
+                        1.SecondsDelay().ContinueWith(t => this.QueryMinerClients());
+                    }
+                    else {
+                        this.QueryMinerClients();
+                    }
+                }
+                else {
+                    this.QueryMinerClients();
+                }
             }, this.GetType());
             VirtualRoot.BuildCmdPath<UpdateMinerClientVmCommand>(path: message => {
                 var vm = _minerClients.FirstOrDefault(a => a.Id == message.ClientData.Id);
@@ -1193,12 +1204,20 @@ namespace NTMiner.MinerStudio.Vms {
 
         public int CountDown {
             get { return _countDown; }
-            set {
+            private set {
                 _countDown = value;
                 OnPropertyChanged(nameof(CountDown));
             }
         }
 
+        public void DownCountDown() {
+            this.CountDown -= 1;
+        }
+
+        public void ResetCountDown() {
+            this.CountDown = 10;
+        }
+
         private static readonly List<int> _pageSizeItems = new List<int>() { 10, 20, 30, 40 };
         public List<int> PageSizeItems {
             get {

+ 10 - 1
src/AppModels/MinerStudio/Vms/MinerGroupViewModel.cs

@@ -65,7 +65,16 @@ namespace NTMiner.MinerStudio.Vms {
                     return;
                 }
                 this.ShowSoftDialog(new DialogWindowViewModel(message: $"您确定删除 “{this.Name}” 矿机分组吗?", title: "确认", onYes: () => {
-                    VirtualRoot.Execute(new RemoveMinerGroupCommand(this.Id));
+                    if (RpcRoot.IsOuterNet) {
+                        RpcRoot.OfficialServer.UserMinerGroupService.RemoveMinerGroupAsync(this.Id, (response, e) => {
+                            if (response.IsSuccess()) {
+                                VirtualRoot.RaiseEvent(new MinerGroupRemovedEvent(PathId.Empty, this));
+                            }
+                        });
+                    }
+                    else {
+                        VirtualRoot.Execute(new RemoveMinerGroupCommand(this.Id));
+                    }
                 }));
             });
         }

+ 6 - 3
src/AppModels/MinerStudio/Vms/NTMinerFileSelectViewModel.cs

@@ -29,9 +29,12 @@ namespace NTMiner.MinerStudio.Vms {
             for (int i = 0; i < 7; i++) {
                 _ntminerFileVms.Add(NTMinerFileViewModel.Empty);
             }
-            RpcRoot.OfficialServer.FileUrlService.GetNTMinerFilesAsync(NTMinerAppType.MinerClient, (ntminerFiles) => {
-                NTMinerFileVms = (ntminerFiles ?? new List<NTMinerFileData>()).OrderByDescending(a => a.GetVersion()).Select(a => new NTMinerFileViewModel(a)).ToList();
-            });
+            VirtualRoot.BuildEventPath<NTMinerFileSetInitedEvent>("开源矿工程序版本文件集初始化后刷新Vm内存", LogEnum.DevConsole, path: message => {
+                var ntminerFiles = MinerStudioRoot.ReadOnlyNTMinerFileSet.AsEnumerable().Where(a => a.AppType == NTMinerAppType.MinerClient);
+                NTMinerFileVms = ntminerFiles.OrderByDescending(a => a.GetVersion()).Select(a => new NTMinerFileViewModel(a)).ToList();
+            }, this.GetType());
+            // 触发从远程加载数据的逻辑
+            VirtualRoot.Execute(new RefreshNTMinerFileSetCommand());
         }
 
         public NTMinerFileViewModel SelectedResult {

+ 10 - 0
src/AppModels/MinerStudio/Vms/OverClockDataViewModel.cs

@@ -20,6 +20,7 @@ namespace NTMiner.MinerStudio.Vms {
         private bool _isAutoFanSpeed;
         private int _coreVoltage;
         private int _memoryVoltage;
+        private int _currentMemoryTimingLevel;
 
         public ICommand Remove { get; private set; }
         public ICommand Edit { get; private set; }
@@ -73,6 +74,7 @@ namespace NTMiner.MinerStudio.Vms {
             _cool = data.Cool;
             _coreVoltage = data.CoreVoltage;
             _memoryVoltage = data.MemoryVoltage;
+            _currentMemoryTimingLevel = data.CurrentMemoryTimingLevel;
         }
 
         public Guid GetId() {
@@ -211,6 +213,14 @@ namespace NTMiner.MinerStudio.Vms {
             }
         }
 
+        public int CurrentMemoryTimingLevel {
+            get => _currentMemoryTimingLevel;
+            set {
+                _currentMemoryTimingLevel = value;
+                OnPropertyChanged(nameof(CurrentMemoryTimingLevel));
+            }
+        }
+
         private CoinViewModel _coinVm;
         public CoinViewModel CoinVm {
             get {

+ 1 - 1
src/AppModels/MinerStudio/Vms/VirtualMemoryViewModel.cs

@@ -21,7 +21,7 @@ namespace NTMiner.MinerStudio.Vms {
         public VirtualMemoryViewModel(MinerClientViewModel minerClientVm) {
             this.MinerClientVm = minerClientVm;
             this.Apply = new DelegateCommand(() => {
-                MinerStudioService.Instance.SetVirtualMemoryAsync(minerClientVm, _drives.ToDictionary(a => a.Name, a => a.VirtualMemoryMaxSizeMb));
+                MinerStudioRoot.MinerStudioService.SetVirtualMemoryAsync(minerClientVm, _drives.ToDictionary(a => a.Name, a => a.VirtualMemoryMaxSizeMb));
                 OnPropertyChanged(nameof(TotalVirtualMemoryMb));
                 OnPropertyChanged(nameof(IsStateChanged));
             });

+ 28 - 0
src/AppModels/MinerStudio/Vms/WebApiServerStateViewModel.cs

@@ -15,6 +15,8 @@ namespace NTMiner.MinerStudio.Vms {
         private double _processMemoryMb;
         private long _threadCount;
         private long _handleCount;
+        private string _availableFreeSpaceInfo;
+        private int _captchaCount;
         private CpuData _cpu;
         private CpuDataViewModel _cpuVm;
         private List<WsServerNodeState> _wsServerNodes;
@@ -30,6 +32,8 @@ namespace NTMiner.MinerStudio.Vms {
             _processMemoryMb = data.ProcessMemoryMb;
             _threadCount = data.ThreadCount;
             _handleCount = data.HandleCount;
+            _availableFreeSpaceInfo = data.AvailableFreeSpaceInfo;
+            _captchaCount = data.CaptchaCount;
             _cpu = data.Cpu;
             _cpuVm = new CpuDataViewModel(data.Cpu);
             _wsServerNodes = data.WsServerNodes;
@@ -46,6 +50,8 @@ namespace NTMiner.MinerStudio.Vms {
             this.ProcessMemoryMb = data.ProcessMemoryMb;
             this.ThreadCount = data.ThreadCount;
             this.HandleCount = data.HandleCount;
+            this.AvailableFreeSpaceInfo = data.AvailableFreeSpaceInfo;
+            this.CaptchaCount = data.CaptchaCount;
             this.Cpu = data.Cpu;
             this.WsServerNodes = data.WsServerNodes;
         }
@@ -243,5 +249,27 @@ namespace NTMiner.MinerStudio.Vms {
                 }
             }
         }
+
+        public string AvailableFreeSpaceInfo {
+            get {
+                return _availableFreeSpaceInfo;
+            }
+            set {
+                if (_availableFreeSpaceInfo != value) {
+                    _availableFreeSpaceInfo = value;
+                    OnPropertyChanged(nameof(AvailableFreeSpaceInfo));
+                }
+            }
+        }
+
+        public int CaptchaCount {
+            get { return _captchaCount; }
+            set {
+                if (_captchaCount != value) {
+                    _captchaCount = value;
+                    OnPropertyChanged(nameof(CaptchaCount));
+                }
+            }
+        }
     }
 }

+ 8 - 2
src/AppModels/MinerStudio/Vms/WsServerNodePageViewModel.cs

@@ -1,18 +1,24 @@
 using NTMiner.Vms;
 using System.Windows;
+using System.Windows.Input;
 
 namespace NTMiner.MinerStudio.Vms {
     public class WsServerNodePageViewModel : ViewModelBase {
         private WebApiServerStateViewModel _webApiServerStateVm;
 
+        public ICommand Refresh { get; private set; }
+
         public WsServerNodePageViewModel() {
             if (WpfUtil.IsInDesignMode) {
                 return;
             }
-            Refresh();
+            this.Refresh = new DelegateCommand(() => {
+                this.DoRefresh();
+            });
+            DoRefresh();
         }
 
-        public void Refresh() {
+        public void DoRefresh() {
             RpcRoot.OfficialServer.WebApiServerNodeService.GetServerStateAsync((response, e) => {
                 if (response.IsSuccess()) {
                     UIThread.Execute(() => {

+ 15 - 0
src/AppModels/MinerStudio/Vms/WsServerNodeStateViewModel.cs

@@ -17,6 +17,7 @@ namespace NTMiner.MinerStudio.Vms {
         private double _processMemoryMb;
         private long _threadCount;
         private long _handleCount;
+        private string _availableFreeSpaceInfo;
         private CpuData _cpu;
         private CpuDataViewModel _cpuVm;
 
@@ -41,6 +42,7 @@ namespace NTMiner.MinerStudio.Vms {
             _processMemoryMb = data.ProcessMemoryMb;
             _threadCount = data.ThreadCount;
             _handleCount = data.HandleCount;
+            _availableFreeSpaceInfo = data.AvailableFreeSpaceInfo;
             _cpu = data.Cpu;
             _cpuVm = new CpuDataViewModel(data.Cpu);
         }
@@ -58,6 +60,7 @@ namespace NTMiner.MinerStudio.Vms {
             this.ProcessMemoryMb = data.ProcessMemoryMb;
             this.ThreadCount = data.ThreadCount;
             this.HandleCount = data.HandleCount;
+            this.AvailableFreeSpaceInfo = data.AvailableFreeSpaceInfo;
         }
 
         public string Address {
@@ -229,5 +232,17 @@ namespace NTMiner.MinerStudio.Vms {
                 }
             }
         }
+
+        public string AvailableFreeSpaceInfo {
+            get {
+                return _availableFreeSpaceInfo;
+            }
+            set {
+                if (_availableFreeSpaceInfo != value) {
+                    _availableFreeSpaceInfo = value;
+                    OnPropertyChanged(nameof(AvailableFreeSpaceInfo));
+                }
+            }
+        }
     }
 }

+ 2 - 2
src/AppModels/View/AbstractAppViewFactory.cs

@@ -47,9 +47,9 @@ namespace NTMiner.View {
         public abstract void BuildPaths();
         public abstract Window CreateMainWindow();
 
-        public void ShowMainWindow(Application app, NTMinerAppType appType) {
+        public void ShowMainWindow(Application app) {
             try {
-                switch (appType) {
+                switch (ClientAppType.AppType) {
                     case NTMinerAppType.MinerClient:
                         RpcRoot.Client.MinerClientService.ShowMainWindowAsync((isSuccess, exception) => {
                             if (!isSuccess) {

+ 1 - 1
src/AppModels/View/IAppViewFactory.cs

@@ -16,7 +16,7 @@ namespace NTMiner.View {
         /// </summary>
         /// <param name="app"></param>
         /// <param name="appType"></param>
-        void ShowMainWindow(Application app, NTMinerAppType appType);
+        void ShowMainWindow(Application app);
 
         /// <summary>
         /// 创建一些与界面有关的路径。此类路径主要就是“打开某个页面”这种路径。

+ 30 - 0
src/AppModels/Vms/CoinProfileViewModel.cs

@@ -343,6 +343,36 @@ namespace NTMiner.Vms {
             }
         }
 
+        public bool IsLowSpeedReOverClock {
+            get => _inner.IsLowSpeedReOverClock;
+            set {
+                if (_inner.IsLowSpeedReOverClock != value) {
+                    NTMinerContext.Instance.MinerProfile.SetCoinProfileProperty(this.CoinId, nameof(IsLowSpeedReOverClock), value);
+                    OnPropertyChanged(nameof(IsLowSpeedReOverClock));
+                }
+            }
+        }
+
+        public int LowSpeedReOverClockMinutes {
+            get => _inner.LowSpeedReOverClockMinutes;
+            set {
+                if (_inner.LowSpeedReOverClockMinutes != value) {
+                    NTMinerContext.Instance.MinerProfile.SetCoinProfileProperty(this.CoinId, nameof(LowSpeedReOverClockMinutes), value);
+                    OnPropertyChanged(nameof(LowSpeedReOverClockMinutes));
+                }
+            }
+        }
+
+        public double OverClockLowSpeed {
+            get => _inner.OverClockLowSpeed;
+            set {
+                if (_inner.OverClockLowSpeed != value) {
+                    NTMinerContext.Instance.MinerProfile.SetCoinProfileProperty(this.CoinId, nameof(OverClockLowSpeed), value);
+                    OnPropertyChanged(nameof(OverClockLowSpeed));
+                }
+            }
+        }
+
         public PoolViewModel DualCoinPool {
             get {
                 if (!AppRoot.CoinVms.TryGetCoinVm(CoinId, out CoinViewModel coinVm)) {

+ 15 - 0
src/AppModels/Vms/GpuProfileViewModel.cs

@@ -15,6 +15,7 @@ namespace NTMiner.Vms {
         private bool _isAutoFanSpeed;
         private int _coreVoltage;
         private int _memoryVoltage;
+        private int _currentMemoryTimingLevel;
 
         public GpuProfileViewModel() {
         }
@@ -31,6 +32,7 @@ namespace NTMiner.Vms {
             _gpuVm = gpuVm;
             _coreVoltage = data.CoreVoltage;
             _memoryVoltage = data.MemoryVoltage;
+            _currentMemoryTimingLevel = data.CurrentMemoryTimingLevel;
         }
 
         public void Update(IGpuProfile data) {
@@ -52,6 +54,7 @@ namespace NTMiner.Vms {
             this._cool = data.Cool;
             this._coreVoltage = data.CoreVoltage;
             this._memoryVoltage = data.MemoryVoltage;
+            this._currentMemoryTimingLevel = data.CurrentMemoryTimingLevel;
 
             OnPropertyChanged(nameof(CoreClockDelta));
             OnPropertyChanged(nameof(MemoryClockDelta));
@@ -60,6 +63,7 @@ namespace NTMiner.Vms {
             OnPropertyChanged(nameof(Cool));
             OnPropertyChanged(nameof(CoreVoltage));
             OnPropertyChanged(nameof(MemoryVoltage));
+            OnPropertyChanged(nameof(CurrentMemoryTimingLevel));
         }
 
         public string GetId() {
@@ -189,6 +193,17 @@ namespace NTMiner.Vms {
             }
         }
 
+        public int CurrentMemoryTimingLevel {
+            get => _currentMemoryTimingLevel;
+            set {
+                if (_currentMemoryTimingLevel != value) {
+                    _currentMemoryTimingLevel = value;
+                    OnPropertyChanged(nameof(CurrentMemoryTimingLevel));
+                    Save();
+                }
+            }
+        }
+
         public GpuViewModel GpuVm {
             get {
                 if (_gpuVm == null) {

+ 130 - 2
src/AppModels/Vms/GpuViewModel.cs

@@ -1,6 +1,9 @@
-using NTMiner.Gpus;
+using NTMiner.Core;
+using NTMiner.Gpus;
 using System;
+using System.Collections.Generic;
 using System.Linq;
+using System.Windows;
 using System.Windows.Media;
 
 namespace NTMiner.Vms {
@@ -10,6 +13,7 @@ namespace NTMiner.Vms {
         private string _busId;
         private string _name;
         private int _temperature;
+        private int _memTemperature;
         private uint _fanSpeed;
         private uint _powerUsage;
         private int _coreClockDelta;
@@ -35,6 +39,8 @@ namespace NTMiner.Vms {
         private int _voltMin;
         private int _voltMax;
         private int _voltDefault;
+        private int[] _memoryTimingLevels = new int[0];
+        private int _currentMemoryTimingLevel;
 
         public GpuViewModel(IGpu data) {
             _gpuType = data.GpuType;
@@ -43,6 +49,7 @@ namespace NTMiner.Vms {
             _name = data.Name;
             _totalMemory = data.TotalMemory;
             _temperature = data.Temperature;
+            _memTemperature = data.MemTemperature;
             _fanSpeed = data.FanSpeed;
             _powerUsage = data.PowerUsage;
             _coreClockDelta = data.CoreClockDelta;
@@ -67,6 +74,8 @@ namespace NTMiner.Vms {
             _voltMin = data.VoltMin;
             _voltMax = data.VoltMax;
             _voltDefault = data.VoltDefault;
+            _memoryTimingLevels = data.MemoryTimingLevels;
+            _currentMemoryTimingLevel = data.CurrentMemoryTimingLevel;
         }
 
         private readonly bool _isGpuData;
@@ -86,6 +95,7 @@ namespace NTMiner.Vms {
             _name = data.Name;
             _totalMemory = data.TotalMemory;
             _temperature = 0;
+            _memTemperature = 0;
             _fanSpeed = 0;
             _powerUsage = 0;
             _coreClockDelta = 0;
@@ -109,6 +119,8 @@ namespace NTMiner.Vms {
             _voltMin = data.VoltMin;
             _voltMax = data.VoltMax;
             _voltDefault = data.VoltDefault;
+            _memoryTimingLevels = data.MemoryTimingLevels;
+            _currentMemoryTimingLevel = -1;
         }
 
         public GpuType GpuType {
@@ -200,6 +212,24 @@ namespace NTMiner.Vms {
             }
         }
 
+        public int MemTemperature {
+            get { return _memTemperature; }
+            set {
+                if (_memTemperature != value) {
+                    _memTemperature = value;
+                    OnPropertyChanged(nameof(MemTemperature));
+                    OnPropertyChanged(nameof(MemTemperatureText));
+                    OnPropertyChanged(nameof(IsMemTemperatureVisible));
+                }
+            }
+        }
+
+        public Visibility IsMemTemperatureVisible {
+            get {
+                return this.MemTemperature != 0 ? Visibility.Visible : Visibility.Collapsed;
+            }
+        }
+
         public string TemperatureText {
             get {
                 if (_isGpuData) {
@@ -215,6 +245,21 @@ namespace NTMiner.Vms {
             }
         }
 
+        public string MemTemperatureText {
+            get {
+                if (_isGpuData) {
+                    return "0℃";
+                }
+                if (NTMinerContext.Instance.GpuSet == EmptyGpuSet.Instance) {
+                    return "0℃";
+                }
+                if (this.Index == NTMinerContext.GpuAllId && NTMinerContext.Instance.GpuSet.Count != 0) {
+                    return $"{AppRoot.GpuVms.MemTemperatureMinText} - {AppRoot.GpuVms.MemTemperatureMaxText}";
+                }
+                return this.MemTemperature.ToString() + "℃";
+            }
+        }
+
         public SolidColorBrush TemperatureForeground {
             get {
                 if (this.Temperature >= AppRoot.MinerProfileVm.MaxTemp) {
@@ -733,11 +778,94 @@ namespace NTMiner.Vms {
             }
         }
 
+        public int[] MemoryTimingLevels {
+            get { return _memoryTimingLevels; }
+            set {
+                if (_memoryTimingLevels != value) {
+                    if (value == null) {
+                        return;
+                    }
+                    if (_memoryTimingLevels != null && _memoryTimingLevels.Length == value.Length) {
+                        if (value.All(a => _memoryTimingLevels.Contains(a))) {
+                            return;
+                        }
+                    }
+                    _memoryTimingLevels = value;
+                    OnPropertyChanged(nameof(MemoryTimingLevels));
+                    OnPropertyChanged(nameof(IsSupportMemoryTiming));
+                    OnPropertyChanged(nameof(MemoryTimingLevelSelects));
+                    OnPropertyChanged(nameof(IsMemoryTimingVisible));
+                }
+            }
+        }
+
+        public int[] MemoryTimingLevelSelects {
+            get {
+                var list = new List<int> { -1 };
+                if (Index == NTMinerContext.GpuAllId) {
+                    IEnumerable<int> levels = new int[0];
+                    if (_isGpuData) {
+                        var first = _gpuDatas.FirstOrDefault();
+                        if (first != null) {
+                            levels = first.MemoryTimingLevels;
+                            foreach (var item in _gpuDatas) {
+                                if (item != first) {
+                                    levels = levels.Intersect(item.MemoryTimingLevels);
+                                }
+                            }
+                        }
+                    }
+                    else {
+                        var query = NTMinerContext.Instance.GpuSet.AsEnumerable().Where(a => a.Index != NTMinerContext.GpuAllId);
+                        var first = query.FirstOrDefault();
+                        if (first != null) {
+                            levels = first.MemoryTimingLevels;
+                            foreach (var item in query) {
+                                if (item != first) {
+                                    levels = levels.Intersect(item.MemoryTimingLevels);
+                                }
+                            }
+                        }
+                    }
+                    list.AddRange(levels);
+                }
+                else {
+                    list.AddRange(this.MemoryTimingLevels);
+                }
+                return list.ToArray();
+            }
+        }
+
+        public Visibility IsMemoryTimingVisible {
+            get {
+                if (Index == NTMinerContext.GpuAllId) {
+                    return NTMinerContext.Instance.GpuSet.AsEnumerable().All(a => a.MemoryTimingLevels == null || a.MemoryTimingLevels.Length == 0) ? Visibility.Collapsed : Visibility.Visible;
+                }
+                return (_memoryTimingLevels == null || _memoryTimingLevels.Length == 0) ? Visibility.Collapsed : Visibility.Visible;
+            }
+        }
+
+        public bool IsSupportMemoryTiming {
+            get {
+                return _memoryTimingLevels != null && _memoryTimingLevels.Length != 0;
+            }
+        }
+
+        public int CurrentMemoryTimingLevel {
+            get { return _currentMemoryTimingLevel; }
+            set {
+                if (_currentMemoryTimingLevel != value) {
+                    _currentMemoryTimingLevel = value;
+                    OnPropertyChanged(nameof(CurrentMemoryTimingLevel));
+                }
+            }
+        }
+
         public bool IsDeviceArgInclude {
             get => NTMinerContext.Instance.GpuSet.GetIsUseDevice(this.Index);
             set {
                 if (NTMinerContext.Instance.IsMining) {
-                    VirtualRoot.Out.ShowWarn("请先停止挖矿", header:"提示", autoHideSeconds: 3);
+                    VirtualRoot.Out.ShowWarn("请先停止挖矿", header: "提示", autoHideSeconds: 3);
                     return;
                 }
                 int[] old = NTMinerContext.Instance.GpuSet.GetUseDevices();

+ 4 - 5
src/AppModels/Vms/KernelOutputKeywordViewModel.cs

@@ -1,6 +1,4 @@
 using NTMiner.Core;
-using NTMiner.Core.MinerClient;
-using NTMiner.Views;
 using System;
 using System.Linq;
 using System.Windows.Input;
@@ -16,7 +14,7 @@ namespace NTMiner.Vms {
 
         public ICommand Remove { get; private set; }
         public ICommand Edit { get; private set; }
-        public ICommand ToGlobal { get; private set; }
+        public ICommand ToServer { get; private set; }
         public ICommand Save { get; private set; }
 
         [Obsolete(message: NTKeyword.WpfDesignOnly, error: true)]
@@ -81,8 +79,9 @@ namespace NTMiner.Vms {
                     }
                 }));
             });
-            this.ToGlobal = new DelegateCommand(() => {
-                // TODO:
+            this.ToServer = new DelegateCommand(() => {
+                // 发送给服务器并删除本地
+                // TODO:这是在测试完了后在挖矿端将本条自定义的内核输出关键字发送到服务端变成供所有人使用的公共的内核输出关键字的地方
             });
         }
 

+ 60 - 9
src/AppModels/Vms/KernelOutputViewModel.cs

@@ -24,6 +24,9 @@ namespace NTMiner.Vms {
         private string _rejectOneShare;
         private string _rejectSharePattern;
         private string _rejectPercentPattern;
+        private string _gpuAcceptShare;
+        private string _gpuRejectShare;
+        private string _gpuIncorrectShare;
 
         private string _dualTotalSpeedPattern;
         private string _dualTotalSharePattern;
@@ -71,6 +74,9 @@ namespace NTMiner.Vms {
             _rejectSharePattern = data.RejectSharePattern;
             _rejectOneShare = data.RejectOneShare;
             _rejectPercentPattern = data.RejectPercentPattern;
+            _gpuAcceptShare = data.GpuAcceptShare;
+            _gpuRejectShare = data.GpuRejectShare;
+            _gpuIncorrectShare = data.GpuIncorrectShare;
             _dualGpuSpeedPattern = data.DualGpuSpeedPattern;
             _dualAcceptSharePattern = data.DualAcceptSharePattern;
             _dualAcceptOneShare = data.DualAcceptOneShare;
@@ -158,11 +164,17 @@ namespace NTMiner.Vms {
         public string GroupNames {
             get {
                 return string.Join("、", new string[] {
-                    NTKeyword.TotalSpeedGroupName, NTKeyword.TotalSpeedUnitGroupName,
-                    NTKeyword.TotalShareGroupName, NTKeyword.AcceptShareGroupName,
-                    NTKeyword.RejectShareGroupName, NTKeyword.RejectPercentGroupName,
-                    NTKeyword.GpuIndexGroupName, NTKeyword.GpuSpeedGroupName,
-                    NTKeyword.GpuSpeedUnitGroupName, NTKeyword.PoolDelayGroupName
+                    NTKeyword.TotalSpeedGroupName, 
+                    NTKeyword.TotalSpeedUnitGroupName,
+                    NTKeyword.TotalShareGroupName, 
+                    NTKeyword.AcceptShareGroupName,
+                    NTKeyword.IncorrectShareGroupName,
+                    NTKeyword.RejectShareGroupName, 
+                    NTKeyword.RejectPercentGroupName,
+                    NTKeyword.GpuIndexGroupName, 
+                    NTKeyword.GpuSpeedGroupName,
+                    NTKeyword.GpuSpeedUnitGroupName, 
+                    NTKeyword.PoolDelayGroupName
                 });
             }
         }
@@ -259,6 +271,9 @@ namespace NTMiner.Vms {
                 if (!string.IsNullOrEmpty(AcceptOneShare) && AcceptOneShare.Contains("?<gpu>")) {
                     return true;
                 }
+                if (!string.IsNullOrEmpty(GpuAcceptShare) && GpuAcceptShare.Contains("?<gpu>")) {
+                    return true;
+                }
                 return false;
             }
         }
@@ -297,16 +312,19 @@ namespace NTMiner.Vms {
 
         public bool IsRejectOneGpuShare {
             get {
-                return !string.IsNullOrEmpty(RejectOneShare);
+                return !string.IsNullOrEmpty(RejectOneShare) || !string.IsNullOrEmpty(GpuRejectShare);
             }
         }
 
         public bool IsGotOneIncorrectGpuShare {
             get {
-                if (string.IsNullOrEmpty(GpuGotOneIncorrectShare)) {
-                    return false;
+                if (!string.IsNullOrEmpty(GpuGotOneIncorrectShare) && GpuGotOneIncorrectShare.Contains("?<gpu>")) {
+                    return true;
                 }
-                return GpuGotOneIncorrectShare.Contains("?<gpu>");
+                if (!string.IsNullOrEmpty(GpuIncorrectShare) && GpuIncorrectShare.Contains("?<gpu>")) {
+                    return true;
+                }
+                return false;
             }
         }
 
@@ -341,6 +359,39 @@ namespace NTMiner.Vms {
             }
         }
 
+        public string GpuAcceptShare {
+            get { return _gpuAcceptShare; }
+            set {
+                if (_gpuAcceptShare != value) {
+                    _gpuAcceptShare = value;
+                    OnPropertyChanged(nameof(GpuAcceptShare));
+                    OnPropertyChanged(nameof(IsFoundOneGpuShare));
+                }
+            }
+        }
+
+        public string GpuRejectShare {
+            get { return _gpuRejectShare; }
+            set {
+                if (_gpuRejectShare != value) {
+                    _gpuRejectShare = value;
+                    OnPropertyChanged(nameof(GpuRejectShare));
+                    OnPropertyChanged(nameof(IsRejectOneGpuShare));
+                }
+            }
+        }
+
+        public string GpuIncorrectShare {
+            get { return _gpuIncorrectShare; }
+            set {
+                if (_gpuIncorrectShare != value) {
+                    _gpuIncorrectShare = value;
+                    OnPropertyChanged(nameof(GpuIncorrectShare));
+                    OnPropertyChanged(nameof(IsGotOneIncorrectGpuShare));
+                }
+            }
+        }
+
         public string DualTotalSpeedPattern {
             get => _dualTotalSpeedPattern;
             set {

+ 1 - 1
src/AppModels/Vms/KernelsWindowViewModel.cs

@@ -14,7 +14,7 @@ namespace NTMiner.Vms {
         private CoinViewModel _selectedCoinVm = CoinViewModel.PleaseSelect;
         private int _pageIndex = 1;
         private int _pageSize = 15;
-        private PagingViewModel _pagingVm;
+        private readonly PagingViewModel _pagingVm;
 
         public ICommand Home { get; private set; }
         public ICommand ChangeCurrentKernelMenu { get; private set; }

+ 0 - 8
src/AppModels/Vms/MainWindowViewModel.cs

@@ -52,14 +52,6 @@ namespace NTMiner.Vms {
             }
         }
 
-        public bool IsUseDevConsole {
-            get { return NTMinerContext.IsUseDevConsole; }
-            set {
-                NTMinerContext.IsUseDevConsole = value;
-                OnPropertyChanged(nameof(IsUseDevConsole));
-            }
-        }
-
         public MinerProfileViewModel MinerProfile {
             get {
                 return AppRoot.MinerProfileVm;

+ 26 - 9
src/AppModels/Vms/MinerProfileViewModel.cs

@@ -1,10 +1,13 @@
 using NTMiner.Core;
+using NTMiner.Core.Kernels;
 using NTMiner.Core.Profile;
 using NTMiner.MinerStudio.Vms;
 using NTMiner.Ws;
 using System;
+using System.Diagnostics;
 using System.IO;
 using System.Linq;
+using System.Text.RegularExpressions;
 using System.Windows;
 using System.Windows.Input;
 
@@ -27,6 +30,7 @@ namespace NTMiner.Vms {
         public ICommand Up { get; private set; }
         public ICommand Down { get; private set; }
         public ICommand WsRetry { get; private set; }
+        public ICommand CopyArgsAssembly { get; private set; }
 
         public MinerProfileViewModel() {
             if (WpfUtil.IsInDesignMode) {
@@ -48,6 +52,18 @@ namespace NTMiner.Vms {
                 RpcRoot.Client.NTMinerDaemonService.StartOrStopWsAsync(isResetFailCount: true);
                 IsConnecting = true;
             });
+            string GetRowArgsAssembly(){
+                string argsAssembly = this.ArgsAssembly ?? "无";
+                if (argsAssembly.Contains("{logfile}")) {
+                    argsAssembly = Regex.Replace(argsAssembly, "\\s\\S+\\s\"\\{logfile\\}\"", string.Empty);
+                }
+                return argsAssembly.Trim();
+            }
+            this.CopyArgsAssembly = new DelegateCommand(() => {
+                string argsAssembly = GetRowArgsAssembly();
+                Clipboard.SetDataObject(argsAssembly, true);
+                VirtualRoot.Out.ShowSuccess("命令行", header: "复制成功");
+            });
             if (ClientAppType.IsMinerClient) {
                 if (this.IsSystemName) {
                     this.MinerName = NTKeyword.GetSafeMinerName(NTMinerContext.ThisPcName);
@@ -128,7 +144,7 @@ namespace NTMiner.Vms {
                     this.ArgsAssembly = string.Empty;
                 }
             });
-            AppRoot.BuildCmdPath<RefreshAutoBootStartCommand>("刷新开机启动和自动挖矿的展示", LogEnum.DevConsole,
+            AppRoot.BuildEventPath<AutoBootStartRefreshedEvent>("刷新开机启动和自动挖矿的展示", LogEnum.DevConsole,
                 path: message => {
                     this.OnPropertyChanged(nameof(IsAutoBoot));
                     this.OnPropertyChanged(nameof(IsAutoStart));
@@ -547,10 +563,10 @@ namespace NTMiner.Vms {
         }
 
         public bool IsAutoStart {
-            get => NTMinerRegistry.GetIsAutoStart();
+            get => NTMinerContext.Instance.MinerProfile.IsAutoStart;
             set {
-                if (NTMinerRegistry.GetIsAutoStart() != value) {
-                    NTMinerRegistry.SetIsAutoStart(value);
+                if (NTMinerContext.Instance.MinerProfile.IsAutoStart != value) {
+                    NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsAutoStart), value);
                     OnPropertyChanged(nameof(IsAutoStart));
                 }
             }
@@ -1051,12 +1067,13 @@ namespace NTMiner.Vms {
         }
 
         public bool IsAutoReboot {
-            get {
-                return Windows.Crash.GetAutoReboot();
-            }
+            get => NTMinerContext.Instance.MinerProfile.IsAutoReboot;
             set {
-                Windows.Crash.SetAutoReboot(value);
-                OnPropertyChanged(nameof(IsAutoBoot));
+                if (NTMinerContext.Instance.MinerProfile.IsAutoReboot != value) {
+                    Windows.Crash.SetAutoReboot(value);
+                    NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsAutoReboot), value);
+                    OnPropertyChanged(nameof(IsAutoReboot));
+                }
             }
         }
     }

+ 28 - 14
src/AppModels/Vms/SpeedViewModel.cs

@@ -54,24 +54,30 @@ namespace NTMiner.Vms {
         public string SpeedText {
             get => _speedText;
             private set {
-                _speedText = value;
-                OnPropertyChanged(nameof(SpeedText));
+                if (_speedText != value) {
+                    _speedText = value;
+                    OnPropertyChanged(nameof(SpeedText));
+                }
             }
         }
 
         public string SpeedValueText {
             get => _speedValueText;
             private set {
-                _speedValueText = value;
-                OnPropertyChanged(nameof(SpeedValueText));
+                if (_speedValueText != value) {
+                    _speedValueText = value;
+                    OnPropertyChanged(nameof(SpeedValueText));
+                }
             }
         }
 
         public string SpeedUnit {
             get => _speedUnit;
             private set {
-                _speedUnit = value;
-                OnPropertyChanged(nameof(SpeedUnit));
+                if (_speedUnit != value) {
+                    _speedUnit = value;
+                    OnPropertyChanged(nameof(SpeedUnit));
+                }
             }
         }
 
@@ -92,32 +98,40 @@ namespace NTMiner.Vms {
         public int FoundShare {
             get => _foundShare;
             set {
-                _foundShare = value;
-                OnPropertyChanged(nameof(FoundShare));
+                if (_foundShare != value) {
+                    _foundShare = value;
+                    OnPropertyChanged(nameof(FoundShare));
+                }
             }
         }
 
         public int AcceptShare {
             get { return _acceptShare; }
             set {
-                _acceptShare = value;
-                OnPropertyChanged(nameof(AcceptShare));
+                if (_acceptShare != value) {
+                    _acceptShare = value;
+                    OnPropertyChanged(nameof(AcceptShare));
+                }
             }
         }
 
         public int RejectShare {
             get => _rejectShare;
             set {
-                _rejectShare = value;
-                OnPropertyChanged(nameof(RejectShare));
+                if (_rejectShare != value) {
+                    _rejectShare = value;
+                    OnPropertyChanged(nameof(RejectShare));
+                }
             }
         }
 
         public int IncorrectShare {
             get { return _incorrectShare; }
             set {
-                _incorrectShare = value;
-                OnPropertyChanged(nameof(IncorrectShare));
+                if (_incorrectShare != value) {
+                    _incorrectShare = value;
+                    OnPropertyChanged(nameof(IncorrectShare));
+                }
             }
         }
 

+ 1 - 1
src/AppModels/Vms/StartStopMineButtonViewModel.cs

@@ -39,7 +39,7 @@ namespace NTMiner.Vms {
                 NTMinerConsole.UserInfo($"{MinerProfile.AutoStartDelaySeconds.ToString()}秒后开始挖矿");
                 this.MinerProfile.IsMining = true;
                 IMessagePathId pathId = null;
-                pathId = VirtualRoot.BuildViaTimesLimitPath<Per1SecondEvent>("挖矿倒计时", LogEnum.None,
+                pathId = VirtualRoot.BuildViaTimesLimitPath<Per1SecondEvent>("自动开始挖矿倒计时", LogEnum.None,
                     path: message => {
                         if (!NTMinerContext.IsAutoStartCanceled) {
                             MineBtnText = $"倒计时{pathId.ViaTimesLimit.ToString()}";

+ 20 - 0
src/AppModels/Vms/UserViewModel.cs

@@ -18,6 +18,7 @@ namespace NTMiner.Vms {
         private string _privateKey;
         private string _roles;
         private DateTime _createdOn;
+        private DateTime _lastLogin;
 
         public ICommand Enable { get; private set; }
         public ICommand Disable { get; private set; }
@@ -75,6 +76,7 @@ namespace NTMiner.Vms {
             _privateKey = data.PrivateKey;
             _roles = data.Roles;
             _createdOn = data.CreatedOn;
+            _lastLogin = data.LastLogin;
         }
 
         public string LoginName {
@@ -212,5 +214,23 @@ namespace NTMiner.Vms {
                 return this.CreatedOn.ToString("yyyy-MM-dd HH:mm:ss");
             }
         }
+
+        public DateTime LastLogin {
+            get { return _lastLogin; }
+            set {
+                _lastLogin = value;
+                OnPropertyChanged(nameof(LastLogin));
+                OnPropertyChanged(nameof(LastLoginText));
+            }
+        }
+
+        public string LastLoginText {
+            get {
+                if (this.LastLogin <= Timestamp.UnixBaseTime) {
+                    return string.Empty;
+                }
+                return this.LastLogin.ToString("yyyy-MM-dd HH:mm:ss");
+            }
+        }
     }
 }

+ 5 - 0
src/AppViews0/AppViewFactory.cs

@@ -286,6 +286,11 @@ namespace NTMiner {
                     MinerStudioUcs.GpuNameCounts.ShowWindow();
                 });
             }, location: location);
+            VirtualRoot.BuildCmdPath<ShowActionCountPageCommand>(path: message => {
+                UIThread.Execute(() => {
+                    MinerStudioUcs.ActionCounts.ShowWindow();
+                });
+            }, location: location);
             VirtualRoot.BuildCmdPath<ShowChangePassword>(path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.ChangePassword.ShowWindow();

+ 11 - 0
src/AppViews0/AppViews0.csproj

@@ -104,6 +104,9 @@
     <Compile Include="MinerStudio\Views\Ucs\ColumnsShowEdit.xaml.cs">
       <DependentUpon>ColumnsShowEdit.xaml</DependentUpon>
     </Compile>
+    <Compile Include="MinerStudio\Views\Ucs\ActionCounts.xaml.cs">
+      <DependentUpon>ActionCounts.xaml</DependentUpon>
+    </Compile>
     <Compile Include="MinerStudio\Views\Ucs\GpuNameCounts.xaml.cs">
       <DependentUpon>GpuNameCounts.xaml</DependentUpon>
     </Compile>
@@ -405,6 +408,10 @@
     <Compile Include="Views\Ucs\CoinPage.xaml.cs">
       <DependentUpon>CoinPage.xaml</DependentUpon>
     </Compile>
+    <Page Include="MinerStudio\Views\Design\ActionCountsViewModel.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="MinerStudio\Views\Design\GpuNameCountsViewModel.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
@@ -441,6 +448,10 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
+    <Page Include="MinerStudio\Views\Ucs\ActionCounts.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="MinerStudio\Views\Ucs\GpuNameCounts.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>

+ 2 - 0
src/AppViews0/MinerStudio/Views/Design/ActionCountsViewModel.xaml

@@ -0,0 +1,2 @@
+<vm:ActionCountsViewModel xmlns:vm="clr-namespace:NTMiner.MinerStudio.Vms;assembly=AppModels">
+</vm:ActionCountsViewModel>

+ 0 - 33
src/AppViews0/MinerStudio/Views/MinerClientsWindow.xaml

@@ -244,39 +244,6 @@
                         </StackPanel>
                         <uc:MinerClients Grid.Row="1">
                         </uc:MinerClients>
-                        <Border 
-                            Grid.Row="1" 
-                            Margin="0 26 0 0" 
-                            Visibility="{Binding IsLoading,Converter={StaticResource BoolToVisibilityConverter}}" 
-                            Background="#0f000000">
-                            <Path 
-							    Width="30"
-							    Height="30"
-							    Data="{StaticResource Icon_Loading}"
-							    Fill="Black"
-							    Stretch="Fill">
-                                <Path.RenderTransform>
-                                    <RotateTransform Angle="{Binding LoadingIconAngle}" CenterX="15" CenterY="15"></RotateTransform>
-                                </Path.RenderTransform>
-                            </Path>
-                        </Border>
-                        <WrapPanel Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center" Visibility="{Binding IsNoRecordVisible}">
-                            <TextBlock VerticalAlignment="Center" Foreground="Red" Text="没有记录"></TextBlock>
-                            <WrapPanel Visibility="{Binding MainMenu.IsMinerStudioLocalVisible}">
-                                <TextBlock VerticalAlignment="Center" Foreground="Red" Text=",请先添加矿机"></TextBlock>
-                                <controls:KbButton Padding="4" Command="{Binding AddMinerClient}">
-                                    <WrapPanel>
-                                        <Path
-							                Width="16"
-							                Height="16"
-							                Data="{StaticResource Icon_Add}"
-							                Fill="{StaticResource BtnBackground}"
-							                Stretch="Fill" />
-                                        <TextBlock>添加矿机</TextBlock>
-                                    </WrapPanel>
-                                </controls:KbButton>
-                            </WrapPanel>
-                        </WrapPanel>
                         <uc:MinerClientsPagging Grid.Row="2">
                         </uc:MinerClientsPagging>
                         <TextBlock Grid.Row="2" Margin="0 0 4 0" HorizontalAlignment="Right" VerticalAlignment="Center" Foreground="{StaticResource LableColor}">小提示:鼠标配合ctrl和shift可以多选、反选矿机。</TextBlock>

+ 2 - 1
src/AppViews0/MinerStudio/Views/MinerClientsWindow.xaml.cs

@@ -138,7 +138,7 @@ namespace NTMiner.MinerStudio.Views {
                     #region
                     var minerClients = Vm.MinerClients.ToArray();
                     if (Vm.CountDown > 0) {
-                        Vm.CountDown = Vm.CountDown - 1;
+                        Vm.DownCountDown();
                         foreach (var item in minerClients) {
                             item.OnPropertyChanged(nameof(item.LastActivedOnText));
                         }
@@ -150,6 +150,7 @@ namespace NTMiner.MinerStudio.Views {
                         }
                     }
                     else if (Vm.CountDown == 0) {
+                        Vm.ResetCountDown();
                         MinerStudioRoot.MinerClientsWindowVm.QueryMinerClients(isAuto: true);
                     }
                     #endregion

+ 185 - 0
src/AppViews0/MinerStudio/Views/Ucs/ActionCounts.xaml

@@ -0,0 +1,185 @@
+<UserControl 
+    x:Class="NTMiner.MinerStudio.Views.Ucs.ActionCounts"
+	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+	xmlns:sys="clr-namespace:System;assembly=mscorlib"
+	xmlns:controls="clr-namespace:NTMiner.Controls;assembly=NTMinerWpf"
+	xmlns:local="clr-namespace:NTMiner.Views.Ucs"
+	xmlns:app="clr-namespace:NTMiner;assembly=AppModels"
+	xmlns:vm="clr-namespace:NTMiner.MinerStudio.Vms;assembly=AppModels"
+    Background="White"
+	mc:Ignorable="d" 
+    d:DesignHeight="700" 
+    d:DesignWidth="800"
+    d:DataContext="{d:DesignData Source=../Design/ActionCountsViewModel.xaml}">
+    <Grid Background="{StaticResource ToolbarBackground}">
+        <Grid.RowDefinitions>
+            <RowDefinition Height="Auto"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+            <RowDefinition Height="Auto"></RowDefinition>
+        </Grid.RowDefinitions>
+        <WrapPanel>
+            <Path 
+                Margin="4 0 0 0"
+				Width="12"
+				Height="12"
+				Fill="{StaticResource BtnBackground}"
+				Stretch="Fill"
+				Data="{StaticResource Icon_Search}"></Path>
+            <TextBlock Padding="2 6">搜索</TextBlock>
+            <controls:KbTextBox 
+				x:Name="TbKeyword" Width="154" Height="24"
+				Text="{Binding Keyword, UpdateSourceTrigger=LostFocus}" 
+				LostFocus="TbKeyword_LostFocus"
+				VerticalContentAlignment="Center"
+				Hint="输入显卡名关键字然后回车"
+                ToolTip="输入显卡名关键字然后回车"
+				BorderBrush="{StaticResource LightLineColor}"
+				BorderThickness="1"
+				Background="White"
+                KeyUp="TbKeyword_KeyUp"
+				SelectedColor="#409EFF" />
+            <controls:KbButton 
+				Height="20"
+				Background="Transparent" BorderThickness="0"
+				Command="{Binding ClearKeyword}"
+				Visibility="{Binding ElementName=TbKeyword,Path=Text, Converter={StaticResource NotNullOrEmptyVisibilityConverter}}"
+				Margin="-14 0 0 0" HorizontalAlignment="Left">
+                <Path
+					Width="8"
+					Height="8"
+					Data="{StaticResource Icon_Close}"
+					Fill="{StaticResource BtnBackground}"
+					Stretch="Fill" />
+            </controls:KbButton>
+        </WrapPanel>
+		<DataGrid 
+            Grid.Row="1"
+            Margin="0" 
+            ItemsSource="{Binding ActionCounts}" 
+			BorderThickness="0">
+			<DataGrid.Resources>
+				<controls:BindingProxy x:Key="proxy" Data="{Binding}" />
+			</DataGrid.Resources>
+            <DataGrid.Columns>
+                <DataGridTextColumn Width="*" IsReadOnly="True" Header="ActionName" Binding="{Binding ActionName}">
+                </DataGridTextColumn>
+                <DataGridTextColumn Width="100" IsReadOnly="True" Header="Count" Binding="{Binding Count}">
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+		</DataGrid>
+        <TextBlock Grid.Row="1" Visibility="{Binding ActionCounts,Converter={StaticResource NoRecordVisibilityConverter}}" Foreground="Red" HorizontalAlignment="Center" VerticalAlignment="Center">没有记录</TextBlock>
+        <WrapPanel Grid.Row="2">
+            <Button x:Name="ButtonLeft" IsEnabled="{Binding PagingVm.CanPageSub}" Command="{Binding PageSub}">
+                <Button.Template>
+                    <ControlTemplate>
+                        <Border 
+							x:Name="Content"
+							BorderThickness="1"
+							Background="Transparent">
+                            <Path
+								x:Name="Icon"
+								Width="22"
+								Height="22"
+								Data="{StaticResource Icon_Page-}"
+								Fill="#676767"
+								Stretch="Fill">
+                            </Path>
+                        </Border>
+                        <ControlTemplate.Triggers>
+                            <Trigger Property="IsEnabled" Value="False">
+                                <Setter Property="Opacity" Value="0.5"></Setter>
+                            </Trigger>
+                            <Trigger Property="IsMouseOver" Value="true">
+                                <Setter TargetName="Icon" Property="Fill" Value="{StaticResource BtnBackground}"/>
+                            </Trigger>
+                        </ControlTemplate.Triggers>
+                    </ControlTemplate>
+                </Button.Template>
+            </Button>
+            <ListBox 
+				Margin="4"
+				Background="Transparent"
+				ItemsSource="{Binding PagingVm.PageNumbers}"
+				SelectedItem="{Binding PageIndex}"
+				BorderThickness="0">
+                <ListBox.ItemContainerStyle>
+                    <Style TargetType="ListBoxItem">
+                        <Setter Property="Template">
+                            <Setter.Value>
+                                <ControlTemplate TargetType="ListBoxItem">
+                                    <Border 
+										BorderThickness="1"
+										BorderBrush="{StaticResource LightLineColor}"
+										Margin="4 0"
+										Background="{TemplateBinding Background}" 
+										Width="24" 
+										Height="24" 
+										CornerRadius="12">
+                                        <TextBlock 
+											HorizontalAlignment="Center"
+											VerticalAlignment="Center"
+											Foreground="{TemplateBinding Foreground}"
+											Text="{Binding}"/>
+                                    </Border>
+                                    <ControlTemplate.Triggers>
+                                        <Trigger Property="IsSelected" Value="true">
+                                            <Setter Property="Background" Value="{StaticResource BtnBackground}"/>
+                                            <Setter Property="Foreground" Value="{StaticResource BtnForeground}"/>
+                                        </Trigger>
+                                        <Trigger Property="IsMouseOver" Value="true">
+                                            <Setter Property="Background" Value="{StaticResource BtnBackground}"/>
+                                            <Setter Property="Foreground" Value="{StaticResource BtnForeground}"/>
+                                        </Trigger>
+                                    </ControlTemplate.Triggers>
+                                </ControlTemplate>
+                            </Setter.Value>
+                        </Setter>
+                    </Style>
+                </ListBox.ItemContainerStyle>
+                <ListBox.ItemsPanel>
+                    <ItemsPanelTemplate>
+                        <WrapPanel>
+                        </WrapPanel>
+                    </ItemsPanelTemplate>
+                </ListBox.ItemsPanel>
+            </ListBox>
+            <Button x:Name="ButtonRight" Margin="2 0 0 0" IsEnabled="{Binding PagingVm.CanPageAdd}" Command="{Binding PageAdd}">
+                <Button.Template>
+                    <ControlTemplate>
+                        <Border 
+							x:Name="Content"
+							BorderThickness="1"
+							Background="Transparent">
+                            <Path
+								x:Name="Icon"
+								Width="22"
+								Height="22"
+								Data="{StaticResource Icon_Page+}"
+								Fill="#676767"
+								Stretch="Fill">
+                            </Path>
+                        </Border>
+                        <ControlTemplate.Triggers>
+                            <Trigger Property="IsEnabled" Value="False">
+                                <Setter Property="Opacity" Value="0.5"></Setter>
+                            </Trigger>
+                            <Trigger Property="IsMouseOver" Value="true">
+                                <Setter TargetName="Icon" Property="Fill" Value="{StaticResource BtnBackground}"/>
+                            </Trigger>
+                        </ControlTemplate.Triggers>
+                    </ControlTemplate>
+                </Button.Template>
+            </Button>
+            <TextBlock Margin="10 0 0 0" Foreground="{StaticResource LableColor}" VerticalAlignment="Center" Text="每页"></TextBlock>
+            <TextBlock Padding="4 0" VerticalAlignment="Center" Text="{Binding PageSize}"></TextBlock>
+            <TextBlock VerticalAlignment="Center" Foreground="{StaticResource LableColor}" Text="条,"></TextBlock>
+
+            <TextBlock VerticalAlignment="Center" Foreground="{StaticResource LableColor}" Text="共"></TextBlock>
+            <TextBlock Padding="4 0" VerticalAlignment="Center" Text="{Binding PagingVm.Total}"></TextBlock>
+            <TextBlock VerticalAlignment="Center" Foreground="{StaticResource LableColor}" Text="条"></TextBlock>
+        </WrapPanel>
+    </Grid>
+</UserControl>

+ 44 - 0
src/AppViews0/MinerStudio/Views/Ucs/ActionCounts.xaml.cs

@@ -0,0 +1,44 @@
+using NTMiner.MinerStudio.Vms;
+using NTMiner.Views;
+using NTMiner.Vms;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+
+namespace NTMiner.MinerStudio.Views.Ucs {
+    public partial class ActionCounts : UserControl {
+        public static void ShowWindow() {
+            ContainerWindow.ShowWindow(new ContainerWindowViewModel {
+                Title = "WebApi Actions",
+                IconName = "Icon_Action",
+                Width = 800,
+                Height = 700,
+                IsMaskTheParent = false,
+                IsChildWindow = true,
+                CloseVisible = Visibility.Visible,
+                FooterVisible = Visibility.Collapsed
+            }, ucFactory: (window) => new ActionCounts());
+        }
+
+        public ActionCountsViewModel Vm { get; private set; }
+
+        public ActionCounts() {
+            if (WpfUtil.IsInDesignMode) {
+                return;
+            }
+            this.Vm = new ActionCountsViewModel();
+            this.DataContext = this.Vm;
+            InitializeComponent();
+        }
+
+        private void TbKeyword_LostFocus(object sender, RoutedEventArgs e) {
+            ((ActionCountsViewModel)this.DataContext).Search.Execute(null);
+        }
+
+        private void TbKeyword_KeyUp(object sender, KeyEventArgs e) {
+            if (e.Key == Key.Enter) {
+                ((ActionCountsViewModel)this.DataContext).Keyword = this.TbKeyword.Text;
+            }
+        }
+    }
+}

+ 46 - 23
src/AppViews0/MinerStudio/Views/Ucs/CalcConfig.xaml

@@ -78,28 +78,51 @@
 			</ItemsControl>
 		</ScrollViewer>
 		<TextBlock Grid.Row="1" HorizontalAlignment="Center" Text="数据来自鱼池首页,每10分钟自动刷新一次" Foreground="Red"></TextBlock>
-		<controls:KbButton
-			Grid.Row="2"
-			Command="{Binding Save}" 
-			VerticalAlignment="Bottom"
-			HorizontalAlignment="Center"
-			Margin="0 10 0 0"
-			Padding="15 2"
-			Background="{StaticResource BtnBackground}"
-			Foreground="{StaticResource BtnForeground}"
-			CornerRadius="2">
-			<WrapPanel>
-				<Path
-					Width="12"
-					Height="12"
-					Data="{StaticResource Icon_Ok}"
-					Fill="{StaticResource BtnForeground}"
-					Stretch="Fill" />
-				<TextBlock
-					Padding="4"
-					VerticalAlignment="Center"
-					Text="确定" />
-			</WrapPanel>
-		</controls:KbButton>
+        <WrapPanel Grid.Row="2" Margin="0 10 0 0" HorizontalAlignment="Center">
+            <controls:KbButton
+				Command="{Binding Save}" 
+				VerticalAlignment="Bottom"
+				HorizontalAlignment="Center"
+				Padding="15 2"
+				Background="{StaticResource BtnBackground}"
+				Foreground="{StaticResource BtnForeground}"
+				CornerRadius="2">
+                <WrapPanel>
+                    <Path
+						Width="12"
+						Height="12"
+						Data="{StaticResource Icon_Ok}"
+						Fill="{StaticResource BtnForeground}"
+						Stretch="Fill" />
+                    <TextBlock
+						Padding="4"
+						VerticalAlignment="Center"
+						Text="确定" />
+                </WrapPanel>
+            </controls:KbButton>
+            <controls:KbButton
+                Margin="20 0 0 0"
+				Command="{Binding Clear}" 
+                ToolTip="清理掉已经下架的币种"
+				VerticalAlignment="Bottom"
+				HorizontalAlignment="Center"
+				Padding="15 2"
+				Background="{StaticResource BtnBackground}"
+				Foreground="{StaticResource BtnForeground}"
+				CornerRadius="2">
+                <WrapPanel>
+                    <Path
+						Width="12"
+						Height="12"
+						Data="{StaticResource Icon_Clear}"
+						Fill="{StaticResource BtnForeground}"
+						Stretch="Fill" />
+                    <TextBlock
+						Padding="4"
+						VerticalAlignment="Center"
+						Text="清理" />
+                </WrapPanel>
+            </controls:KbButton>
+        </WrapPanel>
 	</Grid>
 </UserControl>

+ 4 - 4
src/AppViews0/MinerStudio/Views/Ucs/GpuProfilesPage.xaml.cs

@@ -29,7 +29,7 @@ namespace NTMiner.MinerStudio.Views.Ucs {
                 window.BuildCloseWindowOnecePath(vm.Id);
                 var uc = new GpuProfilesPage(vm);
                 var client = minerClientsWindowVm.SelectedMinerClients[0];
-                void handler(object sender, PropertyChangedEventArgs e) {
+                void onSelectedMinerClientsChanged(object sender, PropertyChangedEventArgs e) {
                     if (e.PropertyName == nameof(minerClientsWindowVm.SelectedMinerClients)) {
                         List<MinerClientViewModel> toRemoves = new List<MinerClientViewModel>();
                         foreach (var item in vm.MinerClientVms) {
@@ -56,9 +56,9 @@ namespace NTMiner.MinerStudio.Views.Ucs {
                     }
                 }
 
-                minerClientsWindowVm.PropertyChanged += handler;
+                minerClientsWindowVm.PropertyChanged += onSelectedMinerClientsChanged;
                 uc.Unloaded += (object sender, RoutedEventArgs e) => {
-                    minerClientsWindowVm.PropertyChanged -= handler;
+                    minerClientsWindowVm.PropertyChanged -= onSelectedMinerClientsChanged;
                 };
                 window.BuildEventPath<GetGpuProfilesResponsedEvent>("收到GetGpuProfilesJson的响应", LogEnum.DevConsole, path: message => {
                     if (message.ClientId != minerClientVm.ClientId) {
@@ -66,7 +66,7 @@ namespace NTMiner.MinerStudio.Views.Ucs {
                     }
                     vm.SetData(message.Data);
                 }, typeof(GpuProfilesPage));
-                MinerStudioService.Instance.GetGpuProfilesJsonAsync(minerClientVm);
+                MinerStudioRoot.MinerStudioService.GetGpuProfilesJsonAsync(minerClientVm);
                 return uc;
             }, fixedSize: false);
         }

+ 1 - 1
src/AppViews0/MinerStudio/Views/Ucs/LocalIpConfig.xaml.cs

@@ -29,7 +29,7 @@ namespace NTMiner.MinerStudio.Views.Ucs {
                     }
                     vm.LocalIpVms = message.Data.Select(a => new NTMiner.Vms.LocalIpViewModel(a)).ToList();
                 }, typeof(LocalIpConfig));
-                MinerStudioService.Instance.GetLocalIpsAsync(vm.MinerClientVm);
+                MinerStudioRoot.MinerStudioService.GetLocalIpsAsync(vm.MinerClientVm);
                 return uc;
             }, fixedSize: true);
         }

+ 25 - 4
src/AppViews0/MinerStudio/Views/Ucs/MinerClient.xaml

@@ -438,7 +438,7 @@
                         <DataGridTemplateColumn Width="40" IsReadOnly="True">
                             <DataGridTemplateColumn.HeaderTemplate>
                                 <DataTemplate>
-                                    <TextBlock Text="超频功耗" TextWrapping="Wrap" FontSize="12"></TextBlock>
+                                    <TextBlock Text="功耗" TextWrapping="Wrap" FontSize="12"></TextBlock>
                                 </DataTemplate>
                             </DataGridTemplateColumn.HeaderTemplate>
                             <DataGridTemplateColumn.CellTemplate>
@@ -465,7 +465,7 @@
                         <DataGridTemplateColumn Width="60" IsReadOnly="True">
                             <DataGridTemplateColumn.HeaderTemplate>
                                 <DataTemplate>
-                                    <TextBlock Text="超频核心" TextWrapping="Wrap" FontSize="12"></TextBlock>
+                                    <TextBlock Text="核心" TextWrapping="Wrap" FontSize="12"></TextBlock>
                                 </DataTemplate>
                             </DataGridTemplateColumn.HeaderTemplate>
                             <DataGridTemplateColumn.CellTemplate>
@@ -477,7 +477,7 @@
                         <DataGridTemplateColumn Width="60" IsReadOnly="True">
                             <DataGridTemplateColumn.HeaderTemplate>
                                 <DataTemplate>
-                                    <TextBlock Text="超频显存" TextWrapping="Wrap" FontSize="12"></TextBlock>
+                                    <TextBlock Text="显存" TextWrapping="Wrap" FontSize="12"></TextBlock>
                                 </DataTemplate>
                             </DataGridTemplateColumn.HeaderTemplate>
                             <DataGridTemplateColumn.CellTemplate>
@@ -688,12 +688,33 @@
                 <Path
 					Width="16"
 					Height="16"
-					Data="{StaticResource Icon_CheckedBox}"
+					Data="{Binding Is1080PillEnabled,Converter={StaticResource BoolToStreamGeometryConverter}}"
 					Fill="{StaticResource LableColor}"
 					Stretch="Fill" />
                 <TextBlock Margin="2 0 0 0" Foreground="{StaticResource LableColor}">有1080/1080ti显卡时启动小药丸加速算力</TextBlock>
             </WrapPanel>
         </WrapPanel>
+        <WrapPanel Margin="0 3">
+            <TextBlock Style="{StaticResource LblTb}"></TextBlock>
+            <WrapPanel Width="260">
+                <Path
+					Width="16"
+					Height="16"
+					Data="{Binding IsPreventDisplaySleep,Converter={StaticResource BoolToStreamGeometryConverter}}"
+					Fill="{StaticResource LableColor}"
+					Stretch="Fill" />
+                <TextBlock Margin="2 0 0 0" Foreground="{StaticResource LableColor}">开着开源矿工时阻止显示器休眠</TextBlock>
+            </WrapPanel>
+            <WrapPanel Width="260">
+                <Path
+					Width="16"
+					Height="16"
+					Data="{Binding IsAutoReboot,Converter={StaticResource BoolToStreamGeometryConverter}}"
+					Fill="{StaticResource LableColor}"
+					Stretch="Fill" />
+                <TextBlock Margin="2 0 0 0" Foreground="{StaticResource LableColor}">Windows蓝屏自动重启</TextBlock>
+            </WrapPanel>
+        </WrapPanel>
         <WrapPanel Margin="0 3">
             <TextBlock Style="{StaticResource LblTb}"></TextBlock>
             <WrapPanel Width="260">

+ 2265 - 2231
src/AppViews0/MinerStudio/Views/Ucs/MinerClients.xaml

@@ -10,2382 +10,2416 @@
 	xmlns:local="clr-namespace:NTMiner.Views.Ucs"
 	xmlns:app="clr-namespace:NTMiner;assembly=AppModels"
 	mc:Ignorable="d" d:DesignHeight="1000" d:DesignWidth="5500">
-    <DataGrid 
-		BorderThickness="0 1 0 0"
-        BorderBrush="{StaticResource LightLineColor}"
-		IsReadOnly="True"
-		SelectionMode="Extended"
-		SelectionChanged="MinerClientsGrid_OnSelectionChanged"
-		Sorting="DataGrid_OnSorting"
-		HeadersVisibility="All"
-		RowHeaderWidth="10"
-        EnableColumnVirtualization="{Binding IsEnableVirtualization}"
-        EnableRowVirtualization="{Binding IsEnableVirtualization}"
-		FrozenColumnCount="{Binding FrozenColumnCount}"
-		ItemsSource="{Binding MinerClients}"
-		SelectedItem="{Binding CurrentMinerClient}"
-		MouseDoubleClick="DataGrid_MouseDoubleClick"
-		AutoGenerateColumns="False">
-        <DataGrid.Resources>
-            <controls:BindingProxy x:Key="proxy" Data="{Binding}" />
-        </DataGrid.Resources>
-        <DataGrid.ContextMenu>
-            <ContextMenu>
-                <MenuItem Header="开始挖矿" Command="{Binding Data.StartMine,Source={StaticResource proxy}}">
-                    <MenuItem.Icon>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{StaticResource Icon_Start}"
-							Fill="{StaticResource BtnBackground}"
-							Stretch="Fill" />
-                    </MenuItem.Icon>
-                </MenuItem>
-                <MenuItem Header="停止挖矿" Command="{Binding Data.StopMine,Source={StaticResource proxy}}">
-                    <MenuItem.Icon>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{StaticResource Icon_Stop}"
-							Fill="{StaticResource BtnBackground}"
-							Stretch="Fill" />
-                    </MenuItem.Icon>
-                </MenuItem>
-                <MenuItem Header="重启电脑" Command="{Binding Data.RestartWindows,Source={StaticResource proxy}}">
-                    <MenuItem.Icon>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{StaticResource Icon_Restart2}"
-							Fill="{StaticResource BtnBackground}"
-							Stretch="Fill" />
-                    </MenuItem.Icon>
-                </MenuItem>
-                <MenuItem Header="关闭电脑" Command="{Binding Data.ShutdownWindows,Source={StaticResource proxy}}">
-                    <MenuItem.Icon>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{StaticResource Icon_Shutdown}"
-							Fill="{StaticResource BtnBackground}"
-							Stretch="Fill" />
-                    </MenuItem.Icon>
-                </MenuItem>
-                <MenuItem 
-                    Header="复制主币钱包" 
-                    Command="{Binding Data.CopyMainCoinWallet,Source={StaticResource proxy}}">
-                    <MenuItem.Icon>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{StaticResource Icon_Copy}"
-							Fill="{StaticResource BtnBackground}"
-							Stretch="Fill" />
-                    </MenuItem.Icon>
-                </MenuItem>
-                <MenuItem 
-                    Header="添加矿机" 
-                    Command="{Binding Data.AddMinerClient,Source={StaticResource proxy}}"
-                    Visibility="{Binding MainMenu.IsMinerStudioLocalVisible}">
-                    <MenuItem.Icon>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{StaticResource Icon_Add}"
-							Fill="{StaticResource BtnBackground}"
-							Stretch="Fill" />
-                    </MenuItem.Icon>
-                </MenuItem>
-                <MenuItem 
-                    Header="删除矿机" 
-                    Command="{Binding Data.RemoveMinerClients,Source={StaticResource proxy}}">
-                    <MenuItem.Icon>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{StaticResource Icon_Delete}"
-							Fill="{StaticResource BtnBackground}"
-							Stretch="Fill" />
-                    </MenuItem.Icon>
-                </MenuItem>
-            </ContextMenu>
-        </DataGrid.ContextMenu>
-        <DataGrid.Columns>
-            <!--VmIsOnline-->
-            <DataGridTemplateColumn IsReadOnly="True" Header="在线">
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <WrapPanel 
-                            Visibility="{Binding VmIsOnlineVisible}" 
-                            Background="#01ffffff"
-                            ToolTip="{Binding VmIsOnlineText}">
+    <Grid>
+        <DataGrid 
+		    BorderThickness="0 1 0 0"
+            BorderBrush="{StaticResource LightLineColor}"
+		    IsReadOnly="True"
+		    SelectionMode="Extended"
+		    SelectionChanged="MinerClientsGrid_OnSelectionChanged"
+		    Sorting="DataGrid_OnSorting"
+		    HeadersVisibility="All"
+		    RowHeaderWidth="10"
+            EnableColumnVirtualization="{Binding IsEnableVirtualization}"
+            EnableRowVirtualization="{Binding IsEnableVirtualization}"
+		    FrozenColumnCount="{Binding FrozenColumnCount}"
+		    ItemsSource="{Binding MinerClients}"
+		    SelectedItem="{Binding CurrentMinerClient}"
+		    MouseDoubleClick="DataGrid_MouseDoubleClick"
+		    AutoGenerateColumns="False">
+            <DataGrid.Resources>
+                <controls:BindingProxy x:Key="proxy" Data="{Binding}" />
+            </DataGrid.Resources>
+            <DataGrid.ContextMenu>
+                <ContextMenu>
+                    <MenuItem Header="开始挖矿" Command="{Binding Data.StartMine,Source={StaticResource proxy}}">
+                        <MenuItem.Icon>
+                            <Path
+							    Width="16"
+							    Height="16"
+							    Data="{StaticResource Icon_Start}"
+							    Fill="{StaticResource BtnBackground}"
+							    Stretch="Fill" />
+                        </MenuItem.Icon>
+                    </MenuItem>
+                    <MenuItem Header="停止挖矿" Command="{Binding Data.StopMine,Source={StaticResource proxy}}">
+                        <MenuItem.Icon>
+                            <Path
+							    Width="16"
+							    Height="16"
+							    Data="{StaticResource Icon_Stop}"
+							    Fill="{StaticResource BtnBackground}"
+							    Stretch="Fill" />
+                        </MenuItem.Icon>
+                    </MenuItem>
+                    <MenuItem Header="重启电脑" Command="{Binding Data.RestartWindows,Source={StaticResource proxy}}">
+                        <MenuItem.Icon>
+                            <Path
+							    Width="16"
+							    Height="16"
+							    Data="{StaticResource Icon_Restart2}"
+							    Fill="{StaticResource BtnBackground}"
+							    Stretch="Fill" />
+                        </MenuItem.Icon>
+                    </MenuItem>
+                    <MenuItem Header="关闭电脑" Command="{Binding Data.ShutdownWindows,Source={StaticResource proxy}}">
+                        <MenuItem.Icon>
+                            <Path
+							    Width="16"
+							    Height="16"
+							    Data="{StaticResource Icon_Shutdown}"
+							    Fill="{StaticResource BtnBackground}"
+							    Stretch="Fill" />
+                        </MenuItem.Icon>
+                    </MenuItem>
+                    <MenuItem 
+                        Header="复制主币钱包" 
+                        Command="{Binding Data.CopyMainCoinWallet,Source={StaticResource proxy}}">
+                        <MenuItem.Icon>
                             <Path
-								Width="14"
-								Height="14"
-								Data="{StaticResource Icon_Online}"
-                                Visibility="{Binding VmIsOnline,Converter={StaticResource BoolToVisibilityConverter}}"
-								Fill="Green"
-								Stretch="Fill" />
+							    Width="16"
+							    Height="16"
+							    Data="{StaticResource Icon_Copy}"
+							    Fill="{StaticResource BtnBackground}"
+							    Stretch="Fill" />
+                        </MenuItem.Icon>
+                    </MenuItem>
+                    <MenuItem 
+                        Header="添加矿机" 
+                        Command="{Binding Data.AddMinerClient,Source={StaticResource proxy}}"
+                        Visibility="{Binding MainMenu.IsMinerStudioLocalVisible}">
+                        <MenuItem.Icon>
                             <Path
-								Width="14"
-								Height="14"
-								Data="{StaticResource Icon_Offline}"
-                                Visibility="{Binding VmIsOnline,Converter={StaticResource BoolToVisibilityInvertConverter}}"
-								Fill="Red"
-								Stretch="Fill" />
+							    Width="16"
+							    Height="16"
+							    Data="{StaticResource Icon_Add}"
+							    Fill="{StaticResource BtnBackground}"
+							    Stretch="Fill" />
+                        </MenuItem.Icon>
+                    </MenuItem>
+                    <MenuItem 
+                        Header="删除矿机" 
+                        Command="{Binding Data.RemoveMinerClients,Source={StaticResource proxy}}">
+                        <MenuItem.Icon>
+                            <Path
+							    Width="16"
+							    Height="16"
+							    Data="{StaticResource Icon_Delete}"
+							    Fill="{StaticResource BtnBackground}"
+							    Stretch="Fill" />
+                        </MenuItem.Icon>
+                    </MenuItem>
+                </ContextMenu>
+            </DataGrid.ContextMenu>
+            <DataGrid.Columns>
+                <!--VmIsOnline-->
+                <DataGridTemplateColumn IsReadOnly="True" Header="在线">
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <WrapPanel 
+                                Visibility="{Binding VmIsOnlineVisible}" 
+                                Background="#01ffffff"
+                                ToolTip="{Binding VmIsOnlineText}">
+                                <Path
+								    Width="14"
+								    Height="14"
+								    Data="{StaticResource Icon_Online}"
+                                    Visibility="{Binding VmIsOnline,Converter={StaticResource BoolToVisibilityConverter}}"
+								    Fill="Green"
+								    Stretch="Fill" />
+                                <Path
+								    Width="14"
+								    Height="14"
+								    Data="{StaticResource Icon_Offline}"
+                                    Visibility="{Binding VmIsOnline,Converter={StaticResource BoolToVisibilityInvertConverter}}"
+								    Fill="Red"
+								    Stretch="Fill" />
+                            </WrapPanel>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--LastActivedOnText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.LastActivedOnText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <StackPanel>
+                            <WrapPanel>
+                                <TextBlock Text="{x:Static vm:ColumnsShowViewModel.LAST_ACTIVED_ON_TEXT}"></TextBlock>
+                                <controls:KbButton
+								    ToolTip="不展示"
+								    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+								    CommandParameter="LastActivedOnText"
+								    Background="Transparent">
+                                    <WrapPanel>
+                                        <Path
+										    Width="14"
+										    Height="12"
+										    Data="{StaticResource Icon_Hide}"
+										    Fill="#FF5A5A5A"
+										    Stretch="Fill" />
+                                    </WrapPanel>
+                                </controls:KbButton>
+                                <TextBlock Margin="4 0 0 0" Text="{Binding Data.CountDown,Source={StaticResource proxy}}"></TextBlock>
+                            </WrapPanel>
+                        </StackPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <WrapPanel>
+                                <Border Width="10" Height="10" Background="{Binding IsMining,Converter={StaticResource BoolToBrushConverter}}" ToolTip="{Binding IsMiningText}"></Border>
+                                <TextBlock Text="{Binding LastActivedOnText}" Margin="4 0 0 0"></TextBlock>
+                            </WrapPanel>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--BootTimeSpanText-->
+                <DataGridTextColumn 
+				    Binding="{Binding BootTimeSpanText}"
+				    Visibility="{Binding Data.ColumnsShow.BootTimeSpanText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTextColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.BOOT_TIME_SPAN_TEXT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="BootTimeSpanText"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--LastActivedOnText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.LastActivedOnText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <StackPanel>
+                    </DataGridTextColumn.Header>
+                </DataGridTextColumn>
+                <!--MineTimeSpanText-->
+                <DataGridTextColumn 
+				    Binding="{Binding MineTimeSpanText}"
+				    Visibility="{Binding Data.ColumnsShow.MineTimeSpanText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTextColumn.Header>
                         <WrapPanel>
-                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.LAST_ACTIVED_ON_TEXT}"></TextBlock>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MINE_TIME_SPAN_TEXT}"></TextBlock>
                             <controls:KbButton
-								ToolTip="不展示"
-								Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-								CommandParameter="LastActivedOnText"
-								Background="Transparent">
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="MineTimeSpanText"
+							    Background="Transparent">
                                 <WrapPanel>
                                     <Path
-										Width="14"
-										Height="12"
-										Data="{StaticResource Icon_Hide}"
-										Fill="#FF5A5A5A"
-										Stretch="Fill" />
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
                                 </WrapPanel>
                             </controls:KbButton>
-                            <TextBlock Margin="4 0 0 0" Text="{Binding Data.CountDown,Source={StaticResource proxy}}"></TextBlock>
                         </WrapPanel>
-                    </StackPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
+                    </DataGridTextColumn.Header>
+                </DataGridTextColumn>
+                <!--Work-->
+                <DataGridTextColumn 
+				    Binding="{Binding SelectedMineWork.Name}"
+				    Visibility="{Binding Data.ColumnsShow.Work, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}" 
+				    IsReadOnly="True">
+                    <DataGridTextColumn.Header>
                         <WrapPanel>
-                            <Border Width="10" Height="10" Background="{Binding IsMining,Converter={StaticResource BoolToBrushConverter}}" ToolTip="{Binding IsMiningText}"></Border>
-                            <TextBlock Text="{Binding LastActivedOnText}" Margin="4 0 0 0"></TextBlock>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.WORK}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="Work"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--BootTimeSpanText-->
-            <DataGridTextColumn 
-				Binding="{Binding BootTimeSpanText}"
-				Visibility="{Binding Data.ColumnsShow.BootTimeSpanText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTextColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.BOOT_TIME_SPAN_TEXT}"></TextBlock>
+                    </DataGridTextColumn.Header>
+                </DataGridTextColumn>
+                <!--MinerGroup-->
+                <DataGridTextColumn 
+				    Binding="{Binding SelectedMinerGroup.Name}"
+				    Visibility="{Binding Data.ColumnsShow.MinerGroup,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTextColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MINER_GROUP}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="MinerGroup"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTextColumn.Header>
+                </DataGridTextColumn>
+                <!--MinerName-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.MinerName, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="BootTimeSpanText"
-							Background="Transparent">
+						    ToolTip="排序"
+                            Background="Transparent"
+                            Command="{Binding Data.SortByMinerName, Source={StaticResource proxy}}">
                             <WrapPanel>
+                                <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MINER_NAME}"></TextBlock>
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTextColumn.Header>
-            </DataGridTextColumn>
-            <!--MineTimeSpanText-->
-            <DataGridTextColumn 
-				Binding="{Binding MineTimeSpanText}"
-				Visibility="{Binding Data.ColumnsShow.MineTimeSpanText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTextColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MINE_TIME_SPAN_TEXT}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="MineTimeSpanText"
-							Background="Transparent">
-                            <WrapPanel>
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.MinerNameSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortAscending}"
+								    Fill="{Binding Data.IsSortByMinerName,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.MinerNameSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortDescending}"
+								    Fill="{Binding Data.IsSortByMinerName,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                             </WrapPanel>
                         </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTextColumn.Header>
-            </DataGridTextColumn>
-            <!--Work-->
-            <DataGridTextColumn 
-				Binding="{Binding SelectedMineWork.Name}"
-				Visibility="{Binding Data.ColumnsShow.Work, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}" 
-				IsReadOnly="True">
-                <DataGridTextColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.WORK}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="Work"
-							Background="Transparent">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBox IsReadOnly="True" BorderThickness="0" Text="{Binding MinerName,Mode=OneWay}"></TextBox>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--WorkerName-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.WorkerName, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="False">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.WORKER_NAME}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="WorkerName"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBox IsReadOnly="True" BorderThickness="0" Text="{Binding WorkerNameText,Mode=OneWay}"></TextBox>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--LocalIp-->
+                <DataGridTemplateColumn 
+                    Width="156"
+				    Visibility="{Binding Data.ColumnsShow.LocalIp, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.LOCAL_IP}" ToolTip="{x:Static vm:ColumnsShowViewModel.LOCAL_IP_TOOLTIP}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="LocalIp"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                                <controls:KbButton
+								    BorderThickness="0"
+								    Background="Transparent"
+								    Command="{Binding RemoteDesktop}"
+								    CornerRadius="2">
+                                    <Path
+									    Width="14"
+									    Height="14"
+									    Data="{StaticResource Icon_RemoteDesktop}"
+									    Fill="{StaticResource BtnBackground}"
+									    Stretch="Fill" />
+                                </controls:KbButton>
+                                <TextBox 
+								    ToolTip="双击连接远程桌面"
+								    BorderThickness="0"
+								    Background="Transparent"
+								    IsReadOnly="True"
+								    Text="{Binding LocalIp, Mode=OneWay}"></TextBox>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTextColumn.Header>
-            </DataGridTextColumn>
-            <!--MinerGroup-->
-            <DataGridTextColumn 
-				Binding="{Binding SelectedMinerGroup.Name}"
-				Visibility="{Binding Data.ColumnsShow.MinerGroup,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTextColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MINER_GROUP}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="MinerGroup"
-							Background="Transparent">
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--MinerIp-->
+                <DataGridTemplateColumn 
+                    Width="140"
+				    Visibility="{Binding Data.ColumnsShow.MinerIp, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MINER_IP}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="MinerIp"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBox 
+							    ToolTip="双击连接远程桌面"
+							    BorderThickness="0"
+							    Background="Transparent"
+							    IsReadOnly="True"
+							    Text="{Binding MinerIp, Mode=OneWay}"></TextBox>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--MACAddress-->
+                <DataGridTemplateColumn 
+                    Width="130"
+				    Visibility="{Binding Data.ColumnsShow.MACAddress,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAC_ADDRESS}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="MACAddress"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                                <TextBox 
+								    BorderThickness="0"
+								    Background="Transparent"
+								    IsReadOnly="True"
+								    Text="{Binding MACAddress, Mode=OneWay}"></TextBox>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTextColumn.Header>
-            </DataGridTextColumn>
-            <!--MinerName-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.MinerName, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <controls:KbButton
-						ToolTip="排序"
-                        Background="Transparent"
-                        Command="{Binding Data.SortByMinerName, Source={StaticResource proxy}}">
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IsOuterUserEnabled-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IsOuterUserEnabled,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MINER_NAME}"></TextBlock>
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.MinerNameSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortAscending}"
-								Fill="{Binding Data.IsSortByMinerName,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_OUTER_USER_ENABLED}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IsOuterUserEnabled"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.MinerNameSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortDescending}"
-								Fill="{Binding Data.IsSortByMinerName,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
+							    Width="16"
+							    Height="16"
+							    Data="{Binding IsOuterUserEnabled,Converter={StaticResource BoolToStreamGeometryConverter}}"
+							    Fill="{StaticResource LableColor}"
+							    Stretch="Fill" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--OuterUserId-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.OuterUserId,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.OUTER_USERID}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="OuterUserId"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </controls:KbButton>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBox IsReadOnly="True" BorderThickness="0" Text="{Binding MinerName,Mode=OneWay}"></TextBox>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--WorkerName-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.WorkerName, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="False">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.WORKER_NAME}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="WorkerName"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBox IsReadOnly="True" BorderThickness="0" Text="{Binding WorkerNameText,Mode=OneWay}"></TextBox>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--LocalIp-->
-            <DataGridTemplateColumn 
-                Width="156"
-				Visibility="{Binding Data.ColumnsShow.LocalIp, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.LOCAL_IP}" ToolTip="{x:Static vm:ColumnsShowViewModel.LOCAL_IP_TOOLTIP}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="LocalIp"
-							Background="Transparent">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                                <TextBlock 
+								    Background="Transparent"
+								    Text="{Binding OuterUserId, Mode=OneWay}"></TextBlock>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--WindowsLoginName-->
+                <DataGridTextColumn 
+				    Binding="{Binding WindowsLoginName}"
+				    Visibility="{Binding Data.ColumnsShow.WindowsLoginNameAndPassword,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="False">
+                    <DataGridTextColumn.Header>
                         <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.WINDOWS_LOGIN_NAME}"></TextBlock>
                             <controls:KbButton
-								BorderThickness="0"
-								Background="Transparent"
-								Command="{Binding RemoteDesktop}"
-								CornerRadius="2">
-                                <Path
-									Width="14"
-									Height="14"
-									Data="{StaticResource Icon_RemoteDesktop}"
-									Fill="{StaticResource BtnBackground}"
-									Stretch="Fill" />
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="WindowsLoginNameAndPassword"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
                             </controls:KbButton>
-                            <TextBox 
-								ToolTip="双击连接远程桌面"
-								BorderThickness="0"
-								Background="Transparent"
-								IsReadOnly="True"
-								Text="{Binding LocalIp, Mode=OneWay}"></TextBox>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--MinerIp-->
-            <DataGridTemplateColumn 
-                Width="140"
-				Visibility="{Binding Data.ColumnsShow.MinerIp, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MINER_IP}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="MinerIp"
-							Background="Transparent">
+                    </DataGridTextColumn.Header>
+                </DataGridTextColumn>
+                <!--WindowsLoginPassword-->
+                <DataGridTextColumn 
+				    Binding="{Binding WindowsPasswordStar}"
+				    Visibility="{Binding Data.ColumnsShow.WindowsLoginNameAndPassword,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="False">
+                    <DataGridTextColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.WINDOWS_LOGIN_PASSWORD}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="WindowsLoginNameAndPassword"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTextColumn.Header>
+                </DataGridTextColumn>
+                <!--GpuType-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.GpuType,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.GPU_TYPE}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="GpuType"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBox 
-							ToolTip="双击连接远程桌面"
-							BorderThickness="0"
-							Background="Transparent"
-							IsReadOnly="True"
-							Text="{Binding MinerIp, Mode=OneWay}"></TextBox>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--MACAddress-->
-            <DataGridTemplateColumn 
-                Width="130"
-				Visibility="{Binding Data.ColumnsShow.MACAddress,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAC_ADDRESS}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="MACAddress"
-							Background="Transparent">
-                            <WrapPanel>
+								    Margin="4 0 0 0"
+								    Width="18"
+								    Height="14"
+								    ToolTip="NVIDIA"
+								    Visibility="{Binding IsNvidiaIconVisible}"
+								    Data="{StaticResource Icon_Nvidia}"
+								    Fill="Green"
+								    Stretch="Fill" />
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+								    Margin="4 0 0 0"
+								    Width="16"
+								    Height="14"
+								    ToolTip="AMD"
+								    Visibility="{Binding IsAmdIconVisible}"
+								    Data="{StaticResource Icon_AMD}"
+								    Fill="Red"
+								    Stretch="Fill" />
+                                <TextBlock Text=" x "></TextBlock>
+                                <TextBlock Text="{Binding GpuCount}"></TextBlock>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--GpuInfo-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.GpuInfo,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBox 
-								BorderThickness="0"
-								Background="Transparent"
-								IsReadOnly="True"
-								Text="{Binding MACAddress, Mode=OneWay}"></TextBox>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.GPU_INFO}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="GpuInfo"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IsOuterUserEnabled-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IsOuterUserEnabled,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_OUTER_USER_ENABLED}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IsOuterUserEnabled"
-							Background="Transparent">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                                <TextBlock 
+								    Background="Transparent"
+								    ToolTip="{Binding GpuInfo}"
+								    Text="{Binding GpuInfo, Mode=OneWay}"></TextBlock>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{Binding IsOuterUserEnabled,Converter={StaticResource BoolToStreamGeometryConverter}}"
-							Fill="{StaticResource LableColor}"
-							Stretch="Fill" />
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--OuterUserId-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.OuterUserId,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.OUTER_USERID}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="OuterUserId"
-							Background="Transparent">
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--GpuDriver-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.GpuDriver,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.GPU_DRIVER}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="GpuDriver"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                                <TextBlock 
+								    Background="Transparent"
+								    Text="{Binding GpuDriver, Mode=OneWay}"></TextBlock>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--MainCoinCode-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.MainCoinCode, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBlock 
-								Background="Transparent"
-								Text="{Binding OuterUserId, Mode=OneWay}"></TextBlock>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_CODE}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="MainCoinCode"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--WindowsLoginName-->
-            <DataGridTextColumn 
-				Binding="{Binding WindowsLoginName}"
-				Visibility="{Binding Data.ColumnsShow.WindowsLoginNameAndPassword,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="False">
-                <DataGridTextColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.WINDOWS_LOGIN_NAME}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="WindowsLoginNameAndPassword"
-							Background="Transparent">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                                <TextBlock Text="{Binding MainCoinCode}"></TextBlock>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTextColumn.Header>
-            </DataGridTextColumn>
-            <!--WindowsLoginPassword-->
-            <DataGridTextColumn 
-				Binding="{Binding WindowsPasswordStar}"
-				Visibility="{Binding Data.ColumnsShow.WindowsLoginNameAndPassword,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="False">
-                <DataGridTextColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.WINDOWS_LOGIN_PASSWORD}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--MainCoinSpeedText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.MainCoinSpeedText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="WindowsLoginNameAndPassword"
-							Background="Transparent">
+						    ToolTip="排序"
+                            Background="Transparent"
+                            Command="{Binding Data.SortByMainCoinSpeed, Source={StaticResource proxy}}">
                             <WrapPanel>
+                                <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_SPEED_TEXT}"></TextBlock>
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTextColumn.Header>
-            </DataGridTextColumn>
-            <!--GpuType-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.GpuType,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.GPU_TYPE}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="GpuType"
-							Background="Transparent">
-                            <WrapPanel>
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.MainCoinSpeedSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberAscending}"
+								    Fill="{Binding Data.IsSortByMainCoinSpeed,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.MainCoinSpeedSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberDescending}"
+								    Fill="{Binding Data.IsSortByMainCoinSpeed,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                             </WrapPanel>
                         </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding MainCoinSpeedText}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--MainCoinRejectPercentText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.MainCoinRejectPercentText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <Path
-								Margin="4 0 0 0"
-								Width="18"
-								Height="14"
-								ToolTip="NVIDIA"
-								Visibility="{Binding IsNvidiaIconVisible}"
-								Data="{StaticResource Icon_Nvidia}"
-								Fill="Green"
-								Stretch="Fill" />
-                            <Path
-								Margin="4 0 0 0"
-								Width="16"
-								Height="14"
-								ToolTip="AMD"
-								Visibility="{Binding IsAmdIconVisible}"
-								Data="{StaticResource Icon_AMD}"
-								Fill="Red"
-								Stretch="Fill" />
-                            <TextBlock Text=" x "></TextBlock>
-                            <TextBlock Text="{Binding GpuCount}"></TextBlock>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_REJECT_PERCENT_TEXT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="MainCoinRejectPercentText"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--GpuInfo-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.GpuInfo,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.GPU_INFO}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="GpuInfo"
-							Background="Transparent">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                                <TextBlock Text="{Binding MainCoinRejectShare}"></TextBlock>
+                                <TextBlock Text="/"></TextBlock>
+                                <TextBlock Text="{Binding MainCoinTotalShare}"></TextBlock>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <WrapPanel>
-                            <TextBlock 
-								Background="Transparent"
-								ToolTip="{Binding GpuInfo}"
-								Text="{Binding GpuInfo, Mode=OneWay}"></TextBlock>
-                        </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--GpuDriver-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.GpuDriver,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.GPU_DRIVER}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--MainCoinRejectPercentText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.MainCoinRejectPercentText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="GpuDriver"
-							Background="Transparent">
+						    ToolTip="排序"
+                            Background="Transparent"
+                            Command="{Binding Data.SortByMainCoinRejectPercent, Source={StaticResource proxy}}">
                             <WrapPanel>
+                                <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_REJECT_PERCENT_TEXT}"></TextBlock>
+                                <Path
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.MainCoinRejectPercentSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberAscending}"
+								    Fill="{Binding Data.IsSortByMainCoinRejectPercent,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.MainCoinRejectPercentSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberDescending}"
+								    Fill="{Binding Data.IsSortByMainCoinRejectPercent,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                             </WrapPanel>
                         </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <WrapPanel>
-                            <TextBlock 
-								Background="Transparent"
-								Text="{Binding GpuDriver, Mode=OneWay}"></TextBlock>
-                        </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--MainCoinCode-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.MainCoinCode, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_CODE}"></TextBlock>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding MainCoinRejectPercentText}" Foreground="{Binding MainCoinRejectPercentForeground}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--MainCoinPoolDelay-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.MainCoinPoolDelay,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="MainCoinCode"
-							Background="Transparent">
+						    ToolTip="排序"
+                            Background="Transparent"
+                            Command="{Binding Data.SortByMainCoinPoolDelay, Source={StaticResource proxy}}">
                             <WrapPanel>
+                                <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_POOL_DELAY}"></TextBlock>
+                                <Path
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.MainCoinPoolDelaySortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberAscending}"
+								    Fill="{Binding Data.IsSortByMainCoinPoolDelay,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.MainCoinPoolDelaySortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberDescending}"
+								    Fill="{Binding Data.IsSortByMainCoinPoolDelay,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                             </WrapPanel>
                         </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding MainCoinPoolDelay}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--DualCoinCode-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.DualCoinCode,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBlock Text="{Binding MainCoinCode}"></TextBlock>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_CODE}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="DualCoinCode"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--MainCoinSpeedText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.MainCoinSpeedText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <controls:KbButton
-						ToolTip="排序"
-                        Background="Transparent"
-                        Command="{Binding Data.SortByMainCoinSpeed, Source={StaticResource proxy}}">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <WrapPanel Visibility="{Binding IsDualCoinEnabled, Converter={StaticResource BoolToVisibilityConverter}}">
+                                <TextBox 
+								    BorderThickness="0"
+								    Background="Transparent"
+								    IsReadOnly="True"
+								    Text="{Binding DualCoinCode, Mode=OneWay}"></TextBox>
+                            </WrapPanel>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--DualCoinSpeedText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.DualCoinSpeedText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_SPEED_TEXT}"></TextBlock>
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.MainCoinSpeedSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberAscending}"
-								Fill="{Binding Data.IsSortByMainCoinSpeed,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.MainCoinSpeedSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberDescending}"
-								Fill="{Binding Data.IsSortByMainCoinSpeed,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_SPEED_TEXT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="DualCoinSpeedText"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </controls:KbButton>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding MainCoinSpeedText}"></TextBlock>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--MainCoinRejectPercentText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.MainCoinRejectPercentText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_REJECT_PERCENT_TEXT}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="MainCoinRejectPercentText"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <WrapPanel Visibility="{Binding IsDualCoinEnabled, Converter={StaticResource BoolToVisibilityConverter}}">
+                                <TextBox 
+								    BorderThickness="0"
+								    Background="Transparent"
+								    IsReadOnly="True"
+								    Text="{Binding DualCoinSpeedText, Mode=OneWay}"></TextBox>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <WrapPanel>
-                            <TextBlock Text="{Binding MainCoinRejectShare}"></TextBlock>
-                            <TextBlock Text="/"></TextBlock>
-                            <TextBlock Text="{Binding MainCoinTotalShare}"></TextBlock>
-                        </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--MainCoinRejectPercentText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.MainCoinRejectPercentText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <controls:KbButton
-						ToolTip="排序"
-                        Background="Transparent"
-                        Command="{Binding Data.SortByMainCoinRejectPercent, Source={StaticResource proxy}}">
-                        <WrapPanel>
-                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_REJECT_PERCENT_TEXT}"></TextBlock>
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.MainCoinRejectPercentSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberAscending}"
-								Fill="{Binding Data.IsSortByMainCoinRejectPercent,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.MainCoinRejectPercentSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberDescending}"
-								Fill="{Binding Data.IsSortByMainCoinRejectPercent,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
-                        </WrapPanel>
-                    </controls:KbButton>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding MainCoinRejectPercentText}" Foreground="{Binding MainCoinRejectPercentForeground}"></TextBlock>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--MainCoinPoolDelay-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.MainCoinPoolDelay,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <controls:KbButton
-						ToolTip="排序"
-                        Background="Transparent"
-                        Command="{Binding Data.SortByMainCoinPoolDelay, Source={StaticResource proxy}}">
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--DualCoinRejectPercentText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.DualCoinRejectPercentText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_POOL_DELAY}"></TextBlock>
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.MainCoinPoolDelaySortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberAscending}"
-								Fill="{Binding Data.IsSortByMainCoinPoolDelay,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.MainCoinPoolDelaySortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberDescending}"
-								Fill="{Binding Data.IsSortByMainCoinPoolDelay,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_REJECT_PERCENT_TEXT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="DualCoinRejectPercentText"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </controls:KbButton>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding MainCoinPoolDelay}"></TextBlock>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--DualCoinCode-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.DualCoinCode,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_CODE}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="DualCoinCode"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <WrapPanel Visibility="{Binding IsDualCoinEnabled, Converter={StaticResource BoolToVisibilityConverter}}">
+                                <TextBlock Text="{Binding DualCoinRejectShare}"></TextBlock>
+                                <TextBlock Text="/"></TextBlock>
+                                <TextBlock Text="{Binding DualCoinTotalShare}"></TextBlock>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <WrapPanel Visibility="{Binding IsDualCoinEnabled, Converter={StaticResource BoolToVisibilityConverter}}">
-                            <TextBox 
-								BorderThickness="0"
-								Background="Transparent"
-								IsReadOnly="True"
-								Text="{Binding DualCoinCode, Mode=OneWay}"></TextBox>
-                        </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--DualCoinSpeedText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.DualCoinSpeedText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_SPEED_TEXT}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--DualCoinRejectPercentText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.DualCoinRejectPercentText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="DualCoinSpeedText"
-							Background="Transparent">
+						    ToolTip="排序"
+                            Background="Transparent"
+                            Command="{Binding Data.SortByDualCoinRejectPercent, Source={StaticResource proxy}}">
                             <WrapPanel>
+                                <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_REJECT_PERCENT_TEXT}"></TextBlock>
+                                <Path
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.DualCoinRejectPercentSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberAscending}"
+								    Fill="{Binding Data.IsSortByDualCoinRejectPercent,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.DualCoinRejectPercentSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberDescending}"
+								    Fill="{Binding Data.IsSortByDualCoinRejectPercent,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                             </WrapPanel>
                         </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <WrapPanel Visibility="{Binding IsDualCoinEnabled, Converter={StaticResource BoolToVisibilityConverter}}">
-                            <TextBox 
-								BorderThickness="0"
-								Background="Transparent"
-								IsReadOnly="True"
-								Text="{Binding DualCoinSpeedText, Mode=OneWay}"></TextBox>
-                        </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--DualCoinRejectPercentText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.DualCoinRejectPercentText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_REJECT_PERCENT_TEXT}"></TextBlock>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding DualCoinRejectPercentText}" Foreground="{Binding DualCoinRejectPercentForeground}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--DualCoinPoolDelay-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.DualCoinPoolDelay,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="DualCoinRejectPercentText"
-							Background="Transparent">
+						    ToolTip="排序"
+                            Background="Transparent"
+                            Command="{Binding Data.SortByDualCoinPoolDelay, Source={StaticResource proxy}}">
                             <WrapPanel>
+                                <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_POOL_DELAY}"></TextBlock>
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.DualCoinPoolDelaySortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberAscending}"
+								    Fill="{Binding Data.IsSortByDualCoinPoolDelay,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
+                                <Path
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.DualCoinPoolDelaySortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberDescending}"
+								    Fill="{Binding Data.IsSortByDualCoinPoolDelay,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                             </WrapPanel>
                         </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <WrapPanel Visibility="{Binding IsDualCoinEnabled, Converter={StaticResource BoolToVisibilityConverter}}">
-                            <TextBlock Text="{Binding DualCoinRejectShare}"></TextBlock>
-                            <TextBlock Text="/"></TextBlock>
-                            <TextBlock Text="{Binding DualCoinTotalShare}"></TextBlock>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding DualCoinPoolDelay}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--TotalPowerText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.TotalPowerText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.TOTAL_POWER_TEXT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="TotalPowerText"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--DualCoinRejectPercentText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.DualCoinRejectPercentText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <controls:KbButton
-						ToolTip="排序"
-                        Background="Transparent"
-                        Command="{Binding Data.SortByDualCoinRejectPercent, Source={StaticResource proxy}}">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding TotalPowerText}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--MaxTempText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.MaxTempText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_REJECT_PERCENT_TEXT}"></TextBlock>
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.DualCoinRejectPercentSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberAscending}"
-								Fill="{Binding Data.IsSortByDualCoinRejectPercent,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.DualCoinRejectPercentSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberDescending}"
-								Fill="{Binding Data.IsSortByDualCoinRejectPercent,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAX_TEMP_TEXT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="MaxTempText"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </controls:KbButton>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding DualCoinRejectPercentText}" Foreground="{Binding DualCoinRejectPercentForeground}"></TextBlock>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--DualCoinPoolDelay-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.DualCoinPoolDelay,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <controls:KbButton
-						ToolTip="排序"
-                        Background="Transparent"
-                        Command="{Binding Data.SortByDualCoinPoolDelay, Source={StaticResource proxy}}">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding GpuTableVm.MaxTempText}" Foreground="{Binding GpuTableVm.TempForeground}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IncomeMainCoinPerDayText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IncomeMainCoinPerDayText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_POOL_DELAY}"></TextBlock>
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.DualCoinPoolDelaySortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberAscending}"
-								Fill="{Binding Data.IsSortByDualCoinPoolDelay,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.DualCoinPoolDelaySortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberDescending}"
-								Fill="{Binding Data.IsSortByDualCoinPoolDelay,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.INCOME_MAIN_COIN_PER_DAY_TEXT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IncomeMainCoinPerDayText"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </controls:KbButton>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding DualCoinPoolDelay}"></TextBlock>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--TotalPowerText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.TotalPowerText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.TOTAL_POWER_TEXT}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="TotalPowerText"
-							Background="Transparent">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                                <TextBlock Text="{Binding IncomeMainCoinPerDayText}"></TextBlock>
+                                <TextBlock 
+								    Text="{Binding MainCoinCode}" 
+								    Margin="2 0 0 0"
+								    Padding="0"
+								    Foreground="{StaticResource LableColor}"></TextBlock>
+                                <TextBlock Text=", "></TextBlock>
+                                <TextBlock Text="{Binding IncomeMainCoinCnyPerDayText}"></TextBlock>
+                                <TextBlock 
+								    Text="¥" 
+								    Margin="2 0 0 0"
+								    Padding="0"
+								    Foreground="{StaticResource LableColor}"></TextBlock>
+                                <TextBlock Padding="1 0" Text="/" Foreground="{StaticResource LableColor}" />
+                                <TextBlock Padding="0" Text="天" Foreground="{StaticResource LableColor}" />
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding TotalPowerText}"></TextBlock>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--MaxTempText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.MaxTempText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAX_TEMP_TEXT}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="MaxTempText"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IncomeDualCoinPerDayText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IncomeDualCoinPerDayText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.INCOME_DUAL_COIN_PER_DAY_TEXT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IncomeDualCoinPerDayText"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <WrapPanel Visibility="{Binding IsDualCoinEnabled, Converter={StaticResource BoolToVisibilityConverter}}">
+                                <TextBlock Text="{Binding IncomeDualCoinPerDayText}"></TextBlock>
+                                <TextBlock 
+								    Text="{Binding DualCoinCode}" 
+								    Margin="2 0 0 0"
+								    Padding="0"
+								    Foreground="{StaticResource LableColor}"></TextBlock>
+                                <TextBlock Text=", "></TextBlock>
+                                <TextBlock Text="{Binding IncomeDualCoinCnyPerDayText}"></TextBlock>
+                                <TextBlock 
+								    Text="CNY" 
+								    Margin="2 0 0 0"
+								    Padding="0"
+								    Foreground="{StaticResource LableColor}"></TextBlock>
+                                <TextBlock Padding="1 0" Text="/" Foreground="{StaticResource LableColor}" />
+                                <TextBlock Padding="0" Text="天" Foreground="{StaticResource LableColor}" />
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding GpuTableVm.MaxTempText}" Foreground="{Binding GpuTableVm.TempForeground}"></TextBlock>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IncomeMainCoinPerDayText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IncomeMainCoinPerDayText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.INCOME_MAIN_COIN_PER_DAY_TEXT}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IncomeMainCoinPerDayText"
-							Background="Transparent">
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--MainCoinWallet-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.MainCoinWallet,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_WALLET}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="MainCoinWallet"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                                <TextBox 
+								    BorderThickness="0"
+								    Background="Transparent"
+								    Text="{Binding MainCoinWallet, Mode=OneWay}" 
+								    IsReadOnly="True"></TextBox>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--MainCoinPool-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.MainCoinPool,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBlock Text="{Binding IncomeMainCoinPerDayText}"></TextBlock>
-                            <TextBlock 
-								Text="{Binding MainCoinCode}" 
-								Margin="2 0 0 0"
-								Padding="0"
-								Foreground="{StaticResource LableColor}"></TextBlock>
-                            <TextBlock Text=", "></TextBlock>
-                            <TextBlock Text="{Binding IncomeMainCoinCnyPerDayText}"></TextBlock>
-                            <TextBlock 
-								Text="¥" 
-								Margin="2 0 0 0"
-								Padding="0"
-								Foreground="{StaticResource LableColor}"></TextBlock>
-                            <TextBlock Padding="1 0" Text="/" Foreground="{StaticResource LableColor}" />
-                            <TextBlock Padding="0" Text="天" Foreground="{StaticResource LableColor}" />
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_POOL}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="MainCoinPool"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IncomeDualCoinPerDayText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IncomeDualCoinPerDayText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.INCOME_DUAL_COIN_PER_DAY_TEXT}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IncomeDualCoinPerDayText"
-							Background="Transparent">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                                <TextBox 
+								    ToolTip="{Binding MainCoinPool}"
+								    BorderThickness="0"
+								    Background="Transparent"
+								    IsReadOnly="True"
+								    Text="{Binding MainCoinPool, Mode=OneWay}"></TextBox>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <WrapPanel Visibility="{Binding IsDualCoinEnabled, Converter={StaticResource BoolToVisibilityConverter}}">
-                            <TextBlock Text="{Binding IncomeDualCoinPerDayText}"></TextBlock>
-                            <TextBlock 
-								Text="{Binding DualCoinCode}" 
-								Margin="2 0 0 0"
-								Padding="0"
-								Foreground="{StaticResource LableColor}"></TextBlock>
-                            <TextBlock Text=", "></TextBlock>
-                            <TextBlock Text="{Binding IncomeDualCoinCnyPerDayText}"></TextBlock>
-                            <TextBlock 
-								Text="CNY" 
-								Margin="2 0 0 0"
-								Padding="0"
-								Foreground="{StaticResource LableColor}"></TextBlock>
-                            <TextBlock Padding="1 0" Text="/" Foreground="{StaticResource LableColor}" />
-                            <TextBlock Padding="0" Text="天" Foreground="{StaticResource LableColor}" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--Kernel-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.Kernel,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.KERNEL}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="Kernel"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--MainCoinWallet-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.MainCoinWallet,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_WALLET}"></TextBlock>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <WrapPanel>
+                                <TextBox 
+								    BorderThickness="0"
+								    Background="Transparent"
+								    IsReadOnly="True"
+								    Text="{Binding Kernel, Mode=OneWay}"></TextBox>
+                            </WrapPanel>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--KernelSelfRestartCount-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.KernelSelfRestartCount,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="MainCoinWallet"
-							Background="Transparent">
+						    ToolTip="排序"
+                            Background="Transparent"
+                            Command="{Binding Data.SortByKernelSelfRestartCount, Source={StaticResource proxy}}">
                             <WrapPanel>
+                                <TextBlock Text="{x:Static vm:ColumnsShowViewModel.KERNEL_SELF_RESTART_COUNT}"></TextBlock>
+                                <Path
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.KernelSelfRestartCountSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberAscending}"
+								    Fill="{Binding Data.IsSortByKernelSelfRestartCount,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.KernelSelfRestartCountSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberDescending}"
+								    Fill="{Binding Data.IsSortByKernelSelfRestartCount,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                             </WrapPanel>
                         </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <WrapPanel>
+                                <TextBox 
+								    BorderThickness="0"
+								    Background="Transparent"
+								    IsReadOnly="True"
+								    Text="{Binding KernelSelfRestartCount, Mode=OneWay}"></TextBox>
+                            </WrapPanel>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--DualCoinWallet-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.DualCoinWallet,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBox 
-								BorderThickness="0"
-								Background="Transparent"
-								Text="{Binding MainCoinWallet, Mode=OneWay}" 
-								IsReadOnly="True"></TextBox>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_WALLET}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="DualCoinWallet"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--MainCoinPool-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.MainCoinPool,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.MAIN_COIN_POOL}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="MainCoinPool"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <WrapPanel Visibility="{Binding IsDualCoinEnabled, Converter={StaticResource BoolToVisibilityConverter}}">
+                                <TextBox 
+								    BorderThickness="0"
+								    Background="Transparent"
+								    IsReadOnly="True"
+								    Text="{Binding DualCoinWallet, Mode=OneWay}"></TextBox>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--DualCoinPool-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.DualCoinPool,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBox 
-								ToolTip="{Binding MainCoinPool}"
-								BorderThickness="0"
-								Background="Transparent"
-								IsReadOnly="True"
-								Text="{Binding MainCoinPool, Mode=OneWay}"></TextBox>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_POOL}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="DualCoinPool"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--Kernel-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.Kernel,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.KERNEL}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="Kernel"
-							Background="Transparent">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                                <TextBox 
+								    ToolTip="{Binding DualCoinPool}"
+								    BorderThickness="0"
+								    Background="Transparent"
+								    IsReadOnly="True"
+								    Text="{Binding DualCoinPool, Mode=OneWay}"></TextBox>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--Version-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.Version,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBox 
-								BorderThickness="0"
-								Background="Transparent"
-								IsReadOnly="True"
-								Text="{Binding Kernel, Mode=OneWay}"></TextBox>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.VERSION}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="Version"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--KernelSelfRestartCount-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.KernelSelfRestartCount,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <controls:KbButton
-						ToolTip="排序"
-                        Background="Transparent"
-                        Command="{Binding Data.SortByKernelSelfRestartCount, Source={StaticResource proxy}}">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBox IsReadOnly="True" Background="Transparent" BorderThickness="0" Text="{Binding Version, Mode=OneWay}"></TextBox>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--OSName-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.OSName,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.KERNEL_SELF_RESTART_COUNT}"></TextBlock>
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.KernelSelfRestartCountSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberAscending}"
-								Fill="{Binding Data.IsSortByKernelSelfRestartCount,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
-                            <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.KernelSelfRestartCountSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberDescending}"
-								Fill="{Binding Data.IsSortByKernelSelfRestartCount,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.OS_NAME}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="OSName"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </controls:KbButton>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding OSName, Mode=OneWay}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--TotalPhysicalMemoryGbText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.TotalPhysicalMemoryGbText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBox 
-								BorderThickness="0"
-								Background="Transparent"
-								IsReadOnly="True"
-								Text="{Binding KernelSelfRestartCount, Mode=OneWay}"></TextBox>
-                        </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--DualCoinWallet-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.DualCoinWallet,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_WALLET}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="DualCoinWallet"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <WrapPanel Visibility="{Binding IsDualCoinEnabled, Converter={StaticResource BoolToVisibilityConverter}}">
-                            <TextBox 
-								BorderThickness="0"
-								Background="Transparent"
-								IsReadOnly="True"
-								Text="{Binding DualCoinWallet, Mode=OneWay}"></TextBox>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.TOTAL_PHYSICAL_MEMORY_GB_TEXT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="TotalPhysicalMemoryGbText"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--DualCoinPool-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.DualCoinPool,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DUAL_COIN_POOL}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="DualCoinPool"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding TotalPhysicalMemoryGbText, Mode=OneWay}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--OSVirtualMemoryGbText-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.OSVirtualMemoryGbText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBox 
-								ToolTip="{Binding DualCoinPool}"
-								BorderThickness="0"
-								Background="Transparent"
-								IsReadOnly="True"
-								Text="{Binding DualCoinPool, Mode=OneWay}"></TextBox>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.OS_VIRTUAL_MEMORY_GB_TEXT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="OSVirtualMemoryGbText"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--Version-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.Version,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.VERSION}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="Version"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBox IsReadOnly="True" Background="Transparent" BorderThickness="0" Text="{Binding Version, Mode=OneWay}"></TextBox>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--OSName-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.OSName,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.OS_NAME}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="OSName"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding OSName, Mode=OneWay}"></TextBlock>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--TotalPhysicalMemoryGbText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.TotalPhysicalMemoryGbText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.TOTAL_PHYSICAL_MEMORY_GB_TEXT}"></TextBlock>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding OSVirtualMemoryGbText, Mode=OneWay}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--DiskSpace-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.DiskSpace,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="TotalPhysicalMemoryGbText"
-							Background="Transparent">
+						    ToolTip="基于剩余空间最小的磁盘排序"
+                            Background="Transparent"
+                            Command="{Binding Data.SortByDiskSpace, Source={StaticResource proxy}}">
                             <WrapPanel>
+                                <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DISK_SPACE}"></TextBlock>
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding TotalPhysicalMemoryGbText, Mode=OneWay}"></TextBlock>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--OSVirtualMemoryGbText-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.OSVirtualMemoryGbText,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.OS_VIRTUAL_MEMORY_GB_TEXT}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="OSVirtualMemoryGbText"
-							Background="Transparent">
-                            <WrapPanel>
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.DiskSpaceSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberAscending}"
+								    Fill="{Binding Data.IsSortByDiskSpace,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.DiskSpaceSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberDescending}"
+								    Fill="{Binding Data.IsSortByDiskSpace,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                             </WrapPanel>
                         </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding OSVirtualMemoryGbText, Mode=OneWay}"></TextBlock>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--DiskSpace-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.DiskSpace,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <controls:KbButton
-						ToolTip="基于剩余空间最小的磁盘排序"
-                        Background="Transparent"
-                        Command="{Binding Data.SortByDiskSpace, Source={StaticResource proxy}}">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding DiskSpace, Mode=OneWay}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IsAutoBoot-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IsAutoBoot,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.DISK_SPACE}"></TextBlock>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_AUTO_BOOT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IsAutoBoot"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.DiskSpaceSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberAscending}"
-								Fill="{Binding Data.IsSortByDiskSpace,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
+							    Width="16"
+							    Height="16"
+							    Data="{Binding IsAutoBoot,Converter={StaticResource BoolToStreamGeometryConverter}}"
+							    Fill="{StaticResource LableColor}"
+							    Stretch="Fill" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IsAutoStart-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IsAutoStart,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_AUTO_START}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IsAutoStart"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.DiskSpaceSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberDescending}"
-								Fill="{Binding Data.IsSortByDiskSpace,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
+							    Width="16"
+							    Height="16"
+							    Data="{Binding IsAutoStart,Converter={StaticResource BoolToStreamGeometryConverter}}"
+							    Fill="{StaticResource LableColor}"
+							    Stretch="Fill" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--AutoStartDelaySeconds-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.AutoStartDelaySeconds,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.AUTO_START_DELAY_SECONDS}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="AutoStartDelaySeconds"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </controls:KbButton>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding DiskSpace, Mode=OneWay}"></TextBlock>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IsAutoBoot-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IsAutoBoot,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_AUTO_BOOT}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IsAutoBoot"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{Binding IsAutoBoot,Converter={StaticResource BoolToStreamGeometryConverter}}"
-							Fill="{StaticResource LableColor}"
-							Stretch="Fill" />
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IsAutoStart-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IsAutoStart,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_AUTO_START}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IsAutoStart"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{Binding IsAutoStart,Converter={StaticResource BoolToStreamGeometryConverter}}"
-							Fill="{StaticResource LableColor}"
-							Stretch="Fill" />
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--AutoStartDelaySeconds-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.AutoStartDelaySeconds,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.AUTO_START_DELAY_SECONDS}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="AutoStartDelaySeconds"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding AutoStartDelaySeconds}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IsAutoRestartKernel-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IsAutoRestartKernel,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_AUTO_RESTART_KERNEL}" ToolTip="如果内核进程意外消失,自动重启内核"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IsAutoRestartKernel"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{Binding IsAutoRestartKernel,Converter={StaticResource BoolToStreamGeometryConverter}}"
-							Fill="{StaticResource LableColor}"
-							Stretch="Fill" />
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--AutoRestartKernelTimes-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.AutoRestartKernelTimes,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.AUTO_RESTART_KERNEL_TIMES}" ToolTip="内核进程意外消失时尝试重启次数上限"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="AutoRestartKernelTimes"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding AutoRestartKernelTimes}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IsNoShareRestartKernel-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IsNoShareRestartKernel,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_NO_SHARE_RESTART_KERNEL}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IsNoShareRestartKernel"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{Binding IsNoShareRestartKernel,Converter={StaticResource BoolToStreamGeometryConverter}}"
-							Fill="{StaticResource LableColor}"
-							Stretch="Fill" />
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--NoShareRestartKernelMinutes-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.NoShareRestartKernelMinutes,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.NO_SHARE_RESTART_KERNEL_MINUTES}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="NoShareRestartKernelMinutes"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding NoShareRestartKernelMinutes}" />
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IsNoShareRestartComputer-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IsNoShareRestartComputer,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_NO_SHARE_RESTART_COMPUTER}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IsNoShareRestartComputer"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{Binding IsNoShareRestartComputer,Converter={StaticResource BoolToStreamGeometryConverter}}"
-							Fill="{StaticResource LableColor}"
-							Stretch="Fill" />
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--NoShareRestartComputerMinutes-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.NoShareRestartComputerMinutes,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.NO_SHARE_RESTART_COMPUTER_MINUTES}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="NoShareRestartComputerMinutes"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding NoShareRestartComputerMinutes}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IsPeriodicRestartKernel-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IsPeriodicRestartKernel,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_PERIODIC_RESTART_KERNEL}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IsPeriodicRestartKernel"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{Binding IsPeriodicRestartKernel,Converter={StaticResource BoolToStreamGeometryConverter}}"
-							Fill="{StaticResource LableColor}"
-							Stretch="Fill" />
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--PeriodicRestartKernelHours-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.PeriodicRestartKernelHours,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.PERIODIC_RESTART_KERNEL_HOURS}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="PeriodicRestartKernelHours"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding PeriodicRestartKernelHours}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--PeriodicRestartKernelMinutes-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.PeriodicRestartKernelMinutes,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.PERIODIC_RESTART_COMPUTER_MINUTES}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="PeriodicRestartKernelMinutes"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding PeriodicRestartKernelMinutes}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IsPeriodicRestartComputer-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IsPeriodicRestartComputer,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_PERIODIC_RESTART_COMPUTER}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IsPeriodicRestartComputer"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{Binding IsPeriodicRestartComputer,Converter={StaticResource BoolToStreamGeometryConverter}}"
-							Fill="{StaticResource LableColor}"
-							Stretch="Fill" />
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--PeriodicRestartComputerHours-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.PeriodicRestartComputerHours,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.PERIODIC_RESTART_COMPUTER_HOURS}"></TextBlock>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding AutoStartDelaySeconds}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IsAutoRestartKernel-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IsAutoRestartKernel,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_AUTO_RESTART_KERNEL}" ToolTip="如果内核进程意外消失,自动重启内核"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IsAutoRestartKernel"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <Path
+							    Width="16"
+							    Height="16"
+							    Data="{Binding IsAutoRestartKernel,Converter={StaticResource BoolToStreamGeometryConverter}}"
+							    Fill="{StaticResource LableColor}"
+							    Stretch="Fill" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--AutoRestartKernelTimes-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.AutoRestartKernelTimes,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.AUTO_RESTART_KERNEL_TIMES}" ToolTip="内核进程意外消失时尝试重启次数上限"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="AutoRestartKernelTimes"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding AutoRestartKernelTimes}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IsNoShareRestartKernel-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IsNoShareRestartKernel,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_NO_SHARE_RESTART_KERNEL}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IsNoShareRestartKernel"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <Path
+							    Width="16"
+							    Height="16"
+							    Data="{Binding IsNoShareRestartKernel,Converter={StaticResource BoolToStreamGeometryConverter}}"
+							    Fill="{StaticResource LableColor}"
+							    Stretch="Fill" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--NoShareRestartKernelMinutes-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.NoShareRestartKernelMinutes,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.NO_SHARE_RESTART_KERNEL_MINUTES}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="NoShareRestartKernelMinutes"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding NoShareRestartKernelMinutes}" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IsNoShareRestartComputer-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IsNoShareRestartComputer,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_NO_SHARE_RESTART_COMPUTER}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IsNoShareRestartComputer"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <Path
+							    Width="16"
+							    Height="16"
+							    Data="{Binding IsNoShareRestartComputer,Converter={StaticResource BoolToStreamGeometryConverter}}"
+							    Fill="{StaticResource LableColor}"
+							    Stretch="Fill" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--NoShareRestartComputerMinutes-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.NoShareRestartComputerMinutes,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.NO_SHARE_RESTART_COMPUTER_MINUTES}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="NoShareRestartComputerMinutes"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding NoShareRestartComputerMinutes}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IsPeriodicRestartKernel-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IsPeriodicRestartKernel,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_PERIODIC_RESTART_KERNEL}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IsPeriodicRestartKernel"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <Path
+							    Width="16"
+							    Height="16"
+							    Data="{Binding IsPeriodicRestartKernel,Converter={StaticResource BoolToStreamGeometryConverter}}"
+							    Fill="{StaticResource LableColor}"
+							    Stretch="Fill" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--PeriodicRestartKernelHours-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.PeriodicRestartKernelHours,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.PERIODIC_RESTART_KERNEL_HOURS}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="PeriodicRestartKernelHours"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding PeriodicRestartKernelHours}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--PeriodicRestartKernelMinutes-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.PeriodicRestartKernelMinutes,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.PERIODIC_RESTART_COMPUTER_MINUTES}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="PeriodicRestartKernelMinutes"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding PeriodicRestartKernelMinutes}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IsPeriodicRestartComputer-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IsPeriodicRestartComputer,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_PERIODIC_RESTART_COMPUTER}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IsPeriodicRestartComputer"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <Path
+							    Width="16"
+							    Height="16"
+							    Data="{Binding IsPeriodicRestartComputer,Converter={StaticResource BoolToStreamGeometryConverter}}"
+							    Fill="{StaticResource LableColor}"
+							    Stretch="Fill" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--PeriodicRestartComputerHours-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.PeriodicRestartComputerHours,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.PERIODIC_RESTART_COMPUTER_HOURS}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="PeriodicRestartComputerHours"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+								        Width="14"
+								        Height="12"
+								        Data="{StaticResource Icon_Hide}"
+								        Fill="#FF5A5A5A"
+								        Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding PeriodicRestartComputerHours}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--PeriodicRestartComputerMinutes-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.PeriodicRestartComputerMinutes,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.PERIODIC_RESTART_COMPUTER_MINUTES}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="PeriodicRestartComputerMinutes"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding PeriodicRestartComputerMinutes}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--CpuPerformance-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.CpuPerformance,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.CPU_PERFORMANCE}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="CpuPerformance"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding CpuPerformance}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--CpuTemperature-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.CpuTemperature,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="PeriodicRestartComputerHours"
-							Background="Transparent">
+						    ToolTip="排序"
+                            Background="Transparent"
+                            Command="{Binding Data.SortByCpuTemperature, Source={StaticResource proxy}}">
                             <WrapPanel>
+                                <TextBlock Text="{x:Static vm:ColumnsShowViewModel.CPU_TEMPERATURE}"></TextBlock>
                                 <Path
-								    Width="14"
-								    Height="12"
-								    Data="{StaticResource Icon_Hide}"
-								    Fill="#FF5A5A5A"
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.CpuTemperatureSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberAscending}"
+								    Fill="{Binding Data.IsSortByCpuTemperature,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
 								    Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding PeriodicRestartComputerHours}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--PeriodicRestartComputerMinutes-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.PeriodicRestartComputerMinutes,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.PERIODIC_RESTART_COMPUTER_MINUTES}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="PeriodicRestartComputerMinutes"
-							Background="Transparent">
-                            <WrapPanel>
                                 <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding PeriodicRestartComputerMinutes}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--CpuPerformance-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.CpuPerformance,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.CPU_PERFORMANCE}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="CpuPerformance"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+								    Width="12"
+								    Height="14"
+                                    Visibility="{Binding Data.CpuTemperatureSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
+								    Data="{StaticResource Icon_SortNumberDescending}"
+								    Fill="{Binding Data.IsSortByCpuTemperature,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
+								    Stretch="Fill" />
                             </WrapPanel>
                         </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding CpuPerformance}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--CpuTemperature-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.CpuTemperature,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <controls:KbButton
-						ToolTip="排序"
-                        Background="Transparent"
-                        Command="{Binding Data.SortByCpuTemperature, Source={StaticResource proxy}}">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding CpuTemperature}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IsRaiseHighCpuEvent-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IsRaiseHighCpuEvent,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
                         <WrapPanel>
-                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.CPU_TEMPERATURE}"></TextBlock>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_RAISE_HIGH_CPU_EVENT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IsRaiseHighCpuEvent"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.CpuTemperatureSortDirection,ConverterParameter=Ascending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberAscending}"
-								Fill="{Binding Data.IsSortByCpuTemperature,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
+							    Width="16"
+							    Height="16"
+							    Data="{Binding IsRaiseHighCpuEvent,Converter={StaticResource BoolToStreamGeometryConverter}}"
+							    Fill="{StaticResource LableColor}"
+							    Stretch="Fill" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--HighCpuPercent-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.HighCpuPercent,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.HIGH_CPU_PERCENT}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="HighCpuPercent"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding HighCpuPercent}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--HighCpuSeconds-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.HighCpuSeconds,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.HIGH_CPU_SECONDS}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="HighCpuSeconds"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding HighCpuSeconds}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IsAutoStopByCpu-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IsAutoStopByCpu,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_AUTO_STOP_BY_CPU}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IsAutoStopByCpu"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <Path
-								Width="12"
-								Height="14"
-                                Visibility="{Binding Data.CpuTemperatureSortDirection,ConverterParameter=Descending,Converter={StaticResource SortDirectionToVisibilityConverter},Source={StaticResource proxy}}"
-								Data="{StaticResource Icon_SortNumberDescending}"
-								Fill="{Binding Data.IsSortByCpuTemperature,Source={StaticResource proxy},Converter={StaticResource BoolToBrushConverter}}"
-								Stretch="Fill" />
+							    Width="16"
+							    Height="16"
+							    Data="{Binding IsAutoStopByCpu,Converter={StaticResource BoolToStreamGeometryConverter}}"
+							    Fill="{StaticResource LableColor}"
+							    Stretch="Fill" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--CpuGETemperatureSeconds-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.CpuGETemperatureSeconds,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.CPU_GE_TEMPERATURE_SECONDS}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="CpuGETemperatureSeconds"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
                         </WrapPanel>
-                    </controls:KbButton>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding CpuTemperature}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IsRaiseHighCpuEvent-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IsRaiseHighCpuEvent,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_RAISE_HIGH_CPU_EVENT}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IsRaiseHighCpuEvent"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{Binding IsRaiseHighCpuEvent,Converter={StaticResource BoolToStreamGeometryConverter}}"
-							Fill="{StaticResource LableColor}"
-							Stretch="Fill" />
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--HighCpuPercent-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.HighCpuPercent,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.HIGH_CPU_PERCENT}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="HighCpuPercent"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding HighCpuPercent}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--HighCpuSeconds-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.HighCpuSeconds,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.HIGH_CPU_SECONDS}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="HighCpuSeconds"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding HighCpuSeconds}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IsAutoStopByCpu-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IsAutoStopByCpu,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_AUTO_STOP_BY_CPU}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IsAutoStopByCpu"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <Path
-							Width="16"
-							Height="16"
-							Data="{Binding IsAutoStopByCpu,Converter={StaticResource BoolToStreamGeometryConverter}}"
-							Fill="{StaticResource LableColor}"
-							Stretch="Fill" />
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--CpuGETemperatureSeconds-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.CpuGETemperatureSeconds,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.CPU_GE_TEMPERATURE_SECONDS}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="CpuGETemperatureSeconds"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding CpuGETemperatureSeconds}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--CpuStopTemperature-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.CpuStopTemperature,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.CPU_STOP_TEMPERATURE}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="CpuStopTemperature"
-							Background="Transparent">
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding CpuGETemperatureSeconds}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--CpuStopTemperature-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.CpuStopTemperature,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.CPU_STOP_TEMPERATURE}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="CpuStopTemperature"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding CpuStopTemperature}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--IsAutoStartByCpu-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.IsAutoStartByCpu,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_AUTO_START_BY_CPU}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="IsAutoStartByCpu"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <Path
+							    Width="16"
+							    Height="16"
+							    Data="{Binding IsAutoStartByCpu,Converter={StaticResource BoolToStreamGeometryConverter}}"
+							    Fill="{StaticResource LableColor}"
+							    Stretch="Fill" />
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--CpuLETemperatureSeconds-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.CpuLETemperatureSeconds,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.CPU_LE_TEMPERATURE_SECONDS}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="CpuLETemperatureSeconds"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding CpuLETemperatureSeconds}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--CpuStartTemperature-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.CpuStartTemperature,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.CPU_START_TEMPERATURE}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="CpuStartTemperature"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding CpuStartTemperature}"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+                <!--KernelCommandLine-->
+                <DataGridTemplateColumn 
+				    Visibility="{Binding Data.ColumnsShow.KernelCommandLine,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
+				    IsReadOnly="True">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="{x:Static vm:ColumnsShowViewModel.KERNEL_COMMAND_LINE}"></TextBlock>
+                            <controls:KbButton
+							    ToolTip="不展示"
+							    Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
+							    CommandParameter="KernelCommandLine"
+							    Background="Transparent">
+                                <WrapPanel>
+                                    <Path
+									    Width="14"
+									    Height="12"
+									    Data="{StaticResource Icon_Hide}"
+									    Fill="#FF5A5A5A"
+									    Stretch="Fill" />
+                                </WrapPanel>
+                            </controls:KbButton>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
                             <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
+                                <TextBox 
+								    BorderThickness="0"
+								    Background="Transparent"
+								    IsReadOnly="True"
+								    ToolTip="{Binding KernelCommandLine}"
+								    Text="{Binding KernelCommandLine, Mode=OneWay}"></TextBox>
                             </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding CpuStopTemperature}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--IsAutoStartByCpu-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.IsAutoStartByCpu,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+        <Border 
+            Margin="0 26 0 0" 
+            Visibility="{Binding IsLoading,Converter={StaticResource BoolToVisibilityConverter}}" 
+            Background="#0f000000">
+            <Path 
+				Width="30"
+				Height="30"
+				Data="{StaticResource Icon_Loading}"
+				Fill="Black"
+				Stretch="Fill">
+                <Path.RenderTransform>
+                    <RotateTransform Angle="{Binding LoadingIconAngle}" CenterX="15" CenterY="15"></RotateTransform>
+                </Path.RenderTransform>
+            </Path>
+        </Border>
+        <WrapPanel VerticalAlignment="Center" HorizontalAlignment="Center" Visibility="{Binding IsNoRecordVisible}">
+            <TextBlock VerticalAlignment="Center" Foreground="Red" Text="没有记录"></TextBlock>
+            <WrapPanel Visibility="{Binding MainMenu.IsMinerStudioLocalVisible}">
+                <TextBlock VerticalAlignment="Center" Foreground="Red" Text=",请先添加矿机"></TextBlock>
+                <controls:KbButton Padding="4" Command="{Binding AddMinerClient}">
                     <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.IS_AUTO_START_BY_CPU}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="IsAutoStartByCpu"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
                         <Path
 							Width="16"
 							Height="16"
-							Data="{Binding IsAutoStartByCpu,Converter={StaticResource BoolToStreamGeometryConverter}}"
-							Fill="{StaticResource LableColor}"
+							Data="{StaticResource Icon_Add}"
+							Fill="{StaticResource BtnBackground}"
 							Stretch="Fill" />
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--CpuLETemperatureSeconds-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.CpuLETemperatureSeconds,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.CPU_LE_TEMPERATURE_SECONDS}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="CpuLETemperatureSeconds"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding CpuLETemperatureSeconds}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--CpuStartTemperature-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.CpuStartTemperature,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.CPU_START_TEMPERATURE}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="CpuStartTemperature"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
+                        <TextBlock>添加矿机</TextBlock>
                     </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding CpuStartTemperature}"/>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-            <!--KernelCommandLine-->
-            <DataGridTemplateColumn 
-				Visibility="{Binding Data.ColumnsShow.KernelCommandLine,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}"
-				IsReadOnly="True">
-                <DataGridTemplateColumn.Header>
-                    <WrapPanel>
-                        <TextBlock Text="{x:Static vm:ColumnsShowViewModel.KERNEL_COMMAND_LINE}"></TextBlock>
-                        <controls:KbButton
-							ToolTip="不展示"
-							Command="{Binding Data.ColumnsShow.Hide, Source={StaticResource proxy}}" 
-							CommandParameter="KernelCommandLine"
-							Background="Transparent">
-                            <WrapPanel>
-                                <Path
-									Width="14"
-									Height="12"
-									Data="{StaticResource Icon_Hide}"
-									Fill="#FF5A5A5A"
-									Stretch="Fill" />
-                            </WrapPanel>
-                        </controls:KbButton>
-                    </WrapPanel>
-                </DataGridTemplateColumn.Header>
-                <DataGridTemplateColumn.CellTemplate>
-                    <DataTemplate>
-                        <WrapPanel>
-                            <TextBox 
-								BorderThickness="0"
-								Background="Transparent"
-								IsReadOnly="True"
-								ToolTip="{Binding KernelCommandLine}"
-								Text="{Binding KernelCommandLine, Mode=OneWay}"></TextBox>
-                        </WrapPanel>
-                    </DataTemplate>
-                </DataGridTemplateColumn.CellTemplate>
-            </DataGridTemplateColumn>
-        </DataGrid.Columns>
-    </DataGrid>
+                </controls:KbButton>
+            </WrapPanel>
+        </WrapPanel>
+    </Grid>
 </UserControl>

+ 1 - 1
src/AppViews0/MinerStudio/Views/Ucs/MinerClientsPagging.xaml

@@ -43,7 +43,7 @@
             </Button>
             <Button Command="{Binding PageLast}" IsEnabled="{Binding IsPageDownEnabled}" Margin="4 0 0 0">尾页</Button>
             <TextBlock Style="{StaticResource LblTbBase}">第</TextBlock>
-            <TextBox VerticalContentAlignment="Center" Padding="4 0" Text="{Binding PageIndex}"></TextBox>
+            <TextBox VerticalContentAlignment="Center" Padding="4 0" Text="{Binding PageIndex}" KeyUp="TextBoxPageIndex_KeyUp"></TextBox>
             <TextBlock Style="{StaticResource LblTbBase}">/</TextBlock>
             <TextBlock Style="{StaticResource LblTbBase}" Text="{Binding PageCount}"></TextBlock>
             <TextBlock Style="{StaticResource LblTbBase}">页,每页</TextBlock>

+ 5 - 0
src/AppViews0/MinerStudio/Views/Ucs/MinerClientsPagging.xaml.cs

@@ -1,6 +1,7 @@
 using NTMiner.MinerStudio.Vms;
 using System.Windows;
 using System.Windows.Controls;
+using System.Windows.Input;
 
 namespace NTMiner.MinerStudio.Views.Ucs {
     public partial class MinerClientsPagging : UserControl {
@@ -36,5 +37,9 @@ namespace NTMiner.MinerStudio.Views.Ucs {
             }
             popup.IsOpen = true;
         }
+
+        public void TextBoxPageIndex_KeyUp(object sender, KeyEventArgs e) {
+            WpfUtil.TextBoxPageIndex_KeyUp(sender, e);
+        }
     }
 }

+ 2 - 1
src/AppViews0/MinerStudio/Views/Ucs/MinerClientsToolBar.xaml.cs

@@ -103,7 +103,7 @@ namespace NTMiner.MinerStudio.Views.Ucs {
                     }
                     DialogWindow.ShowSoftDialog(new DialogWindowViewModel(message: selectedResult.Description, title: $"确定将选中的矿机升级到{selectedResult.Version}吗?", onYes: () => {
                         foreach (var item in Vm.SelectedMinerClients) {
-                            MinerStudioService.Instance.UpgradeNTMinerAsync(item, selectedResult.FileName);
+                            MinerStudioRoot.MinerStudioService.UpgradeNTMinerAsync(item, selectedResult.FileName);
                         }
                     }));
                     popup.IsOpen = false;
@@ -117,6 +117,7 @@ namespace NTMiner.MinerStudio.Views.Ucs {
             }
             else {
                 ((NTMinerFileSelect)popup.Child).Vm.SelectedResult = null;
+                VirtualRoot.Execute(new RefreshNTMinerFileSetCommand());
             }
             popup.IsOpen = true;
         }

+ 8 - 1
src/AppViews0/MinerStudio/Views/Ucs/UserPage.xaml

@@ -215,6 +215,13 @@
                         </DataTemplate>
                     </DataGridTemplateColumn.CellTemplate>
                 </DataGridTemplateColumn>
+                <DataGridTemplateColumn Width="150" IsReadOnly="True" Header="最后登录时间">
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding LastLoginText}"></TextBlock>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
                 <DataGridTemplateColumn Width="*" IsReadOnly="True" Header="备注">
                     <DataGridTemplateColumn.CellTemplate>
                         <DataTemplate>
@@ -253,7 +260,7 @@
             </Button>
             <Button Command="{Binding PageLast}" IsEnabled="{Binding IsPageDownEnabled}" Margin="4 0 0 0">尾页</Button>
             <TextBlock Style="{StaticResource LblTbBase}">第</TextBlock>
-            <TextBox VerticalContentAlignment="Center" Padding="4 0" Text="{Binding PageIndex}"></TextBox>
+            <TextBox VerticalContentAlignment="Center" Padding="4 0" Text="{Binding PageIndex}" KeyUp="TextBoxPageIndex_KeyUp"></TextBox>
             <TextBlock Style="{StaticResource LblTbBase}">/</TextBlock>
             <TextBlock Style="{StaticResource LblTbBase}" Text="{Binding PageCount}"></TextBlock>
             <TextBlock Style="{StaticResource LblTbBase}">页,每页</TextBlock>

+ 5 - 0
src/AppViews0/MinerStudio/Views/Ucs/UserPage.xaml.cs

@@ -4,6 +4,7 @@ using NTMiner.Vms;
 using System.Linq;
 using System.Windows;
 using System.Windows.Controls;
+using System.Windows.Input;
 
 namespace NTMiner.MinerStudio.Views.Ucs {
     public partial class UserPage : UserControl {
@@ -51,5 +52,9 @@ namespace NTMiner.MinerStudio.Views.Ucs {
                 }, this.GetType());
             });
         }
+
+        public void TextBoxPageIndex_KeyUp(object sender, KeyEventArgs e) {
+            WpfUtil.TextBoxPageIndex_KeyUp(sender, e);
+        }
     }
 }

+ 1 - 1
src/AppViews0/MinerStudio/Views/Ucs/VirtualMemory.xaml.cs

@@ -20,7 +20,7 @@ namespace NTMiner.MinerStudio.Views.Ucs {
                 IsMaskTheParent = true,
                 FooterVisible = Visibility.Collapsed
             }, ucFactory: (window) => {
-                MinerStudioService.Instance.GetDrivesAsync(vm.MinerClientVm);
+                MinerStudioRoot.MinerStudioService.GetDrivesAsync(vm.MinerClientVm);
                 window.BuildEventPath<GetDrivesResponsedEvent>("收到了GetDrives的响应时绑定到界面", LogEnum.DevConsole, path: message => {
                     if (message.ClientId != vm.MinerClientVm.ClientId) {
                         return;

+ 45 - 22
src/AppViews0/MinerStudio/Views/Ucs/WsServerNodePage.xaml

@@ -11,7 +11,7 @@
     Background="White"
 	mc:Ignorable="d" 
     d:DesignHeight="400" 
-    d:DesignWidth="1800"
+    d:DesignWidth="1590"
     d:DataContext="{d:DesignData Source=../Design/WsServerNodePageViewModel.xaml}">
     <UserControl.Resources>
         <Style x:Key="LblTb" TargetType="TextBlock" BasedOn="{StaticResource LblTbBase}">
@@ -32,36 +32,54 @@
             <WrapPanel Margin="4">
                 <TextBlock Style="{StaticResource LblTb}">节点地址</TextBlock>
                 <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.Address}"></TextBlock>
-                <TextBlock Style="{StaticResource LblTb}">进程内存</TextBlock>
-                <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.ProcessMemoryMbText}"></TextBlock>
-                <TextBlock Style="{StaticResource LblTb}">进程线程数</TextBlock>
-                <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.ThreadCount}"></TextBlock>
-                <TextBlock Style="{StaticResource LblTb}">进程句柄数</TextBlock>
-                <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.HandleCount}"></TextBlock>
-                <TextBlock Style="{StaticResource LblTb}">总内存</TextBlock>
-                <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.TotalPhysicalMemory,Converter={StaticResource ByteToGbConverter}}"></TextBlock>
+                <TextBlock Style="{StaticResource LblTb}">CPU名称</TextBlock>
+                <TextBlock Width="320" Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.Cpu.Name}"></TextBlock>
                 <TextBlock Style="{StaticResource LblTb}">操作系统</TextBlock>
-                <TextBlock Width="300" Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.OSInfo}"></TextBlock>
+                <TextBlock Width="320" Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.OSInfo}"></TextBlock>
             </WrapPanel>
             <WrapPanel Margin="4 0 4 4">
+                <TextBlock Style="{StaticResource LblTb}">总内存</TextBlock>
+                <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.TotalPhysicalMemory,Converter={StaticResource ByteToGbConverter}}"></TextBlock>
                 <TextBlock Style="{StaticResource LblTb}">CPU核数</TextBlock>
                 <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.Cpu.NumberOfLogicalCores}"></TextBlock>
                 <TextBlock Style="{StaticResource LblTb}">CPU主频</TextBlock>
                 <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.Cpu.ClockSpeed}"></TextBlock>
                 <TextBlock Style="{StaticResource LblTb}">CPU架构</TextBlock>
                 <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.Cpu.ProcessorArchitecture}"></TextBlock>
+                <TextBlock Style="{StaticResource LblTb}">剩余磁盘</TextBlock>
+                <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.AvailableFreeSpaceInfo}"></TextBlock>
+            </WrapPanel>
+            <WrapPanel Margin="4 0 4 4">
+                <TextBlock Style="{StaticResource LblTb}">进程内存</TextBlock>
+                <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.ProcessMemoryMbText}"></TextBlock>
+                <TextBlock Style="{StaticResource LblTb}">进程线程数</TextBlock>
+                <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.ThreadCount}"></TextBlock>
+                <TextBlock Style="{StaticResource LblTb}">进程句柄数</TextBlock>
+                <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.HandleCount}"></TextBlock>
                 <TextBlock Style="{StaticResource LblTb}">CPU使用率</TextBlock>
                 <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.CpuPerformanceText}"></TextBlock>
                 <TextBlock Style="{StaticResource LblTb}">剩余内存</TextBlock>
                 <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.AvailablePhysicalMemory,Converter={StaticResource ByteToGbConverter}}"></TextBlock>
-                <TextBlock Style="{StaticResource LblTb}">CPU名称</TextBlock>
-                <TextBlock Width="300" Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.Cpu.Name}"></TextBlock>
+                <TextBlock Style="{StaticResource LblTb}">验证码数</TextBlock>
+                <TextBlock Style="{StaticResource TextBlock}" Text="{Binding WebApiServerStateVm.CaptchaCount}"></TextBlock>
             </WrapPanel>
         </StackPanel>
-		<DataGrid 
+        <Button
+			Width="26" Margin="4"
+            HorizontalAlignment="Right"
+            VerticalAlignment="Bottom"
+			Command="{Binding Refresh}">
+            <Path 
+				Width="14"
+				Height="14"
+				Stretch="Fill"
+				Fill="{StaticResource BtnBackground}"
+				Data="{StaticResource Icon_Refresh}"></Path>
+        </Button>
+        <DataGrid 
             Grid.Row="1"
 			Margin="0" 
-			ColumnHeaderHeight="32"
+			ColumnHeaderHeight="36"
             ItemsSource="{Binding WebApiServerStateVm.WsServerNodeVms}" 
 			BorderThickness="0 1 0 0"
             BorderBrush="{StaticResource LightLineColor}">
@@ -117,26 +135,31 @@
                 </DataGridTextColumn>
                 <DataGridTextColumn IsReadOnly="True" Width="60" Header="机器内存" Binding="{Binding TotalPhysicalMemory,Converter={StaticResource ByteToGbConverter}}">
                 </DataGridTextColumn>
-                <DataGridTextColumn IsReadOnly="True" Width="60" Binding="{Binding AvailablePhysicalMemory,Converter={StaticResource ByteToGbConverter}}">
-                    <DataGridTextColumn.Header>
-                        <TextBlock TextWrapping="Wrap">剩余机器内存</TextBlock>
-                    </DataGridTextColumn.Header>
+                <DataGridTextColumn IsReadOnly="True" Width="60" Header="剩余内存" Binding="{Binding AvailablePhysicalMemory,Converter={StaticResource ByteToGbConverter}}">
+                </DataGridTextColumn>
+                <DataGridTextColumn IsReadOnly="True" Width="70" Header="剩余磁盘" Binding="{Binding AvailableFreeSpaceInfo}">
                 </DataGridTextColumn>
                 <DataGridTextColumn IsReadOnly="True" Width="70" Binding="{Binding CpuPerformanceText}">
                     <DataGridTextColumn.Header>
                         <TextBlock TextWrapping="Wrap">机器CPU使用率</TextBlock>
                     </DataGridTextColumn.Header>
                 </DataGridTextColumn>
-                <DataGridTextColumn IsReadOnly="True" Width="306" Header="CPU名称" Binding="{Binding CpuVm.Name}">
-                </DataGridTextColumn>
                 <DataGridTextColumn IsReadOnly="True" Width="60" Header="CPU核数" Binding="{Binding CpuVm.NumberOfLogicalCores}">
                 </DataGridTextColumn>
                 <DataGridTextColumn IsReadOnly="True" Width="70" Header="CPU主频" Binding="{Binding CpuVm.ClockSpeed}">
                 </DataGridTextColumn>
                 <DataGridTextColumn IsReadOnly="True" Width="60" Header="CPU架构" Binding="{Binding CpuVm.ProcessorArchitecture}">
                 </DataGridTextColumn>
-                <DataGridTextColumn IsReadOnly="True" Width="280" Header="操作系统" Binding="{Binding OSInfo}">
-                </DataGridTextColumn>
+                <DataGridTemplateColumn IsReadOnly="True" Width="280" Header="操作系统/CPU名称">
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <StackPanel>
+                                <TextBlock Text="{Binding OSInfo}" FontSize="10"></TextBlock>
+                                <TextBlock Text="{Binding CpuVm.Name}" FontSize="10"></TextBlock>
+                            </StackPanel>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
                 <DataGridTextColumn Width="*" IsReadOnly="True" Header="备注" Binding="{Binding Description}">
 				</DataGridTextColumn>
 			</DataGrid.Columns>

+ 2 - 2
src/AppViews0/MinerStudio/Views/Ucs/WsServerNodePage.xaml.cs

@@ -10,7 +10,7 @@ namespace NTMiner.MinerStudio.Views.Ucs {
             ContainerWindow.ShowWindow(new ContainerWindowViewModel {
                 Title = "外网群控websocket服务器节点",
                 IconName = "Icon_Server",
-                Width = 1800,
+                Width = 1590,
                 Height = 400,
                 IsMaskTheParent = false,
                 IsChildWindow = true,
@@ -30,7 +30,7 @@ namespace NTMiner.MinerStudio.Views.Ucs {
             InitializeComponent();
             this.OnLoaded(window => {
                 window.BuildEventPath<Per20SecondEvent>("外网群控服务器节点列表页面打开着时周期刷新", LogEnum.None, path: message => {
-                    Vm.Refresh();
+                    Vm.DoRefresh();
                 }, this.GetType());
             });
         }

+ 4 - 14
src/AppViews0/Views/MainWindow.xaml

@@ -172,15 +172,6 @@
 						Foreground="{StaticResource ThemeForeground}"
                         Content="TestHost">
                     </CheckBox>
-                    <CheckBox 
-                        Margin="0 0 12 0"
-						FocusVisualStyle="{x:Null}"
-						Visibility="{x:Static app:AppStatic.IsDevModeVisible}"
-						Cursor="Hand"
-						Foreground="{StaticResource ThemeForeground}"
-						IsChecked="{Binding IsUseDevConsole}">
-                        <TextBlock Text="DevConsole" Foreground="{StaticResource ThemeForeground}"></TextBlock>
-                    </CheckBox>
                     <WrapPanel 
                         Margin="0 0 20 0" 
                         VerticalAlignment="Center"
@@ -246,19 +237,18 @@
                     <ColumnDefinition x:Name="LeftDrawerGrip" Width="16"></ColumnDefinition>
                     <ColumnDefinition Width="*"></ColumnDefinition>
                 </Grid.ColumnDefinitions>
-                <StackPanel 
-                    Background="White">
+                <StackPanel Background="White">
                     <StackPanel.LayoutTransform>
-                        <RotateTransform Angle="-90"/>
+                        <RotateTransform Angle="90"/>
                     </StackPanel.LayoutTransform>
                     <controls:KbButton 
                         x:Name="BtnLeftDrawerGrip"
-                        HorizontalAlignment="Right"
+                        HorizontalAlignment="Left"
                         Height="16"
                         Padding="4 0" 
                         BorderThickness="0"
+                        Background="#2D2D30"
                         Foreground="White"
-                        Background="Black"
                         Click="BtnLeftDrawerGrip_Click"
                         MouseDoubleClick="BtnLeftDrawerGrip_MouseDoubleClick"
                         Content="开始挖矿">

+ 36 - 9
src/AppViews0/Views/MainWindow.xaml.cs

@@ -126,8 +126,16 @@ namespace NTMiner.Views {
                 MoveConsoleWindow();
                 #endregion
             };
+            bool isLeftClosed = false;
             this.ConsoleRectangle.IsVisibleChanged += (sender, e) => {
-                MoveConsoleWindow();
+                if (this.ConsoleRectangle.IsVisible) {
+                    if (isLeftClosed != (LeftDrawerGrip.Width == _leftDrawerGripWidth)) {
+                        ConsoleWindowFit();
+                    }
+                }
+                else {
+                    isLeftClosed = LeftDrawerGrip.Width == _leftDrawerGripWidth;
+                }
             };
             this.ConsoleRectangle.SizeChanged += (s, e) => {
                 MoveConsoleWindow();
@@ -142,7 +150,7 @@ namespace NTMiner.Views {
                     this.BtnAboutNTMiner.Visibility = Visibility.Collapsed;
                 }
                 else {
-                    this.OpenLeftDrawer();
+                    this.OpenLeftDrawer(isSizeChanged: true);
                     this.BtnAboutNTMiner.Visibility = Visibility.Visible;
                 }
                 if (!this.ConsoleRectangle.IsVisible) {
@@ -236,16 +244,22 @@ namespace NTMiner.Views {
                 }
             }
             if (ConsoleRectangle != null && ConsoleRectangle.IsVisible) {
-                Point point = ConsoleRectangle.TransformToAncestor(this).Transform(new Point(0, 0));
-                const int paddingLeft = 4;
-                const int paddingRight = 5;
-                int marginLeft = paddingLeft + (int)point.X;
-                int width = (int)this.ActualWidth - marginLeft - paddingRight;
-                consoleWindow.MoveWindow(marginLeft: marginLeft, marginTop: (int)point.Y, width, height: (int)ConsoleRectangle.ActualHeight);
+                GetMoveToValues(out int marginLeft, out int marginTop, out int width, out int height);
+                consoleWindow.MoveWindow(marginLeft: marginLeft, marginTop: marginTop, width, height: height);
             }
         }
         #endregion
 
+        private void GetMoveToValues(out int marginLeft, out int marginTop, out int width, out int height) {
+            Point point = ConsoleRectangle.TransformToAncestor(this).Transform(new Point(0, 0));
+            const int paddingLeft = 4;
+            const int paddingRight = 5;
+            marginLeft = paddingLeft + (int)point.X;
+            marginTop = (int)point.Y;
+            width = (int)this.ActualWidth - marginLeft - paddingRight;
+            height = (int)ConsoleRectangle.ActualHeight;
+        }
+
         #region 显示或隐藏半透明遮罩层
         // 因为挖矿端主界面是透明的,遮罩方法和普通窗口不同,如果按照通用的方法遮罩的话会导致能透过窗口看见windows桌面或者下面的窗口。
         public void ShowMask() {
@@ -304,7 +318,7 @@ namespace NTMiner.Views {
         }
 
         // 关闭左侧抽屉
-        private void OpenLeftDrawer() {
+        private void OpenLeftDrawer(bool isSizeChanged = false) {
             if (LeftDrawerGrip.Width != _leftDrawerGripWidth) {
                 return;
             }
@@ -316,6 +330,19 @@ namespace NTMiner.Views {
                 mainLayer.ColumnDefinitions.Insert(0, MinerProfileColumn);
             }
             MainTabControl.SetValue(Grid.ColumnProperty, mainLayer.ColumnDefinitions.Count - 1);
+            if (!isSizeChanged) {
+                50.MillisecondsDelay().ContinueWith(t => {
+                    UIThread.Execute(ConsoleWindowFit);
+                });
+            }
+        }
+
+        private void ConsoleWindowFit() {
+            if (MainTabControl.SelectedItem == ConsoleTabItem) {
+                GetMoveToValues(out int marginLeft, out int marginTop, out int width, out int height);
+                // 这样操作一次以去除控制台窗口底部的滚动条
+                ConsoleWindow.Instance.MoveWindow(marginLeft: marginLeft, marginTop: marginTop - 1, width, height: height + 1);
+            }
         }
 
         private void HideLeftDrawerGrid() {

+ 2 - 2
src/AppViews0/Views/Ucs/AboutPage.xaml

@@ -48,12 +48,12 @@
             <TextBlock Margin="70 0 0 0" FontSize="15" Padding="0 4">2,开源矿工永远开源;</TextBlock>
             <TextBlock Margin="70 0 0 0" FontSize="15" Padding="0 4">3,开源矿工永不破解国人开发的内核;</TextBlock>
             <controls:KbLinkButton
-                Margin="70 0 0 0" FontSize="15" Padding="0 4"
+                Margin="70 0 0 0" FontSize="15"
 				Command="{x:Static app:AppStatic.BusinessModel}"
 				KbDisplayLine="False"
 				HorizontalAlignment="Left"
 				Background="Transparent">
-                <TextBlock Text="4,如何盈利/商业模式"></TextBlock>
+                <TextBlock Text="4,如何盈利/商业逻辑"></TextBlock>
             </controls:KbLinkButton>
         </StackPanel>
         <WrapPanel Grid.Row="2" HorizontalAlignment="Center">

+ 16 - 1
src/AppViews0/Views/Ucs/AppMiner.xaml

@@ -63,13 +63,28 @@
             <controls:KbMuiltilineTextBox 
 				Background="Transparent"
 				FontFamily="Courier New"
-				Padding="10 2 4 2"
+				Padding="10 2 22 2"
 				ToolTip="参数总成。这是高级用户的工具,通常我们无需关心这一块。"
 				BorderThickness="0"
 				Foreground="LightGray"						
 				IsReadOnly="True" 
 				FontSize="14"
 				Text="{Binding MinerProfile.ArgsAssembly, Mode=OneWay}"></controls:KbMuiltilineTextBox>
+            <StackPanel Margin="4 0" VerticalAlignment="Top" HorizontalAlignment="Right">
+                <controls:KbButton 
+                    Margin="0 4 0 0"
+					Padding="2"
+					ToolTip="复制命令行"
+					Background="Transparent" BorderThickness="0"
+					Command="{Binding MinerProfile.CopyArgsAssembly}">
+                    <Path
+						Width="14"
+						Height="14"
+						Data="{StaticResource Icon_Copy}"
+						Fill="White"
+						Stretch="Fill" />
+                </controls:KbButton>
+            </StackPanel>
         </Grid>
         <StackPanel Grid.Row="2">
             <WrapPanel Visibility="{Binding MinerProfile.CoinVm.Notice, Converter={StaticResource NotNullOrEmptyVisibilityConverter}}">

+ 0 - 3
src/AppViews0/Views/Ucs/CoinPage.xaml

@@ -160,7 +160,6 @@
 							<DataTemplate>
 								<controls:KbLinkButton
 									VerticalAlignment="Center"
-									Padding="0"
 									Visibility="{Binding TutorialUrl,Converter={StaticResource NotNullOrEmptyVisibilityConverter}}"
 									Command="{x:Static app:AppStatic.ViewUrl}"
 									CommandParameter="{Binding TutorialUrl}"
@@ -299,7 +298,6 @@
 									<DataTemplate>
                                         <WrapPanel>
                                             <controls:KbLinkButton
-									            Padding="0"
 								                Command="{x:Static app:AppStatic.ViewUrl}"
 								                CommandParameter="{Binding Website}"
 									            KbDisplayLine="False"
@@ -356,7 +354,6 @@
 									<DataTemplate>
 										<controls:KbLinkButton
 											VerticalAlignment="Center"
-											Padding="0"
 											Visibility="{Binding TutorialUrl,Converter={StaticResource NotNullOrEmptyVisibilityConverter}}"
 											Command="{x:Static app:AppStatic.ViewUrl}"
 											CommandParameter="{Binding TutorialUrl}"

+ 4 - 3
src/AppViews0/Views/Ucs/InnerProperty.xaml.cs

@@ -1,5 +1,4 @@
-using NTMiner.Core;
-using NTMiner.Vms;
+using NTMiner.Vms;
 using System.Windows.Controls;
 
 namespace NTMiner.Views.Ucs {
@@ -15,7 +14,9 @@ namespace NTMiner.Views.Ucs {
             InitializeComponent();
             this.OnLoaded(window => {
                 window.BuildEventPath<ServerJsonVersionChangedEvent>("刷新展示的ServerJsonVersion", LogEnum.DevConsole, path: message => {
-                    Vm.ServerJsonVersion = NTMinerContext.Instance.GetServerJsonVersion();
+                    if (message.IsChagned) {
+                        Vm.ServerJsonVersion = message.NewVersion;
+                    }
                 }, location: this.GetType());
             });
         }

+ 83 - 53
src/AppViews0/Views/Ucs/KernelOutputEdit.xaml

@@ -18,12 +18,15 @@
 			<Setter Property="Foreground" Value="{StaticResource LableColor}"></Setter>
 			<Setter Property="FontSize" Value="12"></Setter>
 			<Setter Property="Padding" Value="0 0 2 0"></Setter>
-			<Setter Property="Width" Value="150"></Setter>
+			<Setter Property="Width" Value="156"></Setter>
 			<Setter Property="VerticalAlignment" Value="Center"></Setter>
 			<Setter Property="TextAlignment" Value="Right"></Setter>
 			<Setter Property="TextWrapping" Value="Wrap"></Setter>
-		</Style>
-		<Style x:Key="TbRegex" TargetType="TextBox">
+        </Style>
+        <Style x:Key="LblTb1" TargetType="TextBlock" BasedOn="{StaticResource LblTb}">
+            <Setter Property="Width" Value="150"></Setter>
+        </Style>
+        <Style x:Key="TbRegex" TargetType="TextBox">
 			<Setter Property="Width" Value="600"></Setter>
 			<Setter Property="Height" Value="26"></Setter>
 			<Setter Property="VerticalContentAlignment" Value="Center"></Setter>
@@ -57,56 +60,83 @@
 					</WrapPanel>
 				</GroupBox.Header>
 				<StackPanel>
-					<WrapPanel Margin="0 2">
-						<TextBlock Style="{StaticResource LblTb}" Text="总算力正则"></TextBlock>
-                        <TextBox Style="{StaticResource TbRegex}" Text="{Binding TotalSpeedPattern}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
-						</TextBox>
-					</WrapPanel>
-					<WrapPanel Margin="0 2">
-						<TextBlock Style="{StaticResource LblTb}" Text="总份额正则"></TextBlock>
-                        <TextBox Style="{StaticResource TbRegex}" Text="{Binding TotalSharePattern}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
-						</TextBox>
-					</WrapPanel>
-					<WrapPanel Margin="0 2">
-						<TextBlock Style="{StaticResource LblTb}" Text="矿池接受份额正则"></TextBlock>
-                        <TextBox Style="{StaticResource TbRegex}" Text="{Binding AcceptSharePattern}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
-						</TextBox>
-                    </WrapPanel>
-                    <WrapPanel Margin="0 2">
-                        <TextBlock Style="{StaticResource LblTb}" Text="显卡找到一个份额正则"></TextBlock>
-                        <TextBox Style="{StaticResource TbRegex}" Text="{Binding FoundOneShare}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
-                        </TextBox>
-                    </WrapPanel>
-                    <WrapPanel Margin="0 2">
-                        <TextBlock Style="{StaticResource LblTb}" Text="显卡算出一个错误结果正则"></TextBlock>
-                        <TextBox Style="{StaticResource TbRegex}" Text="{Binding GpuGotOneIncorrectShare}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
-                        </TextBox>
-                    </WrapPanel>
-                    <WrapPanel Margin="0 2">
-						<TextBlock Style="{StaticResource LblTb}" Text="矿池接受一个份额正则"></TextBlock>
-                        <TextBox Style="{StaticResource TbRegex}" Text="{Binding AcceptOneShare}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
-						</TextBox>
-					</WrapPanel>
-					<WrapPanel Margin="0 2">
-						<TextBlock Style="{StaticResource LblTb}" Text="矿池拒绝份额正则"></TextBlock>
-                        <TextBox Style="{StaticResource TbRegex}" Text="{Binding RejectSharePattern}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
-						</TextBox>
-					</WrapPanel>
-					<WrapPanel Margin="0 2">
-						<TextBlock Style="{StaticResource LblTb}" Text="矿池拒绝一个份额正则"></TextBlock>
-                        <TextBox Style="{StaticResource TbRegex}" Text="{Binding RejectOneShare}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
-						</TextBox>
-					</WrapPanel>
-					<WrapPanel Margin="0 2">
-						<TextBlock Style="{StaticResource LblTb}" Text="拒绝率正则"></TextBlock>
-                        <TextBox Style="{StaticResource TbRegex}" Text="{Binding RejectPercentPattern}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
-						</TextBox>
-					</WrapPanel>
-					<WrapPanel Margin="0 2">
-						<TextBlock Style="{StaticResource LblTb}" Text="单卡算力正则"></TextBlock>
-                        <TextBox Style="{StaticResource TbRegex}" Text="{Binding GpuSpeedPattern}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
-						</TextBox>						
-					</WrapPanel>
+                    <GroupBox Header="总">
+                        <StackPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="总算力正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding TotalSpeedPattern}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="总份额正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding TotalSharePattern}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="矿池接受份额正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding AcceptSharePattern}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="矿池拒绝份额正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding RejectSharePattern}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="拒绝率正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding RejectPercentPattern}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                        </StackPanel>
+                    </GroupBox>
+                    <GroupBox Header="一个">
+                        <StackPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="显卡找到一个份额正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding FoundOneShare}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="显卡算出一个错误结果正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding GpuGotOneIncorrectShare}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="矿池接受一个份额正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding AcceptOneShare}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="矿池拒绝一个份额正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding RejectOneShare}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                        </StackPanel>
+                    </GroupBox>
+                    <GroupBox Header="单卡">
+                        <StackPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="单卡算力正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding GpuSpeedPattern}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="单卡接受份额正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding GpuAcceptShare}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="单卡拒绝份额正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding GpuRejectShare}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                            <WrapPanel Margin="0 2">
+                                <TextBlock Style="{StaticResource LblTb1}" Text="单卡错误份额正则"></TextBlock>
+                                <TextBox Style="{StaticResource TbRegex}" Text="{Binding GpuIncorrectShare}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}">
+                                </TextBox>
+                            </WrapPanel>
+                        </StackPanel>
+                    </GroupBox>
                     <WrapPanel Margin="0 2">
                         <TextBlock Style="{StaticResource LblTb}">GPU序号序基</TextBlock>
                         <TextBox Width="120" Text="{Binding GpuBaseIndex}" IsReadOnly="{x:Static app:AppStatic.IsNotDevMode}"></TextBox>

+ 1 - 1
src/AppViews0/Views/Ucs/KernelOutputKeywords.xaml

@@ -44,7 +44,7 @@
                                     Visibility="{x:Static app:AppStatic.IsDevModeVisible}"
                                     IsEnabled="{Binding IsReadOnly,Converter={StaticResource BoolInvertConverter}}"
 									Margin="2 0"
-									Command="{Binding ToGlobal}" Background="Transparent" BorderThickness="0"
+									Command="{Binding ToServer}" Background="Transparent" BorderThickness="0"
 									CornerRadius="2" ToolTip="Profile->Global:发送给服务器并删除本地">
                                     <WrapPanel>
                                         <Path

+ 21 - 0
src/AppViews0/Views/Ucs/MainMenu.xaml

@@ -84,6 +84,17 @@
 							Stretch="Fill" />
                     </MenuItem.Icon>
                 </MenuItem>
+                <MenuItem Header="Costura Dlls" Command="{x:Static app:AppStatic.ExtractCosturaCompressedDlls}"
+                          ToolTip="解压缩出来入口程序集中的被Fody Costura压缩的dll保存在磁盘上以供阅读,保存在家目录的costura文件夹下。">
+                    <MenuItem.Icon>
+                        <Path
+							Width="14"
+							Height="14"
+							Data="{StaticResource Icon_Dir}"
+							Fill="{StaticResource BtnBackground}"
+							Stretch="Fill" />
+                    </MenuItem.Icon>
+                </MenuItem>
                 <MenuItem 
                     Header="{x:Static app:AppStatic.ExportServerJsonMenuName}" 
                     Command="{x:Static app:AppStatic.ExportServerJson}" 
@@ -441,6 +452,16 @@
 							Stretch="Fill" />
                     </MenuItem.Icon>
                 </MenuItem>
+                <MenuItem Header="WebApi Action" Visibility="{Binding IsMinerStudioOuterAdminVisible}" Command="{x:Static app:AppStatic.ShowActionCountPage}">
+                    <MenuItem.Icon>
+                        <Path
+							Width="16"
+							Height="16"
+							Data="{StaticResource Icon_Action}"
+							Fill="{StaticResource BtnBackground}"
+							Stretch="Fill" />
+                    </MenuItem.Icon>
+                </MenuItem>
                 <MenuItem Header="外网群控服务器节点" Visibility="{Binding IsMinerStudioOuterAdminVisible}" Command="{x:Static app:AppStatic.ShowWsServerNodes}">
                     <MenuItem.Icon>
                         <Path

部分文件因为文件数量过多而无法显示