SettingView.xaml 99 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376
  1. <UserControl x:Class="TeamAAS.Views.SettingView"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:hc="https://handyorg.github.io/handycontrol"
  5. xmlns:prism="http://prismlibrary.com/"
  6. xmlns:conv="clr-namespace:TeamAAS.Converters"
  7. xmlns:ctrl="clr-namespace:TeamAAS.Camera.UI.Controls;assembly=TeamAAS.Camera"
  8. xmlns:sys="clr-namespace:System;assembly=mscorlib"
  9. xmlns:io="clr-namespace:System.IO.Ports;assembly=System"
  10. xmlns:fe="clr-namespace:TeamAAS.Feeder.Enums;assembly=TeamAAS.Feeder"
  11. xmlns:fm="clr-namespace:TeamAAS.Feeder.Models;assembly=TeamAAS.Feeder"
  12. xmlns:pg="clr-namespace:PropertyGridLib;assembly=PropertyGridLib"
  13. xmlns:loc="clr-namespace:TeamAAS.Localization"
  14. xmlns:views="clr-namespace:TeamAAS.Views"
  15. prism:ViewModelLocator.AutoWireViewModel="True"
  16. Background="{DynamicResource RegionBrush}">
  17. <UserControl.Resources>
  18. <conv:IsEqualConverter x:Key="IsEqualConverter"/>
  19. <conv:EnumDescriptionConverter x:Key="EnumDescriptionConverter"/>
  20. <BooleanToVisibilityConverter x:Key="BoolToVis"/>
  21. <!-- FeederAction 枚举列表(ObjectDataProvider 反射拿值,自动显示 Description) -->
  22. <ObjectDataProvider x:Key="FeederActionEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
  23. <ObjectDataProvider.MethodParameters>
  24. <x:Type TypeName="fe:FeederAction"/>
  25. </ObjectDataProvider.MethodParameters>
  26. </ObjectDataProvider>
  27. <ObjectDataProvider x:Key="SequenceStepTypeEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
  28. <ObjectDataProvider.MethodParameters>
  29. <x:Type TypeName="fm:SequenceStepType"/>
  30. </ObjectDataProvider.MethodParameters>
  31. </ObjectDataProvider>
  32. <ObjectDataProvider x:Key="FeederBrandEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
  33. <ObjectDataProvider.MethodParameters>
  34. <x:Type TypeName="fe:FeederBrand"/>
  35. </ObjectDataProvider.MethodParameters>
  36. </ObjectDataProvider>
  37. <!-- 串口枚举值 -->
  38. <x:Array x:Key="ParityValues" Type="{x:Type io:Parity}">
  39. <io:Parity>None</io:Parity>
  40. <io:Parity>Odd</io:Parity>
  41. <io:Parity>Even</io:Parity>
  42. <io:Parity>Mark</io:Parity>
  43. <io:Parity>Space</io:Parity>
  44. </x:Array>
  45. <x:Array x:Key="StopBitsValues" Type="{x:Type io:StopBits}">
  46. <io:StopBits>One</io:StopBits>
  47. <io:StopBits>OnePointFive</io:StopBits>
  48. <io:StopBits>Two</io:StopBits>
  49. </x:Array>
  50. <!-- 供料器枚举值 -->
  51. <ObjectDataProvider x:Key="FeederConnectTypeEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
  52. <ObjectDataProvider.MethodParameters>
  53. <x:Type TypeName="fe:FeederConnectType"/>
  54. </ObjectDataProvider.MethodParameters>
  55. </ObjectDataProvider>
  56. <!-- 子导航按钮样式 -->
  57. <Style x:Key="SubNavItem" TargetType="RadioButton">
  58. <Setter Property="GroupName" Value="SettingNav"/>
  59. <Setter Property="Cursor" Value="Hand"/>
  60. <Setter Property="FontSize" Value="13"/>
  61. <Setter Property="Padding" Value="16,10"/>
  62. <Setter Property="Foreground" Value="{DynamicResource SecondaryTextBrush}"/>
  63. <Setter Property="HorizontalContentAlignment" Value="Left"/>
  64. <Setter Property="Template">
  65. <Setter.Value>
  66. <ControlTemplate TargetType="RadioButton">
  67. <Border x:Name="bd" Background="Transparent" CornerRadius="6" Padding="{TemplateBinding Padding}">
  68. <ContentPresenter x:Name="cp" VerticalAlignment="Center"/>
  69. </Border>
  70. <ControlTemplate.Triggers>
  71. <Trigger Property="IsMouseOver" Value="True">
  72. <Setter TargetName="bd" Property="Background" Value="{DynamicResource SecondaryRegionBrush}"/>
  73. </Trigger>
  74. <Trigger Property="IsChecked" Value="True">
  75. <Setter TargetName="bd" Property="Background" Value="{DynamicResource PrimaryBrush}"/>
  76. <Setter Property="Foreground" Value="White"/>
  77. </Trigger>
  78. </ControlTemplate.Triggers>
  79. </ControlTemplate>
  80. </Setter.Value>
  81. </Setter>
  82. </Style>
  83. <!-- 通讯Tab按钮样式(独立GroupName) -->
  84. <Style x:Key="CommTabNavItem" TargetType="RadioButton" BasedOn="{StaticResource SubNavItem}">
  85. <Setter Property="GroupName" Value="CommTab"/>
  86. </Style>
  87. </UserControl.Resources>
  88. <Grid Background="{DynamicResource RegionBrush}" >
  89. <Grid.ColumnDefinitions>
  90. <ColumnDefinition Width="Auto" MinWidth="180" MaxWidth="240"/>
  91. <ColumnDefinition Width="*"/>
  92. </Grid.ColumnDefinitions>
  93. <!-- 左侧:子导航 -->
  94. <Border Grid.Column="0" Background="{DynamicResource RegionBrush}"
  95. BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,1,0">
  96. <ScrollViewer VerticalScrollBarVisibility="Auto">
  97. <StackPanel Margin="8,12">
  98. <TextBlock Text="{loc:Translate '设备管理'}" FontSize="14" FontWeight="Bold"
  99. Foreground="{DynamicResource PrimaryTextBrush}" Margin="8,0,0,12"/>
  100. <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '📷 相机管理'}"
  101. IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=Camera, Mode=TwoWay}"/>
  102. <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '🤖 机器人'}"
  103. IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=Robot, Mode=TwoWay}"/>
  104. <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '🔌 通讯设备'}"
  105. IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=BasicComm, Mode=TwoWay}"/>
  106. <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '🖥 PLC通讯'}"
  107. IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=PlcComm, Mode=TwoWay}"/>
  108. <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '💡 光源'}"
  109. IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=Light, Mode=TwoWay}"/>
  110. <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '📦 供料器'}"
  111. IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=Feeder, Mode=TwoWay}"/>
  112. <Border Height="1" Background="{DynamicResource BorderBrush}" Margin="8,14,8,14"/>
  113. <TextBlock Text="{loc:Translate '系统管理'}" FontSize="14" FontWeight="Bold"
  114. Foreground="{DynamicResource PrimaryTextBrush}" Margin="8,0,0,12"/>
  115. <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '📊 全局变量'}"
  116. IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=GlobalVariable, Mode=TwoWay}"/>
  117. <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '⚡ 全局事件'}"
  118. IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=GlobalEvent, Mode=TwoWay}"/>
  119. <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '🗄 产品数据'}"
  120. IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=ProductData, Mode=TwoWay}"/>
  121. <Border Height="1" Background="{DynamicResource BorderBrush}" Margin="8,14,8,14"/>
  122. <TextBlock Text="{loc:Translate '通用设置'}" FontSize="14" FontWeight="Bold"
  123. Foreground="{DynamicResource PrimaryTextBrush}" Margin="8,0,0,12"/>
  124. <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '⚙ 程序配置'}"
  125. IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=General, Mode=TwoWay}"/>
  126. </StackPanel>
  127. </ScrollViewer>
  128. </Border>
  129. <!-- 右侧:内容区 -->
  130. <Grid Grid.Column="1" Margin="16,12">
  131. <!-- ========== 产品数据管理(数据库) ========== -->
  132. <Grid>
  133. <Grid.Style>
  134. <Style TargetType="Grid">
  135. <Setter Property="Visibility" Value="Collapsed"/>
  136. <Style.Triggers>
  137. <DataTrigger Binding="{Binding SelectedSection}" Value="ProductData">
  138. <Setter Property="Visibility" Value="Visible"/>
  139. </DataTrigger>
  140. </Style.Triggers>
  141. </Style>
  142. </Grid.Style>
  143. <Grid.RowDefinitions>
  144. <RowDefinition Height="Auto"/>
  145. <RowDefinition Height="*"/>
  146. </Grid.RowDefinitions>
  147. <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}" CornerRadius="8" Padding="12,8" Margin="0,0,0,12">
  148. <StackPanel Orientation="Horizontal">
  149. <TextBlock Text="{loc:Translate '当前产品:'}" VerticalAlignment="Center" Foreground="{DynamicResource SecondaryTextBrush}"/>
  150. <TextBlock Text="{Binding DbProductName}" VerticalAlignment="Center" FontWeight="SemiBold" Foreground="{DynamicResource PrimaryTextBrush}"/>
  151. <TextBlock Text="{loc:Translate '(每个产品一个数据库,跟着产品走)'}" VerticalAlignment="Center" Margin="10,0,0,0" Foreground="{DynamicResource SecondaryTextBrush}"/>
  152. </StackPanel>
  153. </Border>
  154. <ContentControl Grid.Row="1" Content="{Binding CurrentProductDatabasePage}"/>
  155. </Grid>
  156. <!-- ========== 相机管理 ========== -->
  157. <Grid>
  158. <Grid.Style>
  159. <Style TargetType="Grid">
  160. <Setter Property="Visibility" Value="Collapsed"/>
  161. <Style.Triggers>
  162. <DataTrigger Binding="{Binding SelectedSection}" Value="Camera">
  163. <Setter Property="Visibility" Value="Visible"/>
  164. </DataTrigger>
  165. </Style.Triggers>
  166. </Style>
  167. </Grid.Style>
  168. <Grid.RowDefinitions>
  169. <RowDefinition Height="Auto"/>
  170. <RowDefinition Height="Auto"/>
  171. <RowDefinition Height="*"/>
  172. </Grid.RowDefinitions>
  173. <!-- 工具栏 -->
  174. <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
  175. CornerRadius="8" Padding="12,8" Margin="0,0,0,12">
  176. <StackPanel Orientation="Horizontal">
  177. <Button Content="{loc:Translate '搜索并添加相机'}" Command="{Binding SearchDevicesCommand}"
  178. Style="{StaticResource ButtonPrimary}" Margin="0,0,8,0" Padding="16,6"/>
  179. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
  180. <Button Content="{loc:Translate '连接'}" Command="{Binding ConnectCommand}"
  181. Style="{StaticResource ButtonDefault}" Margin="8,0,4,0" Padding="16,6"
  182. IsEnabled="{Binding HasSelectedCamera}"/>
  183. <Button Content="{loc:Translate '断开'}" Command="{Binding DisconnectCommand}"
  184. Style="{StaticResource ButtonDefault}" Margin="4,0,8,0" Padding="16,6"
  185. IsEnabled="{Binding HasSelectedCamera}"/>
  186. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
  187. <Button Content="{loc:Translate '开始采集'}" Command="{Binding StartGrabbingCommand}"
  188. Style="{StaticResource ButtonDefault}" Margin="8,0,4,0" Padding="16,6"
  189. IsEnabled="{Binding HasSelectedCamera}"/>
  190. <Button Content="{loc:Translate '停止采集'}" Command="{Binding StopGrabbingCommand}"
  191. Style="{StaticResource ButtonDefault}" Margin="4,0,8,0" Padding="16,6"
  192. IsEnabled="{Binding HasSelectedCamera}"/>
  193. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
  194. <Button Content="{loc:Translate '删除相机'}" Command="{Binding DeleteCameraCommand}"
  195. Style="{StaticResource ButtonDanger}" Margin="8,0,0,0" Padding="16,6"
  196. IsEnabled="{Binding HasSelectedCamera}"/>
  197. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="8,0"/>
  198. <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveCameraConfigCommand}"
  199. Style="{StaticResource ButtonDefault}" Margin="4,0,0,0" Padding="16,6"/>
  200. </StackPanel>
  201. </Border>
  202. <!-- SDK状态条 -->
  203. <Border Grid.Row="1" Background="{DynamicResource SecondaryRegionBrush}"
  204. CornerRadius="6" Padding="12,6" Margin="0,0,0,12">
  205. <ItemsControl ItemsSource="{Binding SdkStatus}">
  206. <ItemsControl.ItemsPanel>
  207. <ItemsPanelTemplate>
  208. <StackPanel Orientation="Horizontal"/>
  209. </ItemsPanelTemplate>
  210. </ItemsControl.ItemsPanel>
  211. <ItemsControl.ItemTemplate>
  212. <DataTemplate>
  213. <StackPanel Orientation="Horizontal" Margin="0,0,16,0">
  214. <Ellipse Width="8" Height="8" Margin="0,0,6,0">
  215. <Ellipse.Style>
  216. <Style TargetType="Ellipse">
  217. <Setter Property="Fill" Value="#F44336"/>
  218. <Style.Triggers>
  219. <DataTrigger Binding="{Binding Installed}" Value="True">
  220. <Setter Property="Fill" Value="#4CAF50"/>
  221. </DataTrigger>
  222. </Style.Triggers>
  223. </Style>
  224. </Ellipse.Style>
  225. </Ellipse>
  226. <TextBlock Text="{Binding Name}" FontSize="12"
  227. Foreground="{DynamicResource SecondaryTextBrush}"
  228. VerticalAlignment="Center"/>
  229. <TextBlock FontSize="11" Margin="6,0,0,0" VerticalAlignment="Center"
  230. Foreground="{DynamicResource SecondaryTextBrush}">
  231. <TextBlock.Style>
  232. <Style TargetType="TextBlock">
  233. <Setter Property="Text" Value="未安装"/>
  234. <Style.Triggers>
  235. <DataTrigger Binding="{Binding Installed}" Value="True">
  236. <Setter Property="Text" Value="{Binding Version, StringFormat='v{0}'}"/>
  237. <Setter Property="Foreground" Value="#4CAF50"/>
  238. </DataTrigger>
  239. </Style.Triggers>
  240. </Style>
  241. </TextBlock.Style>
  242. </TextBlock>
  243. </StackPanel>
  244. </DataTemplate>
  245. </ItemsControl.ItemTemplate>
  246. </ItemsControl>
  247. </Border>
  248. <!-- 主内容:相机列表 + 属性编辑器 + 调试页(三列) -->
  249. <Grid Grid.Row="2">
  250. <Grid.ColumnDefinitions>
  251. <ColumnDefinition Width="*"/>
  252. <ColumnDefinition Width="8"/>
  253. <ColumnDefinition Width="340"/>
  254. <ColumnDefinition Width="8"/>
  255. <ColumnDefinition Width="1.4*"/>
  256. </Grid.ColumnDefinitions>
  257. <!-- 左侧:已配置相机列表 -->
  258. <Border Grid.Column="0" Background="{DynamicResource RegionBrush}"
  259. CornerRadius="8" Margin="0,0,6,0">
  260. <DockPanel>
  261. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '已配置相机'}" FontSize="14" FontWeight="Bold"
  262. Margin="16,12,0,8" Foreground="{DynamicResource PrimaryTextBrush}"/>
  263. <DataGrid x:Name="CameraDataGrid" ItemsSource="{Binding Cameras}"
  264. SelectedItem="{Binding SelectedCamera}"
  265. AutoGenerateColumns="False" CanUserAddRows="False"
  266. IsReadOnly="True" HeadersVisibility="All"
  267. GridLinesVisibility="Horizontal" BorderThickness="0"
  268. AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}"
  269. Margin="8,0,8,8">
  270. <DataGrid.Columns>
  271. <DataGridTextColumn Header="{loc:Translate '编号'}" Binding="{Binding CameraNo}" Width="50"/>
  272. <DataGridTextColumn Header="{loc:Translate '名称'}" Binding="{Binding CameraName}" Width="150"/>
  273. <DataGridTextColumn Header="{loc:Translate '品牌'}" Binding="{Binding CameraBrandDisplay}" Width="100"/>
  274. <DataGridTextColumn Header="{loc:Translate 'IP地址'}" Binding="{Binding CameraIp}" Width="110"/>
  275. <DataGridTextColumn Header="{loc:Translate '序列号'}" Binding="{Binding SerialNumber}" Width="*"/>
  276. </DataGrid.Columns>
  277. </DataGrid>
  278. </DockPanel>
  279. </Border>
  280. <!-- 中:相机属性编辑器(纵向自带滚动,不要套外层 ScrollViewer,会使其失效) -->
  281. <Border Grid.Column="2" Background="{DynamicResource RegionBrush}"
  282. BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" CornerRadius="6"
  283. IsEnabled="{Binding HasSelectedCamera}">
  284. <DockPanel Margin="10,8">
  285. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '相机属性'}" FontSize="13" FontWeight="Bold"
  286. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
  287. <pg:PropertyGrid SelectedObject="{Binding SelectedCameraDevice}"
  288. ShowSearchBar="True" ShowDescription="True"/>
  289. </DockPanel>
  290. </Border>
  291. <!-- 右:调试页宿主:按选中相机的 [Camera] 特性加载品牌专属页,
  292. 未指定时由 CameraDebugPageFactory 回退到通用调试页(实时图像) -->
  293. <Border Grid.Column="4" Background="Black" CornerRadius="6">
  294. <Grid>
  295. <TextBlock Text="{loc:Translate '选择相机后显示调试页'}"
  296. HorizontalAlignment="Center" VerticalAlignment="Center"
  297. Foreground="{DynamicResource SecondaryTextBrush}"/>
  298. <ContentControl Content="{Binding CurrentDebugPage}" Focusable="False"/>
  299. </Grid>
  300. </Border>
  301. </Grid>
  302. </Grid>
  303. <!-- ========== 机器人管理 ========== -->
  304. <Grid>
  305. <Grid.Style>
  306. <Style TargetType="Grid">
  307. <Setter Property="Visibility" Value="Collapsed"/>
  308. <Style.Triggers>
  309. <DataTrigger Binding="{Binding SelectedSection}" Value="Robot">
  310. <Setter Property="Visibility" Value="Visible"/>
  311. </DataTrigger>
  312. </Style.Triggers>
  313. </Style>
  314. </Grid.Style>
  315. <Grid.RowDefinitions>
  316. <RowDefinition Height="Auto"/>
  317. <RowDefinition Height="*"/>
  318. </Grid.RowDefinitions>
  319. <!-- 工具栏 -->
  320. <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
  321. CornerRadius="8" Padding="12,8" Margin="0,0,0,12">
  322. <StackPanel Orientation="Horizontal">
  323. <Button Content="{loc:Translate '添加机器人'}" Command="{Binding AddRobotCommand}"
  324. Style="{StaticResource ButtonPrimary}" Margin="0,0,8,0" Padding="16,6"/>
  325. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
  326. <Button Content="{loc:Translate '连接'}" Command="{Binding ConnectRobotCommand}"
  327. Style="{StaticResource ButtonDefault}" Margin="8,0,4,0" Padding="16,6"
  328. IsEnabled="{Binding HasSelectedRobot}"/>
  329. <Button Content="{loc:Translate '断开'}" Command="{Binding DisconnectRobotCommand}"
  330. Style="{StaticResource ButtonDefault}" Margin="4,0,8,0" Padding="16,6"
  331. IsEnabled="{Binding HasSelectedRobot}"/>
  332. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
  333. <Button Content="{loc:Translate '删除'}" Command="{Binding DeleteRobotCommand}"
  334. Style="{StaticResource ButtonDanger}" Margin="8,0,0,0" Padding="16,6"
  335. IsEnabled="{Binding HasSelectedRobot}"/>
  336. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="8,0"/>
  337. <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveRobotConfigCommand}"
  338. Style="{StaticResource ButtonDefault}" Margin="4,0,0,0" Padding="16,6"/>
  339. </StackPanel>
  340. </Border>
  341. <!-- 主内容:机器人列表 + 手动调试 -->
  342. <Grid Grid.Row="1">
  343. <Grid.ColumnDefinitions>
  344. <ColumnDefinition Width="*"/>
  345. <ColumnDefinition Width="380"/>
  346. </Grid.ColumnDefinitions>
  347. <!-- 左侧:机器人列表 -->
  348. <Border Grid.Column="0" Background="{DynamicResource RegionBrush}"
  349. CornerRadius="8" Margin="0,0,6,0">
  350. <DockPanel>
  351. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '机器人列表'}" FontSize="14" FontWeight="Bold"
  352. Margin="16,12,0,8" Foreground="{DynamicResource PrimaryTextBrush}"/>
  353. <DataGrid x:Name="RobotDataGrid" ItemsSource="{Binding Robots}"
  354. SelectedItem="{Binding SelectedRobot}"
  355. AutoGenerateColumns="False" CanUserAddRows="False"
  356. IsReadOnly="True" HeadersVisibility="All"
  357. GridLinesVisibility="Horizontal" BorderThickness="0"
  358. AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}"
  359. Margin="8,0,8,8"
  360. MouseDoubleClick="RobotDataGrid_MouseDoubleClick">
  361. <DataGrid.Columns>
  362. <DataGridTextColumn Header="{loc:Translate '编号'}" Binding="{Binding RobotNo}" Width="50"/>
  363. <DataGridTextColumn Header="{loc:Translate '名称'}" Binding="{Binding RobotName}" Width="120"/>
  364. <DataGridTextColumn Header="{loc:Translate '品牌'}" Binding="{Binding RobotBrand}" Width="80"/>
  365. <DataGridTextColumn Header="{loc:Translate 'IP地址'}" Binding="{Binding IP}" Width="110"/>
  366. <DataGridTextColumn Header="{loc:Translate '端口'}" Binding="{Binding Port}" Width="60"/>
  367. <DataGridTextColumn Header="{loc:Translate '连接方式'}" Binding="{Binding ConnectType}" Width="80"/>
  368. <DataGridTextColumn Header="{loc:Translate '结束符'}" Binding="{Binding Terminator}" Width="70"/>
  369. <DataGridTextColumn Header="{loc:Translate '编码格式'}" Binding="{Binding DataEncoding}" Width="80"/>
  370. </DataGrid.Columns>
  371. </DataGrid>
  372. </DockPanel>
  373. </Border>
  374. <!-- 右侧:调试页宿主(RobotDebugPageFactory 创建品牌专属页或库内 DefaultRobotDebugPage,恒非空) -->
  375. <Border Grid.Column="1" Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="6,0,0,0">
  376. <ContentControl Content="{Binding CurrentRobotDebugPage}" Focusable="False"/>
  377. </Border>
  378. </Grid>
  379. </Grid>
  380. <!-- ========== 光源 ========== -->
  381. <Border>
  382. <Border.Style>
  383. <Style TargetType="Border">
  384. <Setter Property="Visibility" Value="Collapsed"/>
  385. <Style.Triggers>
  386. <DataTrigger Binding="{Binding SelectedSection}" Value="Light">
  387. <Setter Property="Visibility" Value="Visible"/>
  388. </DataTrigger>
  389. </Style.Triggers>
  390. </Style>
  391. </Border.Style>
  392. <DockPanel>
  393. <!-- 顶部配置栏 -->
  394. <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
  395. CornerRadius="8" Padding="12,8" Margin="0,0,0,12">
  396. <Grid>
  397. <Grid.ColumnDefinitions>
  398. <ColumnDefinition Width="Auto"/>
  399. <ColumnDefinition Width="200"/>
  400. <ColumnDefinition Width="Auto"/>
  401. <ColumnDefinition Width="200"/>
  402. <ColumnDefinition Width="Auto"/>
  403. <ColumnDefinition Width="Auto"/>
  404. <ColumnDefinition Width="100"/>
  405. <ColumnDefinition Width="*"/>
  406. <ColumnDefinition Width="Auto"/>
  407. </Grid.ColumnDefinitions>
  408. <Grid.RowDefinitions>
  409. <RowDefinition Height="Auto"/>
  410. <RowDefinition Height="Auto"/>
  411. </Grid.RowDefinitions>
  412. <!-- 型号选择 -->
  413. <TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Translate '光源型号:'}" FontSize="12"
  414. VerticalAlignment="Center" Margin="0,0,8,8"/>
  415. <ComboBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding LightModelDisplayOptions}"
  416. SelectedItem="{Binding SelectedLightModelItem}"
  417. DisplayMemberPath="Display" FontSize="12"
  418. Margin="0,0,0,8"/>
  419. <!-- 串口设备选择 -->
  420. <TextBlock Grid.Row="0" Grid.Column="2" Text="{loc:Translate '串口设备:'}" FontSize="12"
  421. VerticalAlignment="Center" Margin="16,0,8,8"/>
  422. <ComboBox Grid.Row="0" Grid.Column="3" ItemsSource="{Binding LightSerialDeviceNames}"
  423. SelectedItem="{Binding SelectedLightSerialDevice}" FontSize="12"
  424. Margin="0,0,0,8"/>
  425. <Button Grid.Row="0" Grid.Column="4" Content="{loc:Translate '🔄刷新'}"
  426. Command="{Binding LightRefreshDevicesCommand}"
  427. Margin="5,0,0,8" FontSize="12" HorizontalAlignment="Stretch"/>
  428. <!-- 协议/通道信息 -->
  429. <TextBlock Grid.Row="0" Grid.Column="5" Text="{loc:Translate '协议:'}" FontSize="12"
  430. VerticalAlignment="Center" Margin="16,0,8,8"/>
  431. <TextBlock Grid.Row="0" Grid.Column="6" Text="{Binding LightProtocolName}"
  432. FontSize="12" FontWeight="Bold" Foreground="#4FC3F7"
  433. VerticalAlignment="Center" Margin="0,0,0,8"/>
  434. <!-- 超时 -->
  435. <TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Translate '超时(ms):'}" FontSize="12"
  436. VerticalAlignment="Center" Margin="0,0,8,0"/>
  437. <hc:NumericUpDown Grid.Row="1" Grid.Column="1" Value="{Binding LightTimeoutMs}"
  438. Minimum="100" Maximum="5000" Increment="100"
  439. FontSize="12" Margin="0,0,0,0"/>
  440. <!-- 连接/断开按钮 -->
  441. <StackPanel Grid.Row="0" Grid.Column="7" Grid.RowSpan="2"
  442. Orientation="Horizontal" HorizontalAlignment="Right">
  443. <Button Content="{loc:Translate '🔌 连接'}" Command="{Binding LightConnectCommand}"
  444. FontSize="12" Padding="16,6" Margin="8,0,0,0"/>
  445. <Button Content="{loc:Translate '✖ 断开'}" Command="{Binding LightDisconnectCommand}"
  446. FontSize="12" Padding="16,6" Margin="8,0,0,0"
  447. IsEnabled="{Binding IsLightConnected}"/>
  448. </StackPanel>
  449. </Grid>
  450. </Border>
  451. <!-- 状态信息栏 -->
  452. <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
  453. CornerRadius="4" Padding="12,8" Margin="0,0,0,12">
  454. <Grid>
  455. <Grid.ColumnDefinitions>
  456. <ColumnDefinition Width="Auto"/>
  457. <ColumnDefinition Width="Auto"/>
  458. <ColumnDefinition Width="*"/>
  459. <ColumnDefinition Width="Auto"/>
  460. </Grid.ColumnDefinitions>
  461. <TextBlock Grid.Column="0" Text="{loc:Translate '状态:'}" FontSize="12"
  462. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center"/>
  463. <TextBlock Grid.Column="1" Text="{Binding LightConnectionStatus}" FontSize="12"
  464. FontWeight="Bold" Foreground="{DynamicResource PrimaryBrush}"
  465. VerticalAlignment="Center" Margin="8,0,16,0"/>
  466. <TextBlock Grid.Column="2" Text="{Binding LightMessage}" FontSize="12"
  467. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center"/>
  468. <TextBlock Grid.Column="3" Text="{Binding LightChannelCount, StringFormat=通道数: {0}}"
  469. FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}"
  470. VerticalAlignment="Center"/>
  471. </Grid>
  472. </Border>
  473. <!-- 主内容:通道列表 + 控制 -->
  474. <Grid>
  475. <Grid.ColumnDefinitions>
  476. <ColumnDefinition Width="*"/>
  477. <ColumnDefinition Width="280"/>
  478. </Grid.ColumnDefinitions>
  479. <!-- 左侧:通道列表 DataGrid -->
  480. <Border Grid.Column="0" Background="{DynamicResource RegionBrush}"
  481. CornerRadius="8" Margin="0,0,6,0">
  482. <DockPanel>
  483. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '通道列表'}" FontSize="14" FontWeight="Bold"
  484. Margin="16,12,0,8" Foreground="{DynamicResource PrimaryTextBrush}"/>
  485. <DataGrid ItemsSource="{Binding LightChannels}"
  486. AutoGenerateColumns="False" CanUserAddRows="False"
  487. IsReadOnly="True" HeadersVisibility="All"
  488. GridLinesVisibility="Horizontal" BorderThickness="0"
  489. AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}"
  490. Margin="8,0,8,8">
  491. <DataGrid.Columns>
  492. <DataGridTextColumn Header="CH" Binding="{Binding Channel}" Width="60"/>
  493. <DataGridTextColumn Header="{loc:Translate '名称'}" Binding="{Binding ChannelName}" Width="100"/>
  494. <DataGridTextColumn Header="{loc:Translate '亮度'}" Binding="{Binding Brightness}" Width="100"/>
  495. <DataGridTextColumn Header="{loc:Translate '状态'}" Binding="{Binding StatusText}" Width="80"/>
  496. </DataGrid.Columns>
  497. </DataGrid>
  498. </DockPanel>
  499. </Border>
  500. <!-- 右侧:控制面板 -->
  501. <Border Grid.Column="1" Background="{DynamicResource RegionBrush}"
  502. CornerRadius="8" Margin="6,0,0,0">
  503. <ScrollViewer VerticalScrollBarVisibility="Auto">
  504. <DockPanel Margin="12">
  505. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '光源控制'}" FontSize="14" FontWeight="Bold"
  506. Margin="0,0,0,12" Foreground="{DynamicResource PrimaryTextBrush}"/>
  507. <!-- 预设指令 -->
  508. <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
  509. CornerRadius="6" Padding="12" Margin="0,0,0,12">
  510. <StackPanel>
  511. <TextBlock Text="{loc:Translate '预设指令'}" FontSize="12" FontWeight="SemiBold"
  512. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
  513. <Grid>
  514. <Grid.ColumnDefinitions>
  515. <ColumnDefinition Width="*"/>
  516. <ColumnDefinition Width="*"/>
  517. </Grid.ColumnDefinitions>
  518. <Button Grid.Column="0" Content="{loc:Translate '💡 全开'}"
  519. Command="{Binding LightTurnOnAllCommand}"
  520. FontSize="12" Margin="0,0,4,0"
  521. IsEnabled="{Binding IsLightConnected}"/>
  522. <Button Grid.Column="1" Content="{loc:Translate '⚫ 全关'}"
  523. Command="{Binding LightTurnOffAllCommand}"
  524. FontSize="12" Margin="4,0,0,0"
  525. IsEnabled="{Binding IsLightConnected}"/>
  526. </Grid>
  527. </StackPanel>
  528. </Border>
  529. <!-- 单通道控制 -->
  530. <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
  531. CornerRadius="6" Padding="12" Margin="0,0,0,12">
  532. <StackPanel>
  533. <TextBlock Text="{loc:Translate '单通道控制'}" FontSize="12" FontWeight="SemiBold"
  534. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
  535. <TextBlock Text="{loc:Translate 'CH口'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  536. <hc:NumericUpDown Value="{Binding LightChannel}"
  537. Minimum="1" Maximum="8" Increment="1"
  538. FontSize="12" Margin="0,2,0,8"/>
  539. <TextBlock Text="{loc:Translate '亮度 (0-255)'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  540. <hc:NumericUpDown Value="{Binding LightBrightness}"
  541. Minimum="0" Maximum="255" Increment="1"
  542. FontSize="12" Margin="0,2,0,8"/>
  543. <Grid>
  544. <Grid.ColumnDefinitions>
  545. <ColumnDefinition Width="*"/>
  546. <ColumnDefinition Width="*"/>
  547. </Grid.ColumnDefinitions>
  548. <Button Grid.Column="0" Content="{loc:Translate '📖 读取'}"
  549. Command="{Binding LightReadBrightnessCommand}"
  550. FontSize="12" Padding="12,6" Margin="0,0,4,0"
  551. IsEnabled="{Binding IsLightConnected}"/>
  552. <Button Grid.Column="1" Content="{loc:Translate '✏️ 设置'}"
  553. Command="{Binding LightSetBrightnessCommand}"
  554. FontSize="12" Padding="12,6" Margin="4,0,0,0"
  555. IsEnabled="{Binding IsLightConnected}"/>
  556. </Grid>
  557. </StackPanel>
  558. </Border>
  559. <!-- 刷新设备 -->
  560. <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
  561. CornerRadius="6" Padding="12">
  562. </Border>
  563. </DockPanel>
  564. </ScrollViewer>
  565. </Border>
  566. </Grid>
  567. </DockPanel>
  568. </Border>
  569. <!-- ========== 供料器管理(完整调试界面) ========== -->
  570. <Grid>
  571. <Grid.Style>
  572. <Style TargetType="Grid">
  573. <Setter Property="Visibility" Value="Collapsed"/>
  574. <Style.Triggers>
  575. <DataTrigger Binding="{Binding SelectedSection}" Value="Feeder">
  576. <Setter Property="Visibility" Value="Visible"/>
  577. </DataTrigger>
  578. </Style.Triggers>
  579. </Style>
  580. </Grid.Style>
  581. <Grid.RowDefinitions>
  582. <RowDefinition Height="Auto"/>
  583. <RowDefinition Height="Auto"/>
  584. <RowDefinition Height="*"/>
  585. <RowDefinition Height="Auto"/>
  586. </Grid.RowDefinitions>
  587. <!-- 顶部工具栏:设备选择 + 操作按钮 -->
  588. <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
  589. CornerRadius="8" Padding="12,8" Margin="0,0,0,8">
  590. <StackPanel Orientation="Horizontal">
  591. <TextBlock Text="{loc:Translate '设备:'}" VerticalAlignment="Center"
  592. Foreground="{DynamicResource SecondaryTextBrush}"/>
  593. <ComboBox ItemsSource="{Binding Feeders}" SelectedItem="{Binding SelectedFeeder}"
  594. IsSynchronizedWithCurrentItem="False"
  595. DisplayMemberPath="FeederName" MinWidth="140" Margin="4,0,12,0"
  596. Padding="8,2"/>
  597. <Button Content="{loc:Translate '➕ 添加'}" Command="{Binding AddFeederCommand}"
  598. Style="{StaticResource ButtonPrimary}" Margin="0,0,4,0" Padding="10,3"/>
  599. <Button Content="{loc:Translate '🗑 删除'}" Command="{Binding DeleteFeederCommand}"
  600. Style="{StaticResource ButtonDanger}" Margin="4,0" Padding="10,3"
  601. IsEnabled="{Binding HasSelectedFeeder}"/>
  602. <Rectangle Width="1" Height="22" Fill="{DynamicResource BorderBrush}" Margin="6,0"/>
  603. <Button Content="{loc:Translate '🔌 连接'}" Command="{Binding ConnectFeederCommand}"
  604. Style="{StaticResource ButtonDefault}" Margin="4,0" Padding="10,3"
  605. IsEnabled="{Binding HasSelectedFeeder}"/>
  606. <Button Content="{loc:Translate '🔍 搜索IP'}" Command="{Binding SearchFeederIpCommand}"
  607. Style="{StaticResource ButtonDefault}" Margin="4,0" Padding="10,3"
  608. IsEnabled="{Binding HasSelectedFeeder}"/>
  609. <Button Content="{loc:Translate '⏹ 断开'}" Command="{Binding DisconnectFeederCommand}"
  610. Style="{StaticResource ButtonDefault}" Margin="4,0" Padding="10,3"
  611. IsEnabled="{Binding HasSelectedFeeder}"/>
  612. <Rectangle Width="1" Height="22" Fill="{DynamicResource BorderBrush}" Margin="6,0"/>
  613. <Button Content="{loc:Translate '💡 背光'}" Command="{Binding ToggleBacklightCommand}"
  614. Padding="10,3" IsEnabled="{Binding HasSelectedFeeder}">
  615. <Button.Style>
  616. <Style TargetType="Button" BasedOn="{StaticResource ButtonDefault}">
  617. <Setter Property="Background" Value="Transparent"/>
  618. <Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
  619. <Style.Triggers>
  620. <DataTrigger Binding="{Binding SelectedFeeder.IsBacklightOn}" Value="True">
  621. <Setter Property="Background" Value="#FF8C00"/>
  622. <Setter Property="Foreground" Value="White"/>
  623. </DataTrigger>
  624. </Style.Triggers>
  625. </Style>
  626. </Button.Style>
  627. </Button>
  628. <Rectangle Width="1" Height="22" Fill="{DynamicResource BorderBrush}" Margin="6,0"/>
  629. <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveFeederConfigCommand}"
  630. Style="{StaticResource ButtonDefault}" Margin="4,0" Padding="10,3"/>
  631. <TextBlock Text="{Binding FeederStatusText}"
  632. VerticalAlignment="Center" Margin="16,0,0,0"
  633. Foreground="{DynamicResource PrimaryBrush}" FontWeight="Bold"/>
  634. </StackPanel>
  635. </Border>
  636. <!-- 连接参数编辑区 -->
  637. <Border Grid.Row="1" Background="{DynamicResource RegionBrush}" CornerRadius="8"
  638. Padding="12,10" Margin="0,0,0,8"
  639. IsEnabled="{Binding HasSelectedFeeder}">
  640. <Grid>
  641. <Grid.ColumnDefinitions>
  642. <ColumnDefinition Width="Auto"/>
  643. <ColumnDefinition Width="*"/>
  644. </Grid.ColumnDefinitions>
  645. <TextBlock Grid.Column="0" Text="{loc:Translate '🔧 连接参数'}"
  646. VerticalAlignment="Center" FontWeight="Bold"
  647. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,12,0"/>
  648. <StackPanel Grid.Column="1" Orientation="Horizontal">
  649. <!-- 编号 -->
  650. <StackPanel Orientation="Vertical" Margin="0,0,10,0">
  651. <TextBlock Text="{loc:Translate '编号'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  652. <TextBox Text="{Binding SelectedFeeder.FeederNo}" Width="60" Padding="4,2"/>
  653. </StackPanel>
  654. <!-- 名称 -->
  655. <StackPanel Orientation="Vertical" Margin="0,0,10,0">
  656. <TextBlock Text="{loc:Translate '名称'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  657. <TextBox Text="{Binding SelectedFeeder.FeederName}" Width="120" Padding="4,2"/>
  658. </StackPanel>
  659. <!-- 品牌 -->
  660. <StackPanel Orientation="Vertical" Margin="0,0,10,0">
  661. <TextBlock Text="{loc:Translate '品牌'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  662. <ComboBox ItemsSource="{Binding Source={StaticResource FeederBrandEnum}}"
  663. SelectedItem="{Binding SelectedFeeder.FeederBrand}"
  664. Width="90" Padding="4,2"/>
  665. </StackPanel>
  666. <!-- 连接方式 -->
  667. <StackPanel Orientation="Vertical" Margin="0,0,10,0">
  668. <TextBlock Text="{loc:Translate '连接方式'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  669. <ComboBox ItemsSource="{Binding Source={StaticResource FeederConnectTypeEnum}}"
  670. SelectedItem="{Binding SelectedFeeder.ConnectType}"
  671. Width="100" Padding="4,2"/>
  672. </StackPanel>
  673. <!-- IP -->
  674. <StackPanel Orientation="Vertical" Margin="0,0,10,0">
  675. <TextBlock Text="{loc:Translate 'IP 地址'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  676. <TextBox Text="{Binding SelectedFeeder.IP}" Width="130" Padding="4,2"/>
  677. </StackPanel>
  678. <!-- 端口 -->
  679. <StackPanel Orientation="Vertical" Margin="0,0,10,0">
  680. <TextBlock Text="{loc:Translate '端口'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  681. <TextBox Text="{Binding SelectedFeeder.Port}" Width="70" Padding="4,2"/>
  682. </StackPanel>
  683. <!-- 串口号(仅支持 COM 连接的品牌显示;Team 只走 TCP) -->
  684. <StackPanel Orientation="Vertical" Margin="0,0,10,0"
  685. Visibility="{Binding ShowSerialConnection, Converter={StaticResource BoolToVis}}">
  686. <TextBlock Text="{loc:Translate '串口号'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  687. <TextBox Text="{Binding SelectedFeeder.SerialPortName}" Width="80" Padding="4,2"/>
  688. </StackPanel>
  689. <!-- 波特率(仅支持 COM 连接的品牌显示) -->
  690. <StackPanel Orientation="Vertical"
  691. Visibility="{Binding ShowSerialConnection, Converter={StaticResource BoolToVis}}">
  692. <TextBlock Text="{loc:Translate '波特率'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  693. <TextBox Text="{Binding SelectedFeeder.BaudRate}" Width="80" Padding="4,2"/>
  694. </StackPanel>
  695. </StackPanel>
  696. </Grid>
  697. </Border>
  698. <!-- 主调试区:单 ContentControl 承载选中供料器类型的调试页(FeederDebugPageFactory 恒返回:Team→库内 DefaultFeederDebugPage,Afag→专属页);未选设备时显示提示 -->
  699. <Grid Grid.Row="2">
  700. <TextBlock Text="{loc:Translate '选择设备后显示调试页'}"
  701. HorizontalAlignment="Center" VerticalAlignment="Center"
  702. Foreground="{DynamicResource SecondaryTextBrush}"/>
  703. <ContentControl Content="{Binding CurrentFeederDebugPage}" Focusable="False"/>
  704. </Grid>
  705. <!-- 底部:收发通讯日志 (SendLog / ReceiveLog) -->
  706. <Border Grid.Row="3" Background="{DynamicResource RegionBrush}" CornerRadius="8"
  707. Padding="8" Margin="0,8,0,0" Height="170">
  708. <Grid>
  709. <Grid.RowDefinitions>
  710. <RowDefinition Height="Auto"/>
  711. <RowDefinition Height="*"/>
  712. </Grid.RowDefinitions>
  713. <StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,6">
  714. <TextBlock Text="{loc:Translate '📡 收发日志 (SendLog / ReceiveLog)'}" FontWeight="Bold" VerticalAlignment="Center"/>
  715. <Button Content="{loc:Translate '清空'}" Command="{Binding ClearCommLogCommand}"
  716. Style="{StaticResource ButtonDefault}" Margin="12,0,0,0" Padding="10,2"/>
  717. </StackPanel>
  718. <ListBox Grid.Row="1" ItemsSource="{Binding CommLogs}" Background="Transparent" BorderThickness="0"
  719. ScrollViewer.HorizontalScrollBarVisibility="Auto" FontFamily="Consolas" FontSize="12">
  720. <ListBox.ItemTemplate>
  721. <DataTemplate>
  722. <StackPanel Orientation="Horizontal">
  723. <TextBlock Text="{Binding TimeText}" Foreground="{DynamicResource SecondaryTextBrush}" Margin="0,0,8,0"/>
  724. <TextBlock Text="{Binding Direction}" Width="46" Margin="0,0,8,0">
  725. <TextBlock.Style>
  726. <Style TargetType="TextBlock">
  727. <Setter Property="Foreground" Value="{DynamicResource PrimaryBrush}"/>
  728. <Style.Triggers>
  729. <DataTrigger Binding="{Binding IsSend}" Value="False">
  730. <Setter Property="Foreground" Value="#FF8C00"/>
  731. </DataTrigger>
  732. </Style.Triggers>
  733. </Style>
  734. </TextBlock.Style>
  735. </TextBlock>
  736. <TextBlock Text="{Binding Content}" Foreground="{DynamicResource PrimaryTextBrush}"/>
  737. </StackPanel>
  738. </DataTemplate>
  739. </ListBox.ItemTemplate>
  740. </ListBox>
  741. </Grid>
  742. </Border>
  743. </Grid>
  744. <!-- ========== 全局固定变量(Global 作用域,不随产品变) ========== -->
  745. <Grid>
  746. <Grid.Style>
  747. <Style TargetType="Grid">
  748. <Setter Property="Visibility" Value="Collapsed"/>
  749. <Style.Triggers>
  750. <DataTrigger Binding="{Binding SelectedSection}" Value="GlobalVariable">
  751. <Setter Property="Visibility" Value="Visible"/>
  752. </DataTrigger>
  753. </Style.Triggers>
  754. </Style>
  755. </Grid.Style>
  756. <Grid.RowDefinitions>
  757. <RowDefinition Height="Auto"/>
  758. <RowDefinition Height="*"/>
  759. </Grid.RowDefinitions>
  760. <!-- 标题 + 保存 -->
  761. <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
  762. CornerRadius="8" Padding="12,8" Margin="0,0,0,8">
  763. <DockPanel LastChildFill="False">
  764. <TextBlock DockPanel.Dock="Left" VerticalAlignment="Center" FontSize="13" FontWeight="Bold"
  765. Foreground="{DynamicResource PrimaryBrush}"
  766. Text="{loc:Translate '全局固定变量(不随产品变);产品级变量请在产品右键菜单的全局变量中配置'}"/>
  767. <Button DockPanel.Dock="Right" Content="{loc:Translate '💾 保存'}"
  768. Command="{Binding SaveGlobalVarsCommand}"
  769. Style="{StaticResource ButtonPrimary}" Padding="12,4" FontSize="12"/>
  770. </DockPanel>
  771. </Border>
  772. <!-- 复用编辑器(绑定 Global 作用域工作集) -->
  773. <views:GlobalVarEditorView Grid.Row="1" DataContext="{Binding GlobalVarEditor}"/>
  774. </Grid>
  775. <!-- ========== 全局事件 ========== -->
  776. <DockPanel>
  777. <DockPanel.Style>
  778. <Style TargetType="DockPanel">
  779. <Setter Property="Visibility" Value="Collapsed"/>
  780. <Style.Triggers>
  781. <DataTrigger Binding="{Binding SelectedSection}" Value="GlobalEvent">
  782. <Setter Property="Visibility" Value="Visible"/>
  783. </DataTrigger>
  784. </Style.Triggers>
  785. </Style>
  786. </DockPanel.Style>
  787. <!-- 底部固定操作按钮 -->
  788. <Border DockPanel.Dock="Bottom" Background="{DynamicResource SecondaryRegionBrush}"
  789. CornerRadius="8" Padding="16" Margin="0,8,0,0">
  790. <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
  791. <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveGlobalEventConfigCommand}"
  792. Style="{StaticResource ButtonPrimary}" FontSize="14" Margin="0,0,8,0"/>
  793. <Button Content="{loc:Translate '📂 加载配置'}" Command="{Binding LoadGlobalEventConfigCommand}"
  794. Style="{StaticResource ButtonDefault}" FontSize="14"/>
  795. </StackPanel>
  796. </Border>
  797. <!-- 可滚动内容 -->
  798. <ScrollViewer VerticalScrollBarVisibility="Auto">
  799. <StackPanel Margin="8">
  800. <!-- 心跳配置 -->
  801. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  802. <DockPanel Margin="16">
  803. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '(1) 全局心跳配置'}" FontSize="16" FontWeight="Bold"
  804. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
  805. <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,8">
  806. <Button Content="{loc:Translate '➕ 添加心跳'}" Command="{Binding AddHeartbeatCommand}"
  807. Style="{StaticResource ButtonPrimary}" Padding="12,4" FontSize="12" Margin="0,0,8,0"/>
  808. </StackPanel>
  809. <DataGrid ItemsSource="{Binding GlobalEventConfig.Heartbeats}" AutoGenerateColumns="False"
  810. CanUserAddRows="False" HeadersVisibility="All" GridLinesVisibility="Horizontal"
  811. AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}" MaxHeight="220">
  812. <DataGrid.Columns>
  813. <DataGridCheckBoxColumn Header="{loc:Translate '启用'}" Binding="{Binding Enabled}" Width="60"/>
  814. <DataGridTextColumn Header="{loc:Translate '设备名称'}" Binding="{Binding DeviceName}" Width="160"/>
  815. <DataGridTextColumn Header="{loc:Translate '设备类型'}" Binding="{Binding DeviceType}" Width="120"/>
  816. <DataGridTextColumn Header="{loc:Translate '间隔(ms)'}" Binding="{Binding IntervalMs}" Width="100"/>
  817. <DataGridTextColumn Header="{loc:Translate '超时(ms)'}" Binding="{Binding TimeoutMs}" Width="100"/>
  818. <DataGridTemplateColumn Header="{loc:Translate '操作'}" Width="80">
  819. <DataGridTemplateColumn.CellTemplate>
  820. <DataTemplate>
  821. <Button Content="{loc:Translate '删除'}" Command="{Binding DataContext.RemoveHeartbeatCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
  822. CommandParameter="{Binding}"
  823. Style="{StaticResource ButtonDanger}" Padding="8,2" FontSize="11"/>
  824. </DataTemplate>
  825. </DataGridTemplateColumn.CellTemplate>
  826. </DataGridTemplateColumn>
  827. </DataGrid.Columns>
  828. </DataGrid>
  829. </DockPanel>
  830. </Border>
  831. <!-- 产品切换事件 -->
  832. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  833. <DockPanel Margin="16">
  834. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '(2) 产品切换事件'}" FontSize="16" FontWeight="Bold"
  835. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
  836. <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,8">
  837. <Button Content="{loc:Translate '➕ 添加产品切换'}" Command="{Binding AddProductSwitchEventCommand}"
  838. Style="{StaticResource ButtonPrimary}" Padding="12,4" FontSize="12" Margin="0,0,8,0"/>
  839. </StackPanel>
  840. <DataGrid ItemsSource="{Binding GlobalEventConfig.ProductSwitchEvents}" AutoGenerateColumns="False"
  841. CanUserAddRows="False" HeadersVisibility="All" GridLinesVisibility="Horizontal"
  842. AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}" MaxHeight="220">
  843. <DataGrid.Columns>
  844. <DataGridTextColumn Header="{loc:Translate '序号'}" Binding="{Binding Sequence}" Width="60"/>
  845. <DataGridTextColumn Header="{loc:Translate '产品名称'}" Binding="{Binding ProductName}" Width="180"/>
  846. <DataGridTemplateColumn Header="{loc:Translate '操作'}" Width="80">
  847. <DataGridTemplateColumn.CellTemplate>
  848. <DataTemplate>
  849. <Button Content="{loc:Translate '删除'}" Command="{Binding DataContext.RemoveProductSwitchEventCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
  850. CommandParameter="{Binding}"
  851. Style="{StaticResource ButtonDanger}" Padding="8,2" FontSize="11"/>
  852. </DataTemplate>
  853. </DataGridTemplateColumn.CellTemplate>
  854. </DataGridTemplateColumn>
  855. </DataGrid.Columns>
  856. </DataGrid>
  857. </DockPanel>
  858. </Border>
  859. </StackPanel>
  860. </ScrollViewer>
  861. </DockPanel>
  862. <!-- ========== 通用设置 ========== -->
  863. <DockPanel>
  864. <DockPanel.Style>
  865. <Style TargetType="DockPanel">
  866. <Setter Property="Visibility" Value="Collapsed"/>
  867. <Style.Triggers>
  868. <DataTrigger Binding="{Binding SelectedSection}" Value="General">
  869. <Setter Property="Visibility" Value="Visible"/>
  870. </DataTrigger>
  871. </Style.Triggers>
  872. </Style>
  873. </DockPanel.Style>
  874. <!-- 底部固定操作按钮 -->
  875. <Border DockPanel.Dock="Bottom" Background="{DynamicResource SecondaryRegionBrush}"
  876. CornerRadius="8" Padding="16" Margin="0,8,0,0">
  877. <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
  878. <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveSystemConfigCommand}"
  879. Style="{StaticResource ButtonPrimary}" FontSize="14" Margin="0,0,8,0"/>
  880. <Button Content="{loc:Translate '📂 加载配置'}" Command="{Binding LoadSystemConfigCommand}"
  881. Style="{StaticResource ButtonDefault}" FontSize="14"/>
  882. </StackPanel>
  883. </Border>
  884. <!-- 可滚动内容 -->
  885. <ScrollViewer VerticalScrollBarVisibility="Auto">
  886. <StackPanel Margin="8">
  887. <!-- 应用信息 -->
  888. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  889. <DockPanel Margin="16">
  890. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '应用信息'}" FontSize="16" FontWeight="Bold"
  891. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
  892. <Grid>
  893. <Grid.ColumnDefinitions>
  894. <ColumnDefinition Width="Auto"/>
  895. <ColumnDefinition Width="*"/>
  896. <ColumnDefinition Width="Auto"/>
  897. <ColumnDefinition Width="*"/>
  898. </Grid.ColumnDefinitions>
  899. <Grid.RowDefinitions>
  900. <RowDefinition Height="Auto"/>
  901. <RowDefinition Height="Auto"/>
  902. <RowDefinition Height="Auto"/>
  903. </Grid.RowDefinitions>
  904. <TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Translate '软件标题:'}" FontSize="13"
  905. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  906. <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding SystemConfig.Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  907. FontSize="13" Margin="0,0,0,12"/>
  908. <TextBlock Grid.Row="0" Grid.Column="2" Text="{loc:Translate '公司/品牌:'}" FontSize="13"
  909. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  910. <TextBox Grid.Row="0" Grid.Column="3" Text="{Binding SystemConfig.CompanyTitle, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  911. FontSize="13" Margin="0,0,0,12"/>
  912. <TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Translate '软件版本:'}" FontSize="13"
  913. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  914. <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding SystemConfig.SoftwareVersion}"
  915. FontSize="13" FontWeight="Bold" Foreground="{DynamicResource PrimaryBrush}"
  916. VerticalAlignment="Center" Margin="0,0,0,12"/>
  917. </Grid>
  918. </DockPanel>
  919. </Border>
  920. <!-- 视觉引擎(画面数/排列/名称已移至 产品管理,跟产品走) -->
  921. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  922. <DockPanel Margin="16">
  923. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '👁 视觉引擎'}" FontSize="16" FontWeight="Bold"
  924. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
  925. <Grid>
  926. <Grid.ColumnDefinitions>
  927. <ColumnDefinition Width="Auto"/>
  928. <ColumnDefinition Width="*"/>
  929. </Grid.ColumnDefinitions>
  930. <TextBlock Grid.Column="0" Text="{loc:Translate '视觉引擎:'}" FontSize="13"
  931. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,0"/>
  932. <ComboBox Grid.Column="1"
  933. ItemsSource="{Binding AvailableEngines}"
  934. SelectedItem="{Binding SelectedEngine, Mode=TwoWay}"
  935. DisplayMemberPath="EngineName"
  936. FontSize="13" MinWidth="260" HorizontalAlignment="Left"
  937. VerticalAlignment="Center"
  938. ToolTip="{loc:Translate '反射探测到的可用引擎,切换后主页画面与标定页随引擎变化'}"/>
  939. </Grid>
  940. </DockPanel>
  941. </Border>
  942. <!-- 语言设置 -->
  943. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  944. <DockPanel Margin="16">
  945. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '🌍 语言设置'}" FontSize="16" FontWeight="Bold"
  946. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
  947. <Grid>
  948. <Grid.ColumnDefinitions>
  949. <ColumnDefinition Width="Auto"/>
  950. <ColumnDefinition Width="Auto"/>
  951. <ColumnDefinition Width="Auto"/>
  952. </Grid.ColumnDefinitions>
  953. <TextBlock Grid.Column="0" Text="{loc:Translate '界面语言:'}" FontSize="13"
  954. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,0"/>
  955. <ComboBox Grid.Column="1"
  956. ItemsSource="{Binding AvailableLanguages}"
  957. SelectedItem="{Binding SelectedLanguage, Mode=TwoWay}"
  958. DisplayMemberPath="DisplayName"
  959. FontSize="13"
  960. MinWidth="200"
  961. HorizontalAlignment="Left"/>
  962. <Button Grid.Column="2" Content="{loc:Translate '🔄 刷新语言列表'}"
  963. Command="{Binding RefreshLanguagesCommand}"
  964. Style="{StaticResource ButtonDefault}"
  965. FontSize="13"
  966. Margin="15,0,0,0"
  967. HorizontalAlignment="Left"
  968. ToolTip="重新扫描 Localization 目录,发现新添加的语言"/>
  969. </Grid>
  970. </DockPanel>
  971. </Border>
  972. <!-- 插件日志 -->
  973. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  974. <DockPanel Margin="16">
  975. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '📝 日志设置'}" FontSize="16" FontWeight="Bold"
  976. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
  977. <Grid>
  978. <Grid.ColumnDefinitions>
  979. <ColumnDefinition Width="Auto"/>
  980. <ColumnDefinition Width="*"/>
  981. </Grid.ColumnDefinitions>
  982. <Grid.RowDefinitions>
  983. <RowDefinition Height="Auto"/>
  984. <RowDefinition Height="Auto"/>
  985. <RowDefinition Height="Auto"/>
  986. <RowDefinition Height="Auto"/>
  987. <RowDefinition Height="Auto"/>
  988. <RowDefinition Height="Auto"/>
  989. <RowDefinition Height="Auto"/>
  990. </Grid.RowDefinitions>
  991. <TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Translate '日志根目录:'}" FontSize="13"
  992. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
  993. <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.RootPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  994. FontSize="13" Margin="0,0,0,10" MinWidth="200" Width="auto" HorizontalAlignment="Left"
  995. ToolTip="{loc:Translate '程序目录下的相对子目录(默认 Logs),也可填绝对路径'}"/>
  996. <TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Translate '公共日志公式:'}" FontSize="13"
  997. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
  998. <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.CommonPattern, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  999. FontSize="13" Margin="0,0,0,10" FontFamily="Consolas" MinWidth="200" Width="auto" HorizontalAlignment="Left"
  1000. ToolTip="{loc:Translate '占位符:{root} {flow} {task} {year} {month} {day} {time} {timestamp};默认 年\时间.log,1/2级日志写入此处'}"/>
  1001. <TextBlock Grid.Row="2" Grid.Column="0" Text="{loc:Translate '任务日志公式:'}" FontSize="13"
  1002. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
  1003. <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.TaskPattern, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1004. FontSize="13" Margin="0,0,0,10" FontFamily="Consolas" MinWidth="200" Width="auto" HorizontalAlignment="Left"
  1005. ToolTip="{loc:Translate '默认 流程名\任务名\年\时间.log,3/4级日志写入此处'}"/>
  1006. <TextBlock Grid.Row="3" Grid.Column="0" Text="{loc:Translate '默认存储详细度:'}" FontSize="13"
  1007. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
  1008. <ComboBox Grid.Row="3" Grid.Column="1" ItemsSource="{Binding LogVerbosities}"
  1009. SelectedItem="{Binding SystemConfig.PluginLog.DefaultStoreVerbosity, Mode=TwoWay}"
  1010. FontSize="13" HorizontalAlignment="Left" MinWidth="200" Width="auto" Margin="0,0,0,10"
  1011. ToolTip="{loc:Translate '新建插件默认「日志存储」详细度:粗略=只写公共日志(L1/L2);详细=额外写 流程/任务 独立日志(L3/L4)'}"/>
  1012. <TextBlock Grid.Row="4" Grid.Column="0" Text="{loc:Translate '默认显示详细度:'}" FontSize="13"
  1013. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
  1014. <ComboBox Grid.Row="4" Grid.Column="1" ItemsSource="{Binding LogVerbosities}"
  1015. SelectedItem="{Binding SystemConfig.PluginLog.DefaultDisplayVerbosity, Mode=TwoWay}"
  1016. FontSize="13" HorizontalAlignment="Left" MinWidth="200" Width="auto" Margin="0,0,0,10"
  1017. ToolTip="{loc:Translate '新建插件默认「日志显示」详细度:粗略=实时日志只显 L1/L2;详细=额外显 L3/L4(独立于存储)'}"/>
  1018. <TextBlock Grid.Row="5" Grid.Column="0" Text="{loc:Translate '单文件上限(MB):'}" FontSize="13"
  1019. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
  1020. <TextBox Grid.Row="5" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.MaxFileMB, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1021. FontSize="13" Margin="0,0,0,10" MinWidth="200" Width="auto" HorizontalAlignment="Left"
  1022. ToolTip="{loc:Translate '单个日志文件超过该大小(MB)自动归档;0 表示不按大小切分'}"/>
  1023. <TextBlock Grid.Row="6" Grid.Column="0" Text="{loc:Translate '日志保留天数:'}" FontSize="13"
  1024. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,0"/>
  1025. <TextBox Grid.Row="6" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.RetentionDays, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1026. FontSize="13" MinWidth="200" Width="auto" HorizontalAlignment="Left"
  1027. ToolTip="{loc:Translate '超过该天数的归档日志由 NLog 自动删除;0 表示不删除'}"/>
  1028. </Grid>
  1029. </DockPanel>
  1030. </Border>
  1031. <!-- 顶部栏 &amp; 导航按钮尺寸 -->
  1032. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  1033. <DockPanel Margin="16">
  1034. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '顶部栏、标题 &amp; 状态栏'}" FontSize="16" FontWeight="Bold"
  1035. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
  1036. <Grid>
  1037. <Grid.ColumnDefinitions>
  1038. <ColumnDefinition Width="Auto"/>
  1039. <ColumnDefinition Width="*"/>
  1040. <ColumnDefinition Width="Auto"/>
  1041. <ColumnDefinition Width="*"/>
  1042. </Grid.ColumnDefinitions>
  1043. <Grid.RowDefinitions>
  1044. <RowDefinition Height="Auto"/>
  1045. <RowDefinition Height="Auto"/>
  1046. <RowDefinition Height="Auto"/>
  1047. <RowDefinition Height="Auto"/>
  1048. <RowDefinition Height="Auto"/>
  1049. </Grid.RowDefinitions>
  1050. <TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Translate '顶栏高度:'}" FontSize="13"
  1051. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1052. <hc:NumericUpDown Grid.Row="0" Grid.Column="1"
  1053. Value="{Binding SystemConfig.Font.TopBarHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1054. Minimum="50" Maximum="120" Increment="2"
  1055. FontSize="13" Margin="0,0,0,12"/>
  1056. <TextBlock Grid.Row="0" Grid.Column="2" Text="{loc:Translate '中心标题字号:'}" FontSize="13"
  1057. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1058. <hc:NumericUpDown Grid.Row="0" Grid.Column="3"
  1059. Value="{Binding SystemConfig.Font.CenterTitleFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1060. Minimum="12" Maximum="48" Increment="1"
  1061. FontSize="13" Margin="0,0,0,12"/>
  1062. <TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Translate '状态栏高度:'}" FontSize="13"
  1063. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1064. <hc:NumericUpDown Grid.Row="1" Grid.Column="1"
  1065. Value="{Binding SystemConfig.Font.StatusBarHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1066. Minimum="30" Maximum="100" Increment="2"
  1067. FontSize="13" Margin="0,0,0,12"/>
  1068. <TextBlock Grid.Row="1" Grid.Column="2" Text="{loc:Translate '状态栏字号:'}" FontSize="13"
  1069. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1070. <hc:NumericUpDown Grid.Row="1" Grid.Column="3"
  1071. Value="{Binding SystemConfig.Font.StatusBarFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1072. Minimum="9" Maximum="18" Increment="1"
  1073. FontSize="13" Margin="0,0,0,12"/>
  1074. <TextBlock Grid.Row="2" Grid.Column="0" Text="{loc:Translate '按钮宽度:'}" FontSize="13"
  1075. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1076. <hc:NumericUpDown Grid.Row="2" Grid.Column="1"
  1077. Value="{Binding SystemConfig.Font.NavButtonWidth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1078. Minimum="60" Maximum="160" Increment="4"
  1079. FontSize="13" Margin="0,0,0,12"/>
  1080. <TextBlock Grid.Row="2" Grid.Column="2" Text="{loc:Translate '按钮高度:'}" FontSize="13"
  1081. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1082. <hc:NumericUpDown Grid.Row="2" Grid.Column="3"
  1083. Value="{Binding SystemConfig.Font.NavButtonHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1084. Minimum="50" Maximum="120" Increment="2"
  1085. FontSize="13" Margin="0,0,0,12"/>
  1086. <TextBlock Grid.Row="3" Grid.Column="0" Text="{loc:Translate '按钮字体:'}" FontSize="13"
  1087. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1088. <hc:NumericUpDown Grid.Row="3" Grid.Column="1"
  1089. Value="{Binding SystemConfig.Font.NavButtonFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1090. Minimum="10" Maximum="28" Increment="1"
  1091. FontSize="13" Margin="0,0,0,12"/>
  1092. <TextBlock Grid.Row="3" Grid.Column="2" Text="{loc:Translate '主题图标字号:'}" FontSize="13"
  1093. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1094. <hc:NumericUpDown Grid.Row="3" Grid.Column="3"
  1095. Value="{Binding SystemConfig.Font.ThemeIconSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1096. Minimum="12" Maximum="40" Increment="1"
  1097. FontSize="13" Margin="0,0,0,12"/>
  1098. <TextBlock Grid.Row="4" Grid.Column="0" Text="{loc:Translate '图标尺寸:'}" FontSize="13"
  1099. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,0"/>
  1100. <hc:NumericUpDown Grid.Row="4" Grid.Column="1"
  1101. Value="{Binding SystemConfig.Font.NavIconSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1102. Minimum="16" Maximum="48" Increment="2"
  1103. FontSize="13" Margin="0,0,0,0"/>
  1104. </Grid>
  1105. </DockPanel>
  1106. </Border>
  1107. </StackPanel>
  1108. </ScrollViewer>
  1109. </DockPanel>
  1110. <!-- ========== 通讯管理 ========== -->
  1111. <Grid>
  1112. <Grid.Style>
  1113. <Style TargetType="Grid">
  1114. <Setter Property="Visibility" Value="Collapsed"/>
  1115. <Style.Triggers>
  1116. <DataTrigger Binding="{Binding IsCommSection}" Value="True">
  1117. <Setter Property="Visibility" Value="Visible"/>
  1118. </DataTrigger>
  1119. </Style.Triggers>
  1120. </Style>
  1121. </Grid.Style>
  1122. <Grid.RowDefinitions>
  1123. <RowDefinition Height="Auto"/>
  1124. <RowDefinition Height="*"/>
  1125. </Grid.RowDefinitions>
  1126. <!-- 工具栏 -->
  1127. <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
  1128. CornerRadius="8" Padding="12,8" Margin="0,0,0,12">
  1129. <StackPanel Orientation="Horizontal">
  1130. <!-- 基础Tab: 选择类型 -->
  1131. <StackPanel Orientation="Horizontal">
  1132. <StackPanel.Style>
  1133. <Style TargetType="StackPanel">
  1134. <Setter Property="Visibility" Value="Visible"/>
  1135. <Style.Triggers>
  1136. <DataTrigger Binding="{Binding IsPlcTab}" Value="True">
  1137. <Setter Property="Visibility" Value="Collapsed"/>
  1138. </DataTrigger>
  1139. </Style.Triggers>
  1140. </Style>
  1141. </StackPanel.Style>
  1142. <TextBlock Text="{loc:Translate '类型:'}" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}"
  1143. VerticalAlignment="Center" Margin="0,0,4,0"/>
  1144. <ComboBox ItemsSource="{Binding BasicCommTypes}"
  1145. SelectedValuePath="TypeKey"
  1146. SelectedIndex="0"
  1147. SelectedValue="{Binding AddTypeKey}"
  1148. DisplayMemberPath="DisplayName"
  1149. MinWidth="140" Padding="4,3" Margin="0,0,8,0"
  1150. VerticalAlignment="Center"/>
  1151. </StackPanel>
  1152. <!-- PLC Tab: 选择协议 -->
  1153. <StackPanel Orientation="Horizontal">
  1154. <StackPanel.Style>
  1155. <Style TargetType="StackPanel">
  1156. <Setter Property="Visibility" Value="Collapsed"/>
  1157. <Style.Triggers>
  1158. <DataTrigger Binding="{Binding IsPlcTab}" Value="True">
  1159. <Setter Property="Visibility" Value="Visible"/>
  1160. </DataTrigger>
  1161. </Style.Triggers>
  1162. </Style>
  1163. </StackPanel.Style>
  1164. <TextBlock Text="{loc:Translate '协议:'}" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}"
  1165. VerticalAlignment="Center" Margin="0,0,4,0"/>
  1166. <ComboBox ItemsSource="{Binding PlcTypes}"
  1167. SelectedIndex="0"
  1168. SelectedItem="{Binding SelectedPlcType}"
  1169. DisplayMemberPath="DisplayName"
  1170. MinWidth="140" Padding="4,3" Margin="0,0,8,0"
  1171. VerticalAlignment="Center"/>
  1172. </StackPanel>
  1173. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
  1174. <Button Content="{loc:Translate '➕ 添加'}" Style="{StaticResource ButtonPrimary}" Margin="8,0,4,0" Padding="12,4"
  1175. Command="{Binding AddCommunicationCommand}"/>
  1176. <Button Content="{loc:Translate '🗑 删除'}" Style="{StaticResource ButtonDanger}" Margin="4,0,8,0" Padding="12,4"
  1177. Command="{Binding DeleteCommunicationCommand}"
  1178. IsEnabled="{Binding HasSelectedCommunication}"/>
  1179. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
  1180. <Button Content="{loc:Translate '🔗 连接'}" Style="{StaticResource ButtonDefault}" Margin="8,0,4,0" Padding="10,4"
  1181. Command="{Binding ConnectCommunicationCommand}"
  1182. IsEnabled="{Binding HasSelectedCommunication}"/>
  1183. <Button Content="{loc:Translate '⛓ 断开'}" Style="{StaticResource ButtonDefault}" Margin="4,0,8,0" Padding="10,4"
  1184. Command="{Binding DisconnectCommunicationCommand}"
  1185. IsEnabled="{Binding HasSelectedCommunication}"/>
  1186. <Button Content="{loc:Translate '🔗 全部连接'}" Style="{StaticResource ButtonDefault}" Margin="0,0,4,0" Padding="10,4"
  1187. Command="{Binding ConnectAllCommand}"/>
  1188. <Button Content="{loc:Translate '⛓ 全部断开'}" Style="{StaticResource ButtonDefault}" Margin="4,0,8,0" Padding="10,4"
  1189. Command="{Binding DisconnectAllCommand}"/>
  1190. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
  1191. <Button Content="{loc:Translate '💾 保存配置'}" Style="{StaticResource ButtonDefault}" Margin="8,0,0,0" Padding="12,4"
  1192. Command="{Binding SaveCommunicationsCommand}"/>
  1193. </StackPanel>
  1194. </Border>
  1195. <!-- 列表 + 编辑区 -->
  1196. <Grid Grid.Row="1" Margin="0,10,0,0">
  1197. <Grid.ColumnDefinitions>
  1198. <ColumnDefinition Width="200"/>
  1199. <ColumnDefinition Width="8"/>
  1200. <ColumnDefinition Width="320"/>
  1201. <ColumnDefinition Width="8"/>
  1202. <ColumnDefinition Width="*"/>
  1203. </Grid.ColumnDefinitions>
  1204. <!-- 左:通讯列表 -->
  1205. <Border Grid.Column="0" Background="{DynamicResource RegionBrush}"
  1206. BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" CornerRadius="6">
  1207. <DockPanel>
  1208. <TextBlock DockPanel.Dock="Top" Text="{Binding CommTabDisplayText}" FontSize="13" FontWeight="Bold"
  1209. Foreground="{DynamicResource PrimaryTextBrush}" Margin="12,10,12,8"/>
  1210. <ListBox ItemsSource="{Binding DisplayedCommunications}"
  1211. SelectedItem="{Binding SelectedCommunication}"
  1212. BorderThickness="0" Background="Transparent"
  1213. ScrollViewer.HorizontalScrollBarVisibility="Disabled">
  1214. <ListBox.ItemTemplate>
  1215. <DataTemplate>
  1216. <StackPanel Margin="4,6">
  1217. <DockPanel>
  1218. <Border DockPanel.Dock="Right" CornerRadius="8"
  1219. Background="{DynamicResource SecondaryRegionBrush}"
  1220. Padding="8,2" VerticalAlignment="Center">
  1221. <TextBlock FontSize="11">
  1222. <TextBlock.Style>
  1223. <Style TargetType="TextBlock">
  1224. <Setter Property="Text" Value="未连接"/>
  1225. <Setter Property="Foreground" Value="{DynamicResource SecondaryTextBrush}"/>
  1226. <Style.Triggers>
  1227. <DataTrigger Binding="{Binding IsConnected}" Value="True">
  1228. <Setter Property="Text" Value="已连接"/>
  1229. <Setter Property="Foreground" Value="#4CAF50"/>
  1230. </DataTrigger>
  1231. </Style.Triggers>
  1232. </Style>
  1233. </TextBlock.Style>
  1234. </TextBlock>
  1235. </Border>
  1236. <TextBlock Text="{Binding Name}" FontSize="13" FontWeight="Bold"
  1237. Foreground="{DynamicResource PrimaryTextBrush}"
  1238. TextTrimming="CharacterEllipsis"/>
  1239. </DockPanel>
  1240. <TextBlock Text="{Binding EndpointUrl}" FontSize="11" Margin="0,3,0,0"
  1241. Foreground="{DynamicResource SecondaryTextBrush}"
  1242. TextTrimming="CharacterEllipsis"/>
  1243. </StackPanel>
  1244. </DataTemplate>
  1245. </ListBox.ItemTemplate>
  1246. </ListBox>
  1247. </DockPanel>
  1248. </Border>
  1249. <!-- 中:属性编辑区 -->
  1250. <Border Grid.Column="2" Background="{DynamicResource RegionBrush}"
  1251. BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" CornerRadius="6"
  1252. IsEnabled="{Binding IsPropertyGridEnabled}">
  1253. <DockPanel Margin="8,8">
  1254. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '属性配置'}" FontSize="13" FontWeight="Bold"
  1255. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
  1256. <TextBlock DockPanel.Dock="Bottom" Text="{Binding CommMessage}" FontSize="11"
  1257. TextWrapping="Wrap"
  1258. Foreground="{DynamicResource PrimaryBrush}" Margin="0,6,0,0"/>
  1259. <pg:PropertyGrid SelectedObject="{Binding PropertyGridSelectedObject}"
  1260. ShowSearchBar="True"
  1261. ShowDescription="True"/>
  1262. </DockPanel>
  1263. </Border>
  1264. <!-- 右:调试页宿主(CommunicationDebugPageFactory 创建品牌专属页或库内 DefaultCommunicationDebugPage,恒非空) -->
  1265. <Border Grid.Column="4" Background="{DynamicResource RegionBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" CornerRadius="6">
  1266. <ContentControl Content="{Binding CurrentCommunicationDebugPage}" Focusable="False"/>
  1267. </Border>
  1268. </Grid>
  1269. </Grid>
  1270. </Grid>
  1271. </Grid>
  1272. </UserControl>