SettingView.xaml 107 KB

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