SettingView.xaml 106 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512
  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 ConnectMotionCardommand}"
  420. Style="{StaticResource ButtonDefault}"
  421. Margin="8,0,4,0"
  422. Padding="16,6"
  423. IsEnabled="{Binding HasSelectedRobot}" />
  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 HasSelectedRobot}" />
  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 HasSelectedRobot}" />
  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. </DataGrid.Columns>
  495. </DataGrid>
  496. </DockPanel>
  497. </Border>
  498. <!-- 右侧:调试页宿主(RobotDebugPageFactory 创建品牌专属页或库内 DefaultRobotDebugPage,恒非空) -->
  499. <Border Grid.Column="1"
  500. Background="{DynamicResource RegionBrush}"
  501. CornerRadius="8"
  502. Margin="6,0,0,0">
  503. <ContentControl Content="{Binding CurrentMotionDebugPage}"
  504. Focusable="False" />
  505. </Border>
  506. </Grid>
  507. </Grid>
  508. <!-- ========== 光源 ========== -->
  509. <Border>
  510. <Border.Style>
  511. <Style TargetType="Border">
  512. <Setter Property="Visibility" Value="Collapsed"/>
  513. <Style.Triggers>
  514. <DataTrigger Binding="{Binding SelectedSection}" Value="Light">
  515. <Setter Property="Visibility" Value="Visible"/>
  516. </DataTrigger>
  517. </Style.Triggers>
  518. </Style>
  519. </Border.Style>
  520. <DockPanel>
  521. <!-- 顶部配置栏 -->
  522. <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
  523. CornerRadius="8" Padding="12,8" Margin="0,0,0,12">
  524. <Grid>
  525. <Grid.ColumnDefinitions>
  526. <ColumnDefinition Width="Auto"/>
  527. <ColumnDefinition Width="200"/>
  528. <ColumnDefinition Width="Auto"/>
  529. <ColumnDefinition Width="200"/>
  530. <ColumnDefinition Width="Auto"/>
  531. <ColumnDefinition Width="Auto"/>
  532. <ColumnDefinition Width="100"/>
  533. <ColumnDefinition Width="*"/>
  534. <ColumnDefinition Width="Auto"/>
  535. </Grid.ColumnDefinitions>
  536. <Grid.RowDefinitions>
  537. <RowDefinition Height="Auto"/>
  538. <RowDefinition Height="Auto"/>
  539. </Grid.RowDefinitions>
  540. <!-- 型号选择 -->
  541. <TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Translate '光源型号:'}" FontSize="12"
  542. VerticalAlignment="Center" Margin="0,0,8,8"/>
  543. <ComboBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding LightModelDisplayOptions}"
  544. SelectedItem="{Binding SelectedLightModelItem}"
  545. DisplayMemberPath="Display" FontSize="12"
  546. Margin="0,0,0,8"/>
  547. <!-- 串口设备选择 -->
  548. <TextBlock Grid.Row="0" Grid.Column="2" Text="{loc:Translate '串口设备:'}" FontSize="12"
  549. VerticalAlignment="Center" Margin="16,0,8,8"/>
  550. <ComboBox Grid.Row="0" Grid.Column="3" ItemsSource="{Binding LightSerialDeviceNames}"
  551. SelectedItem="{Binding SelectedLightSerialDevice}" FontSize="12"
  552. Margin="0,0,0,8"/>
  553. <Button Grid.Row="0" Grid.Column="4" Content="{loc:Translate '🔄刷新'}"
  554. Command="{Binding LightRefreshDevicesCommand}"
  555. Margin="5,0,0,8" FontSize="12" HorizontalAlignment="Stretch"/>
  556. <!-- 协议/通道信息 -->
  557. <TextBlock Grid.Row="0" Grid.Column="5" Text="{loc:Translate '协议:'}" FontSize="12"
  558. VerticalAlignment="Center" Margin="16,0,8,8"/>
  559. <TextBlock Grid.Row="0" Grid.Column="6" Text="{Binding LightProtocolName}"
  560. FontSize="12" FontWeight="Bold" Foreground="#4FC3F7"
  561. VerticalAlignment="Center" Margin="0,0,0,8"/>
  562. <!-- 超时 -->
  563. <TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Translate '超时(ms):'}" FontSize="12"
  564. VerticalAlignment="Center" Margin="0,0,8,0"/>
  565. <hc:NumericUpDown Grid.Row="1" Grid.Column="1" Value="{Binding LightTimeoutMs}"
  566. Minimum="100" Maximum="5000" Increment="100"
  567. FontSize="12" Margin="0,0,0,0"/>
  568. <!-- 连接/断开按钮 -->
  569. <StackPanel Grid.Row="0" Grid.Column="7" Grid.RowSpan="2"
  570. Orientation="Horizontal" HorizontalAlignment="Right">
  571. <Button Content="{loc:Translate '🔌 连接'}" Command="{Binding LightConnectCommand}"
  572. FontSize="12" Padding="16,6" Margin="8,0,0,0"/>
  573. <Button Content="{loc:Translate '✖ 断开'}" Command="{Binding LightDisconnectCommand}"
  574. FontSize="12" Padding="16,6" Margin="8,0,0,0"
  575. IsEnabled="{Binding IsLightConnected}"/>
  576. </StackPanel>
  577. </Grid>
  578. </Border>
  579. <!-- 状态信息栏 -->
  580. <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
  581. CornerRadius="4" Padding="12,8" Margin="0,0,0,12">
  582. <Grid>
  583. <Grid.ColumnDefinitions>
  584. <ColumnDefinition Width="Auto"/>
  585. <ColumnDefinition Width="Auto"/>
  586. <ColumnDefinition Width="*"/>
  587. <ColumnDefinition Width="Auto"/>
  588. </Grid.ColumnDefinitions>
  589. <TextBlock Grid.Column="0" Text="{loc:Translate '状态:'}" FontSize="12"
  590. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center"/>
  591. <TextBlock Grid.Column="1" Text="{Binding LightConnectionStatus}" FontSize="12"
  592. FontWeight="Bold" Foreground="{DynamicResource PrimaryBrush}"
  593. VerticalAlignment="Center" Margin="8,0,16,0"/>
  594. <TextBlock Grid.Column="2" Text="{Binding LightMessage}" FontSize="12"
  595. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center"/>
  596. <TextBlock Grid.Column="3" Text="{Binding LightChannelCount, StringFormat=通道数: {0}}"
  597. FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}"
  598. VerticalAlignment="Center"/>
  599. </Grid>
  600. </Border>
  601. <!-- 主内容:通道列表 + 控制 -->
  602. <Grid>
  603. <Grid.ColumnDefinitions>
  604. <ColumnDefinition Width="*"/>
  605. <ColumnDefinition Width="280"/>
  606. </Grid.ColumnDefinitions>
  607. <!-- 左侧:通道列表 DataGrid -->
  608. <Border Grid.Column="0" Background="{DynamicResource RegionBrush}"
  609. CornerRadius="8" Margin="0,0,6,0">
  610. <DockPanel>
  611. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '通道列表'}" FontSize="14" FontWeight="Bold"
  612. Margin="16,12,0,8" Foreground="{DynamicResource PrimaryTextBrush}"/>
  613. <DataGrid ItemsSource="{Binding LightChannels}"
  614. AutoGenerateColumns="False" CanUserAddRows="False"
  615. IsReadOnly="True" HeadersVisibility="All"
  616. GridLinesVisibility="Horizontal" BorderThickness="0"
  617. AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}"
  618. Margin="8,0,8,8">
  619. <DataGrid.Columns>
  620. <DataGridTextColumn Header="CH" Binding="{Binding Channel}" Width="60"/>
  621. <DataGridTextColumn Header="{loc:Translate '名称'}" Binding="{Binding ChannelName}" Width="100"/>
  622. <DataGridTextColumn Header="{loc:Translate '亮度'}" Binding="{Binding Brightness}" Width="100"/>
  623. <DataGridTextColumn Header="{loc:Translate '状态'}" Binding="{Binding StatusText}" Width="80"/>
  624. </DataGrid.Columns>
  625. </DataGrid>
  626. </DockPanel>
  627. </Border>
  628. <!-- 右侧:控制面板 -->
  629. <Border Grid.Column="1" Background="{DynamicResource RegionBrush}"
  630. CornerRadius="8" Margin="6,0,0,0">
  631. <ScrollViewer VerticalScrollBarVisibility="Auto">
  632. <DockPanel Margin="12">
  633. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '光源控制'}" FontSize="14" FontWeight="Bold"
  634. Margin="0,0,0,12" Foreground="{DynamicResource PrimaryTextBrush}"/>
  635. <!-- 预设指令 -->
  636. <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
  637. CornerRadius="6" Padding="12" Margin="0,0,0,12">
  638. <StackPanel>
  639. <TextBlock Text="{loc:Translate '预设指令'}" FontSize="12" FontWeight="SemiBold"
  640. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
  641. <Grid>
  642. <Grid.ColumnDefinitions>
  643. <ColumnDefinition Width="*"/>
  644. <ColumnDefinition Width="*"/>
  645. </Grid.ColumnDefinitions>
  646. <Button Grid.Column="0" Content="{loc:Translate '💡 全开'}"
  647. Command="{Binding LightTurnOnAllCommand}"
  648. FontSize="12" Margin="0,0,4,0"
  649. IsEnabled="{Binding IsLightConnected}"/>
  650. <Button Grid.Column="1" Content="{loc:Translate '⚫ 全关'}"
  651. Command="{Binding LightTurnOffAllCommand}"
  652. FontSize="12" Margin="4,0,0,0"
  653. IsEnabled="{Binding IsLightConnected}"/>
  654. </Grid>
  655. </StackPanel>
  656. </Border>
  657. <!-- 单通道控制 -->
  658. <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
  659. CornerRadius="6" Padding="12" Margin="0,0,0,12">
  660. <StackPanel>
  661. <TextBlock Text="{loc:Translate '单通道控制'}" FontSize="12" FontWeight="SemiBold"
  662. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
  663. <TextBlock Text="{loc:Translate 'CH口'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  664. <hc:NumericUpDown Value="{Binding LightChannel}"
  665. Minimum="1" Maximum="8" Increment="1"
  666. FontSize="12" Margin="0,2,0,8"/>
  667. <TextBlock Text="{loc:Translate '亮度 (0-255)'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  668. <hc:NumericUpDown Value="{Binding LightBrightness}"
  669. Minimum="0" Maximum="255" Increment="1"
  670. FontSize="12" Margin="0,2,0,8"/>
  671. <Grid>
  672. <Grid.ColumnDefinitions>
  673. <ColumnDefinition Width="*"/>
  674. <ColumnDefinition Width="*"/>
  675. </Grid.ColumnDefinitions>
  676. <Button Grid.Column="0" Content="{loc:Translate '📖 读取'}"
  677. Command="{Binding LightReadBrightnessCommand}"
  678. FontSize="12" Padding="12,6" Margin="0,0,4,0"
  679. IsEnabled="{Binding IsLightConnected}"/>
  680. <Button Grid.Column="1" Content="{loc:Translate '✏️ 设置'}"
  681. Command="{Binding LightSetBrightnessCommand}"
  682. FontSize="12" Padding="12,6" Margin="4,0,0,0"
  683. IsEnabled="{Binding IsLightConnected}"/>
  684. </Grid>
  685. </StackPanel>
  686. </Border>
  687. <!-- 刷新设备 -->
  688. <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
  689. CornerRadius="6" Padding="12">
  690. </Border>
  691. </DockPanel>
  692. </ScrollViewer>
  693. </Border>
  694. </Grid>
  695. </DockPanel>
  696. </Border>
  697. <!-- ========== 供料器管理(完整调试界面) ========== -->
  698. <Grid>
  699. <Grid.Style>
  700. <Style TargetType="Grid">
  701. <Setter Property="Visibility" Value="Collapsed"/>
  702. <Style.Triggers>
  703. <DataTrigger Binding="{Binding SelectedSection}" Value="Feeder">
  704. <Setter Property="Visibility" Value="Visible"/>
  705. </DataTrigger>
  706. </Style.Triggers>
  707. </Style>
  708. </Grid.Style>
  709. <Grid.RowDefinitions>
  710. <RowDefinition Height="Auto"/>
  711. <RowDefinition Height="Auto"/>
  712. <RowDefinition Height="*"/>
  713. <RowDefinition Height="Auto"/>
  714. </Grid.RowDefinitions>
  715. <!-- 顶部工具栏:设备选择 + 操作按钮 -->
  716. <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
  717. CornerRadius="8" Padding="12,8" Margin="0,0,0,8">
  718. <StackPanel Orientation="Horizontal">
  719. <TextBlock Text="{loc:Translate '设备:'}" VerticalAlignment="Center"
  720. Foreground="{DynamicResource SecondaryTextBrush}"/>
  721. <ComboBox ItemsSource="{Binding Feeders}" SelectedItem="{Binding SelectedFeeder}"
  722. IsSynchronizedWithCurrentItem="False"
  723. DisplayMemberPath="FeederName" MinWidth="140" Margin="4,0,12,0"
  724. Padding="8,2"/>
  725. <Button Content="{loc:Translate '➕ 添加'}" Command="{Binding AddFeederCommand}"
  726. Style="{StaticResource ButtonPrimary}" Margin="0,0,4,0" Padding="10,3"/>
  727. <Button Content="{loc:Translate '🗑 删除'}" Command="{Binding DeleteFeederCommand}"
  728. Style="{StaticResource ButtonDanger}" Margin="4,0" Padding="10,3"
  729. IsEnabled="{Binding HasSelectedFeeder}"/>
  730. <Rectangle Width="1" Height="22" Fill="{DynamicResource BorderBrush}" Margin="6,0"/>
  731. <Button Content="{loc:Translate '🔌 连接'}" Command="{Binding ConnectFeederCommand}"
  732. Style="{StaticResource ButtonDefault}" Margin="4,0" Padding="10,3"
  733. IsEnabled="{Binding HasSelectedFeeder}"/>
  734. <Button Content="{loc:Translate '🔍 搜索IP'}" Command="{Binding SearchFeederIpCommand}"
  735. Style="{StaticResource ButtonDefault}" Margin="4,0" Padding="10,3"
  736. IsEnabled="{Binding HasSelectedFeeder}"/>
  737. <Button Content="{loc:Translate '⏹ 断开'}" Command="{Binding DisconnectFeederCommand}"
  738. Style="{StaticResource ButtonDefault}" Margin="4,0" Padding="10,3"
  739. IsEnabled="{Binding HasSelectedFeeder}"/>
  740. <Rectangle Width="1" Height="22" Fill="{DynamicResource BorderBrush}" Margin="6,0"/>
  741. <Button Content="{loc:Translate '💡 背光'}" Command="{Binding ToggleBacklightCommand}"
  742. Padding="10,3" IsEnabled="{Binding HasSelectedFeeder}">
  743. <Button.Style>
  744. <Style TargetType="Button" BasedOn="{StaticResource ButtonDefault}">
  745. <Setter Property="Background" Value="Transparent"/>
  746. <Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
  747. <Style.Triggers>
  748. <DataTrigger Binding="{Binding SelectedFeeder.IsBacklightOn}" Value="True">
  749. <Setter Property="Background" Value="#FF8C00"/>
  750. <Setter Property="Foreground" Value="White"/>
  751. </DataTrigger>
  752. </Style.Triggers>
  753. </Style>
  754. </Button.Style>
  755. </Button>
  756. <Rectangle Width="1" Height="22" Fill="{DynamicResource BorderBrush}" Margin="6,0"/>
  757. <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveFeederConfigCommand}"
  758. Style="{StaticResource ButtonDefault}" Margin="4,0" Padding="10,3"/>
  759. <TextBlock Text="{Binding FeederStatusText}"
  760. VerticalAlignment="Center" Margin="16,0,0,0"
  761. Foreground="{DynamicResource PrimaryBrush}" FontWeight="Bold"/>
  762. </StackPanel>
  763. </Border>
  764. <!-- 连接参数编辑区 -->
  765. <Border Grid.Row="1" Background="{DynamicResource RegionBrush}" CornerRadius="8"
  766. Padding="12,10" Margin="0,0,0,8"
  767. IsEnabled="{Binding HasSelectedFeeder}">
  768. <Grid>
  769. <Grid.ColumnDefinitions>
  770. <ColumnDefinition Width="Auto"/>
  771. <ColumnDefinition Width="*"/>
  772. </Grid.ColumnDefinitions>
  773. <TextBlock Grid.Column="0" Text="{loc:Translate '🔧 连接参数'}"
  774. VerticalAlignment="Center" FontWeight="Bold"
  775. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,12,0"/>
  776. <StackPanel Grid.Column="1" Orientation="Horizontal">
  777. <!-- 编号 -->
  778. <StackPanel Orientation="Vertical" Margin="0,0,10,0">
  779. <TextBlock Text="{loc:Translate '编号'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  780. <TextBox Text="{Binding SelectedFeeder.FeederNo}" Width="60" Padding="4,2"/>
  781. </StackPanel>
  782. <!-- 名称 -->
  783. <StackPanel Orientation="Vertical" Margin="0,0,10,0">
  784. <TextBlock Text="{loc:Translate '名称'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  785. <TextBox Text="{Binding SelectedFeeder.FeederName}" Width="120" Padding="4,2"/>
  786. </StackPanel>
  787. <!-- 品牌 -->
  788. <StackPanel Orientation="Vertical" Margin="0,0,10,0">
  789. <TextBlock Text="{loc:Translate '品牌'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  790. <ComboBox ItemsSource="{Binding Source={StaticResource FeederBrandEnum}}"
  791. SelectedItem="{Binding SelectedFeeder.FeederBrand}"
  792. Width="90" Padding="4,2"/>
  793. </StackPanel>
  794. <!-- 连接方式 -->
  795. <StackPanel Orientation="Vertical" Margin="0,0,10,0">
  796. <TextBlock Text="{loc:Translate '连接方式'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  797. <ComboBox ItemsSource="{Binding Source={StaticResource FeederConnectTypeEnum}}"
  798. SelectedItem="{Binding SelectedFeeder.ConnectType}"
  799. Width="100" Padding="4,2"/>
  800. </StackPanel>
  801. <!-- IP -->
  802. <StackPanel Orientation="Vertical" Margin="0,0,10,0">
  803. <TextBlock Text="{loc:Translate 'IP 地址'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  804. <TextBox Text="{Binding SelectedFeeder.IP}" Width="130" Padding="4,2"/>
  805. </StackPanel>
  806. <!-- 端口 -->
  807. <StackPanel Orientation="Vertical" Margin="0,0,10,0">
  808. <TextBlock Text="{loc:Translate '端口'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  809. <TextBox Text="{Binding SelectedFeeder.Port}" Width="70" Padding="4,2"/>
  810. </StackPanel>
  811. <!-- 串口号(仅支持 COM 连接的品牌显示;Team 只走 TCP) -->
  812. <StackPanel Orientation="Vertical" Margin="0,0,10,0"
  813. Visibility="{Binding ShowSerialConnection, Converter={StaticResource BoolToVis}}">
  814. <TextBlock Text="{loc:Translate '串口号'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  815. <TextBox Text="{Binding SelectedFeeder.SerialPortName}" Width="80" Padding="4,2"/>
  816. </StackPanel>
  817. <!-- 波特率(仅支持 COM 连接的品牌显示) -->
  818. <StackPanel Orientation="Vertical"
  819. Visibility="{Binding ShowSerialConnection, Converter={StaticResource BoolToVis}}">
  820. <TextBlock Text="{loc:Translate '波特率'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
  821. <TextBox Text="{Binding SelectedFeeder.BaudRate}" Width="80" Padding="4,2"/>
  822. </StackPanel>
  823. </StackPanel>
  824. </Grid>
  825. </Border>
  826. <!-- 主调试区:单 ContentControl 承载选中供料器类型的调试页(FeederDebugPageFactory 恒返回:Team→库内 DefaultFeederDebugPage,Afag→专属页);未选设备时显示提示 -->
  827. <Grid Grid.Row="2">
  828. <TextBlock Text="{loc:Translate '选择设备后显示调试页'}"
  829. HorizontalAlignment="Center" VerticalAlignment="Center"
  830. Foreground="{DynamicResource SecondaryTextBrush}"/>
  831. <ContentControl Content="{Binding CurrentFeederDebugPage}" Focusable="False"/>
  832. </Grid>
  833. <!-- 底部:收发通讯日志 (SendLog / ReceiveLog) -->
  834. <Border Grid.Row="3" Background="{DynamicResource RegionBrush}" CornerRadius="8"
  835. Padding="8" Margin="0,8,0,0" Height="170">
  836. <Grid>
  837. <Grid.RowDefinitions>
  838. <RowDefinition Height="Auto"/>
  839. <RowDefinition Height="*"/>
  840. </Grid.RowDefinitions>
  841. <StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,6">
  842. <TextBlock Text="{loc:Translate '📡 收发日志 (SendLog / ReceiveLog)'}" FontWeight="Bold" VerticalAlignment="Center"/>
  843. <Button Content="{loc:Translate '清空'}" Command="{Binding ClearCommLogCommand}"
  844. Style="{StaticResource ButtonDefault}" Margin="12,0,0,0" Padding="10,2"/>
  845. </StackPanel>
  846. <ListBox Grid.Row="1" ItemsSource="{Binding CommLogs}" Background="Transparent" BorderThickness="0"
  847. ScrollViewer.HorizontalScrollBarVisibility="Auto" FontFamily="Consolas" FontSize="12">
  848. <ListBox.ItemTemplate>
  849. <DataTemplate>
  850. <StackPanel Orientation="Horizontal">
  851. <TextBlock Text="{Binding TimeText}" Foreground="{DynamicResource SecondaryTextBrush}" Margin="0,0,8,0"/>
  852. <TextBlock Text="{Binding Direction}" Width="46" Margin="0,0,8,0">
  853. <TextBlock.Style>
  854. <Style TargetType="TextBlock">
  855. <Setter Property="Foreground" Value="{DynamicResource PrimaryBrush}"/>
  856. <Style.Triggers>
  857. <DataTrigger Binding="{Binding IsSend}" Value="False">
  858. <Setter Property="Foreground" Value="#FF8C00"/>
  859. </DataTrigger>
  860. </Style.Triggers>
  861. </Style>
  862. </TextBlock.Style>
  863. </TextBlock>
  864. <TextBlock Text="{Binding Content}" Foreground="{DynamicResource PrimaryTextBrush}"/>
  865. </StackPanel>
  866. </DataTemplate>
  867. </ListBox.ItemTemplate>
  868. </ListBox>
  869. </Grid>
  870. </Border>
  871. </Grid>
  872. <!-- ========== 全局固定变量(Global 作用域,不随产品变) ========== -->
  873. <Grid>
  874. <Grid.Style>
  875. <Style TargetType="Grid">
  876. <Setter Property="Visibility" Value="Collapsed"/>
  877. <Style.Triggers>
  878. <DataTrigger Binding="{Binding SelectedSection}" Value="GlobalVariable">
  879. <Setter Property="Visibility" Value="Visible"/>
  880. </DataTrigger>
  881. </Style.Triggers>
  882. </Style>
  883. </Grid.Style>
  884. <Grid.RowDefinitions>
  885. <RowDefinition Height="Auto"/>
  886. <RowDefinition Height="*"/>
  887. </Grid.RowDefinitions>
  888. <!-- 标题 + 保存 -->
  889. <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
  890. CornerRadius="8" Padding="12,8" Margin="0,0,0,8">
  891. <DockPanel LastChildFill="False">
  892. <TextBlock DockPanel.Dock="Left" VerticalAlignment="Center" FontSize="13" FontWeight="Bold"
  893. Foreground="{DynamicResource PrimaryBrush}"
  894. Text="{loc:Translate '全局固定变量(不随产品变);产品级变量请在产品右键菜单的全局变量中配置'}"/>
  895. <Button DockPanel.Dock="Right" Content="{loc:Translate '💾 保存'}"
  896. Command="{Binding SaveGlobalVarsCommand}"
  897. Style="{StaticResource ButtonPrimary}" Padding="12,4" FontSize="12"/>
  898. </DockPanel>
  899. </Border>
  900. <!-- 复用编辑器(绑定 Global 作用域工作集) -->
  901. <views:GlobalVarEditorView Grid.Row="1" DataContext="{Binding GlobalVarEditor}"/>
  902. </Grid>
  903. <!-- ========== 全局事件 ========== -->
  904. <DockPanel>
  905. <DockPanel.Style>
  906. <Style TargetType="DockPanel">
  907. <Setter Property="Visibility" Value="Collapsed"/>
  908. <Style.Triggers>
  909. <DataTrigger Binding="{Binding SelectedSection}" Value="GlobalEvent">
  910. <Setter Property="Visibility" Value="Visible"/>
  911. </DataTrigger>
  912. </Style.Triggers>
  913. </Style>
  914. </DockPanel.Style>
  915. <!-- 底部固定操作按钮 -->
  916. <Border DockPanel.Dock="Bottom" Background="{DynamicResource SecondaryRegionBrush}"
  917. CornerRadius="8" Padding="16" Margin="0,8,0,0">
  918. <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
  919. <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveGlobalEventConfigCommand}"
  920. Style="{StaticResource ButtonPrimary}" FontSize="14" Margin="0,0,8,0"/>
  921. <Button Content="{loc:Translate '📂 加载配置'}" Command="{Binding LoadGlobalEventConfigCommand}"
  922. Style="{StaticResource ButtonDefault}" FontSize="14"/>
  923. </StackPanel>
  924. </Border>
  925. <!-- 可滚动内容 -->
  926. <ScrollViewer VerticalScrollBarVisibility="Auto">
  927. <StackPanel Margin="8">
  928. <!-- 心跳配置 -->
  929. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  930. <DockPanel Margin="16">
  931. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '(1) 全局心跳配置'}" FontSize="16" FontWeight="Bold"
  932. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
  933. <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,8">
  934. <Button Content="{loc:Translate '➕ 添加心跳'}" Command="{Binding AddHeartbeatCommand}"
  935. Style="{StaticResource ButtonPrimary}" Padding="12,4" FontSize="12" Margin="0,0,8,0"/>
  936. </StackPanel>
  937. <DataGrid ItemsSource="{Binding GlobalEventConfig.Heartbeats}" AutoGenerateColumns="False"
  938. CanUserAddRows="False" HeadersVisibility="All" GridLinesVisibility="Horizontal"
  939. AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}" MaxHeight="220">
  940. <DataGrid.Columns>
  941. <DataGridCheckBoxColumn Header="{loc:Translate '启用'}" Binding="{Binding Enabled}" Width="60"/>
  942. <DataGridTextColumn Header="{loc:Translate '设备名称'}" Binding="{Binding DeviceName}" Width="160"/>
  943. <DataGridTextColumn Header="{loc:Translate '设备类型'}" Binding="{Binding DeviceType}" Width="120"/>
  944. <DataGridTextColumn Header="{loc:Translate '间隔(ms)'}" Binding="{Binding IntervalMs}" Width="100"/>
  945. <DataGridTextColumn Header="{loc:Translate '超时(ms)'}" Binding="{Binding TimeoutMs}" Width="100"/>
  946. <DataGridTemplateColumn Header="{loc:Translate '操作'}" Width="80">
  947. <DataGridTemplateColumn.CellTemplate>
  948. <DataTemplate>
  949. <Button Content="{loc:Translate '删除'}" Command="{Binding DataContext.RemoveHeartbeatCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
  950. CommandParameter="{Binding}"
  951. Style="{StaticResource ButtonDanger}" Padding="8,2" FontSize="11"/>
  952. </DataTemplate>
  953. </DataGridTemplateColumn.CellTemplate>
  954. </DataGridTemplateColumn>
  955. </DataGrid.Columns>
  956. </DataGrid>
  957. </DockPanel>
  958. </Border>
  959. <!-- 产品切换事件 -->
  960. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  961. <DockPanel Margin="16">
  962. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '(2) 产品切换事件'}" FontSize="16" FontWeight="Bold"
  963. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
  964. <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,8">
  965. <Button Content="{loc:Translate '➕ 添加产品切换'}" Command="{Binding AddProductSwitchEventCommand}"
  966. Style="{StaticResource ButtonPrimary}" Padding="12,4" FontSize="12" Margin="0,0,8,0"/>
  967. </StackPanel>
  968. <DataGrid ItemsSource="{Binding GlobalEventConfig.ProductSwitchEvents}" AutoGenerateColumns="False"
  969. CanUserAddRows="False" HeadersVisibility="All" GridLinesVisibility="Horizontal"
  970. AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}" MaxHeight="220">
  971. <DataGrid.Columns>
  972. <DataGridTextColumn Header="{loc:Translate '序号'}" Binding="{Binding Sequence}" Width="60"/>
  973. <DataGridTextColumn Header="{loc:Translate '产品名称'}" Binding="{Binding ProductName}" Width="180"/>
  974. <DataGridTemplateColumn Header="{loc:Translate '操作'}" Width="80">
  975. <DataGridTemplateColumn.CellTemplate>
  976. <DataTemplate>
  977. <Button Content="{loc:Translate '删除'}" Command="{Binding DataContext.RemoveProductSwitchEventCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
  978. CommandParameter="{Binding}"
  979. Style="{StaticResource ButtonDanger}" Padding="8,2" FontSize="11"/>
  980. </DataTemplate>
  981. </DataGridTemplateColumn.CellTemplate>
  982. </DataGridTemplateColumn>
  983. </DataGrid.Columns>
  984. </DataGrid>
  985. </DockPanel>
  986. </Border>
  987. </StackPanel>
  988. </ScrollViewer>
  989. </DockPanel>
  990. <!-- ========== 通用设置 ========== -->
  991. <DockPanel>
  992. <DockPanel.Style>
  993. <Style TargetType="DockPanel">
  994. <Setter Property="Visibility" Value="Collapsed"/>
  995. <Style.Triggers>
  996. <DataTrigger Binding="{Binding SelectedSection}" Value="General">
  997. <Setter Property="Visibility" Value="Visible"/>
  998. </DataTrigger>
  999. </Style.Triggers>
  1000. </Style>
  1001. </DockPanel.Style>
  1002. <!-- 底部固定操作按钮 -->
  1003. <Border DockPanel.Dock="Bottom" Background="{DynamicResource SecondaryRegionBrush}"
  1004. CornerRadius="8" Padding="16" Margin="0,8,0,0">
  1005. <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
  1006. <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveSystemConfigCommand}"
  1007. Style="{StaticResource ButtonPrimary}" FontSize="14" Margin="0,0,8,0"/>
  1008. <Button Content="{loc:Translate '📂 加载配置'}" Command="{Binding LoadSystemConfigCommand}"
  1009. Style="{StaticResource ButtonDefault}" FontSize="14"/>
  1010. </StackPanel>
  1011. </Border>
  1012. <!-- 可滚动内容 -->
  1013. <ScrollViewer VerticalScrollBarVisibility="Auto">
  1014. <StackPanel Margin="8">
  1015. <!-- 应用信息 -->
  1016. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  1017. <DockPanel Margin="16">
  1018. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '应用信息'}" FontSize="16" FontWeight="Bold"
  1019. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
  1020. <Grid>
  1021. <Grid.ColumnDefinitions>
  1022. <ColumnDefinition Width="Auto"/>
  1023. <ColumnDefinition Width="*"/>
  1024. <ColumnDefinition Width="Auto"/>
  1025. <ColumnDefinition Width="*"/>
  1026. </Grid.ColumnDefinitions>
  1027. <Grid.RowDefinitions>
  1028. <RowDefinition Height="Auto"/>
  1029. <RowDefinition Height="Auto"/>
  1030. <RowDefinition Height="Auto"/>
  1031. </Grid.RowDefinitions>
  1032. <TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Translate '软件标题:'}" FontSize="13"
  1033. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1034. <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding SystemConfig.Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1035. FontSize="13" Margin="0,0,0,12"/>
  1036. <TextBlock Grid.Row="0" Grid.Column="2" Text="{loc:Translate '公司/品牌:'}" FontSize="13"
  1037. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1038. <TextBox Grid.Row="0" Grid.Column="3" Text="{Binding SystemConfig.CompanyTitle, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1039. FontSize="13" Margin="0,0,0,12"/>
  1040. <TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Translate '软件版本:'}" FontSize="13"
  1041. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1042. <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding SystemConfig.SoftwareVersion}"
  1043. FontSize="13" FontWeight="Bold" Foreground="{DynamicResource PrimaryBrush}"
  1044. VerticalAlignment="Center" Margin="0,0,0,12"/>
  1045. </Grid>
  1046. </DockPanel>
  1047. </Border>
  1048. <!-- 视觉引擎(画面数/排列/名称已移至 产品管理,跟产品走) -->
  1049. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  1050. <DockPanel Margin="16">
  1051. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '👁 视觉引擎'}" FontSize="16" FontWeight="Bold"
  1052. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
  1053. <Grid>
  1054. <Grid.ColumnDefinitions>
  1055. <ColumnDefinition Width="Auto"/>
  1056. <ColumnDefinition Width="*"/>
  1057. </Grid.ColumnDefinitions>
  1058. <TextBlock Grid.Column="0" Text="{loc:Translate '视觉引擎:'}" FontSize="13"
  1059. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,0"/>
  1060. <ComboBox Grid.Column="1"
  1061. ItemsSource="{Binding AvailableEngines}"
  1062. SelectedItem="{Binding SelectedEngine, Mode=TwoWay}"
  1063. DisplayMemberPath="EngineName"
  1064. FontSize="13" MinWidth="260" HorizontalAlignment="Left"
  1065. VerticalAlignment="Center"
  1066. ToolTip="{loc:Translate '反射探测到的可用引擎,切换后主页画面与标定页随引擎变化'}"/>
  1067. </Grid>
  1068. </DockPanel>
  1069. </Border>
  1070. <!-- 语言设置 -->
  1071. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  1072. <DockPanel Margin="16">
  1073. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '🌍 语言设置'}" FontSize="16" FontWeight="Bold"
  1074. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
  1075. <Grid>
  1076. <Grid.ColumnDefinitions>
  1077. <ColumnDefinition Width="Auto"/>
  1078. <ColumnDefinition Width="Auto"/>
  1079. <ColumnDefinition Width="Auto"/>
  1080. </Grid.ColumnDefinitions>
  1081. <TextBlock Grid.Column="0" Text="{loc:Translate '界面语言:'}" FontSize="13"
  1082. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,0"/>
  1083. <ComboBox Grid.Column="1"
  1084. ItemsSource="{Binding AvailableLanguages}"
  1085. SelectedItem="{Binding SelectedLanguage, Mode=TwoWay}"
  1086. DisplayMemberPath="DisplayName"
  1087. FontSize="13"
  1088. MinWidth="200"
  1089. HorizontalAlignment="Left"/>
  1090. <Button Grid.Column="2" Content="{loc:Translate '🔄 刷新语言列表'}"
  1091. Command="{Binding RefreshLanguagesCommand}"
  1092. Style="{StaticResource ButtonDefault}"
  1093. FontSize="13"
  1094. Margin="15,0,0,0"
  1095. HorizontalAlignment="Left"
  1096. ToolTip="重新扫描 Localization 目录,发现新添加的语言"/>
  1097. </Grid>
  1098. </DockPanel>
  1099. </Border>
  1100. <!-- 插件日志 -->
  1101. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  1102. <DockPanel Margin="16">
  1103. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '📝 日志设置'}" FontSize="16" FontWeight="Bold"
  1104. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
  1105. <Grid>
  1106. <Grid.ColumnDefinitions>
  1107. <ColumnDefinition Width="Auto"/>
  1108. <ColumnDefinition Width="*"/>
  1109. </Grid.ColumnDefinitions>
  1110. <Grid.RowDefinitions>
  1111. <RowDefinition Height="Auto"/>
  1112. <RowDefinition Height="Auto"/>
  1113. <RowDefinition Height="Auto"/>
  1114. <RowDefinition Height="Auto"/>
  1115. <RowDefinition Height="Auto"/>
  1116. <RowDefinition Height="Auto"/>
  1117. <RowDefinition Height="Auto"/>
  1118. </Grid.RowDefinitions>
  1119. <TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Translate '日志根目录:'}" FontSize="13"
  1120. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
  1121. <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.RootPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1122. FontSize="13" Margin="0,0,0,10" MinWidth="200" Width="auto" HorizontalAlignment="Left"
  1123. ToolTip="{loc:Translate '程序目录下的相对子目录(默认 Logs),也可填绝对路径'}"/>
  1124. <TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Translate '公共日志公式:'}" FontSize="13"
  1125. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
  1126. <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.CommonPattern, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1127. FontSize="13" Margin="0,0,0,10" FontFamily="Consolas" MinWidth="200" Width="auto" HorizontalAlignment="Left"
  1128. ToolTip="{loc:Translate '占位符:{root} {flow} {task} {year} {month} {day} {time} {timestamp};默认 年\时间.log,1/2级日志写入此处'}"/>
  1129. <TextBlock Grid.Row="2" Grid.Column="0" Text="{loc:Translate '任务日志公式:'}" FontSize="13"
  1130. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
  1131. <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.TaskPattern, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1132. FontSize="13" Margin="0,0,0,10" FontFamily="Consolas" MinWidth="200" Width="auto" HorizontalAlignment="Left"
  1133. ToolTip="{loc:Translate '默认 流程名\任务名\年\时间.log,3/4级日志写入此处'}"/>
  1134. <TextBlock Grid.Row="3" Grid.Column="0" Text="{loc:Translate '默认存储详细度:'}" FontSize="13"
  1135. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
  1136. <ComboBox Grid.Row="3" Grid.Column="1" ItemsSource="{Binding LogVerbosities}"
  1137. SelectedItem="{Binding SystemConfig.PluginLog.DefaultStoreVerbosity, Mode=TwoWay}"
  1138. FontSize="13" HorizontalAlignment="Left" MinWidth="200" Width="auto" Margin="0,0,0,10"
  1139. ToolTip="{loc:Translate '新建插件默认「日志存储」详细度:粗略=只写公共日志(L1/L2);详细=额外写 流程/任务 独立日志(L3/L4)'}"/>
  1140. <TextBlock Grid.Row="4" Grid.Column="0" Text="{loc:Translate '默认显示详细度:'}" FontSize="13"
  1141. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
  1142. <ComboBox Grid.Row="4" Grid.Column="1" ItemsSource="{Binding LogVerbosities}"
  1143. SelectedItem="{Binding SystemConfig.PluginLog.DefaultDisplayVerbosity, Mode=TwoWay}"
  1144. FontSize="13" HorizontalAlignment="Left" MinWidth="200" Width="auto" Margin="0,0,0,10"
  1145. ToolTip="{loc:Translate '新建插件默认「日志显示」详细度:粗略=实时日志只显 L1/L2;详细=额外显 L3/L4(独立于存储)'}"/>
  1146. <TextBlock Grid.Row="5" Grid.Column="0" Text="{loc:Translate '单文件上限(MB):'}" FontSize="13"
  1147. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
  1148. <TextBox Grid.Row="5" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.MaxFileMB, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1149. FontSize="13" Margin="0,0,0,10" MinWidth="200" Width="auto" HorizontalAlignment="Left"
  1150. ToolTip="{loc:Translate '单个日志文件超过该大小(MB)自动归档;0 表示不按大小切分'}"/>
  1151. <TextBlock Grid.Row="6" Grid.Column="0" Text="{loc:Translate '日志保留天数:'}" FontSize="13"
  1152. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,0"/>
  1153. <TextBox Grid.Row="6" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.RetentionDays, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1154. FontSize="13" MinWidth="200" Width="auto" HorizontalAlignment="Left"
  1155. ToolTip="{loc:Translate '超过该天数的归档日志由 NLog 自动删除;0 表示不删除'}"/>
  1156. </Grid>
  1157. </DockPanel>
  1158. </Border>
  1159. <!-- 顶部栏 &amp; 导航按钮尺寸 -->
  1160. <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
  1161. <DockPanel Margin="16">
  1162. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '顶部栏、标题 &amp; 状态栏'}" FontSize="16" FontWeight="Bold"
  1163. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
  1164. <Grid>
  1165. <Grid.ColumnDefinitions>
  1166. <ColumnDefinition Width="Auto"/>
  1167. <ColumnDefinition Width="*"/>
  1168. <ColumnDefinition Width="Auto"/>
  1169. <ColumnDefinition Width="*"/>
  1170. </Grid.ColumnDefinitions>
  1171. <Grid.RowDefinitions>
  1172. <RowDefinition Height="Auto"/>
  1173. <RowDefinition Height="Auto"/>
  1174. <RowDefinition Height="Auto"/>
  1175. <RowDefinition Height="Auto"/>
  1176. <RowDefinition Height="Auto"/>
  1177. </Grid.RowDefinitions>
  1178. <TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Translate '顶栏高度:'}" FontSize="13"
  1179. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1180. <hc:NumericUpDown Grid.Row="0" Grid.Column="1"
  1181. Value="{Binding SystemConfig.Font.TopBarHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1182. Minimum="50" Maximum="120" Increment="2"
  1183. FontSize="13" Margin="0,0,0,12"/>
  1184. <TextBlock Grid.Row="0" Grid.Column="2" Text="{loc:Translate '中心标题字号:'}" FontSize="13"
  1185. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1186. <hc:NumericUpDown Grid.Row="0" Grid.Column="3"
  1187. Value="{Binding SystemConfig.Font.CenterTitleFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1188. Minimum="12" Maximum="48" Increment="1"
  1189. FontSize="13" Margin="0,0,0,12"/>
  1190. <TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Translate '状态栏高度:'}" FontSize="13"
  1191. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1192. <hc:NumericUpDown Grid.Row="1" Grid.Column="1"
  1193. Value="{Binding SystemConfig.Font.StatusBarHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1194. Minimum="30" Maximum="100" Increment="2"
  1195. FontSize="13" Margin="0,0,0,12"/>
  1196. <TextBlock Grid.Row="1" Grid.Column="2" Text="{loc:Translate '状态栏字号:'}" FontSize="13"
  1197. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1198. <hc:NumericUpDown Grid.Row="1" Grid.Column="3"
  1199. Value="{Binding SystemConfig.Font.StatusBarFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1200. Minimum="9" Maximum="18" Increment="1"
  1201. FontSize="13" Margin="0,0,0,12"/>
  1202. <TextBlock Grid.Row="2" Grid.Column="0" Text="{loc:Translate '按钮宽度:'}" FontSize="13"
  1203. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1204. <hc:NumericUpDown Grid.Row="2" Grid.Column="1"
  1205. Value="{Binding SystemConfig.Font.NavButtonWidth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1206. Minimum="60" Maximum="160" Increment="4"
  1207. FontSize="13" Margin="0,0,0,12"/>
  1208. <TextBlock Grid.Row="2" Grid.Column="2" Text="{loc:Translate '按钮高度:'}" FontSize="13"
  1209. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1210. <hc:NumericUpDown Grid.Row="2" Grid.Column="3"
  1211. Value="{Binding SystemConfig.Font.NavButtonHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1212. Minimum="50" Maximum="120" Increment="2"
  1213. FontSize="13" Margin="0,0,0,12"/>
  1214. <TextBlock Grid.Row="3" Grid.Column="0" Text="{loc:Translate '按钮字体:'}" FontSize="13"
  1215. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1216. <hc:NumericUpDown Grid.Row="3" Grid.Column="1"
  1217. Value="{Binding SystemConfig.Font.NavButtonFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1218. Minimum="10" Maximum="28" Increment="1"
  1219. FontSize="13" Margin="0,0,0,12"/>
  1220. <TextBlock Grid.Row="3" Grid.Column="2" Text="{loc:Translate '主题图标字号:'}" FontSize="13"
  1221. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
  1222. <hc:NumericUpDown Grid.Row="3" Grid.Column="3"
  1223. Value="{Binding SystemConfig.Font.ThemeIconSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1224. Minimum="12" Maximum="40" Increment="1"
  1225. FontSize="13" Margin="0,0,0,12"/>
  1226. <TextBlock Grid.Row="4" Grid.Column="0" Text="{loc:Translate '图标尺寸:'}" FontSize="13"
  1227. Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,0"/>
  1228. <hc:NumericUpDown Grid.Row="4" Grid.Column="1"
  1229. Value="{Binding SystemConfig.Font.NavIconSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  1230. Minimum="16" Maximum="48" Increment="2"
  1231. FontSize="13" Margin="0,0,0,0"/>
  1232. </Grid>
  1233. </DockPanel>
  1234. </Border>
  1235. </StackPanel>
  1236. </ScrollViewer>
  1237. </DockPanel>
  1238. <!-- ========== 通讯管理 ========== -->
  1239. <Grid>
  1240. <Grid.Style>
  1241. <Style TargetType="Grid">
  1242. <Setter Property="Visibility" Value="Collapsed"/>
  1243. <Style.Triggers>
  1244. <DataTrigger Binding="{Binding IsCommSection}" Value="True">
  1245. <Setter Property="Visibility" Value="Visible"/>
  1246. </DataTrigger>
  1247. </Style.Triggers>
  1248. </Style>
  1249. </Grid.Style>
  1250. <Grid.RowDefinitions>
  1251. <RowDefinition Height="Auto"/>
  1252. <RowDefinition Height="*"/>
  1253. </Grid.RowDefinitions>
  1254. <!-- 工具栏 -->
  1255. <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
  1256. CornerRadius="8" Padding="12,8" Margin="0,0,0,12">
  1257. <StackPanel Orientation="Horizontal">
  1258. <!-- 基础Tab: 选择类型 -->
  1259. <StackPanel Orientation="Horizontal">
  1260. <StackPanel.Style>
  1261. <Style TargetType="StackPanel">
  1262. <Setter Property="Visibility" Value="Visible"/>
  1263. <Style.Triggers>
  1264. <DataTrigger Binding="{Binding IsPlcTab}" Value="True">
  1265. <Setter Property="Visibility" Value="Collapsed"/>
  1266. </DataTrigger>
  1267. </Style.Triggers>
  1268. </Style>
  1269. </StackPanel.Style>
  1270. <TextBlock Text="{loc:Translate '类型:'}" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}"
  1271. VerticalAlignment="Center" Margin="0,0,4,0"/>
  1272. <ComboBox ItemsSource="{Binding BasicCommTypes}"
  1273. SelectedValuePath="TypeKey"
  1274. SelectedIndex="0"
  1275. SelectedValue="{Binding AddTypeKey}"
  1276. DisplayMemberPath="DisplayName"
  1277. MinWidth="140" Padding="4,3" Margin="0,0,8,0"
  1278. VerticalAlignment="Center"/>
  1279. </StackPanel>
  1280. <!-- PLC Tab: 选择协议 -->
  1281. <StackPanel Orientation="Horizontal">
  1282. <StackPanel.Style>
  1283. <Style TargetType="StackPanel">
  1284. <Setter Property="Visibility" Value="Collapsed"/>
  1285. <Style.Triggers>
  1286. <DataTrigger Binding="{Binding IsPlcTab}" Value="True">
  1287. <Setter Property="Visibility" Value="Visible"/>
  1288. </DataTrigger>
  1289. </Style.Triggers>
  1290. </Style>
  1291. </StackPanel.Style>
  1292. <TextBlock Text="{loc:Translate '协议:'}" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}"
  1293. VerticalAlignment="Center" Margin="0,0,4,0"/>
  1294. <ComboBox ItemsSource="{Binding PlcTypes}"
  1295. SelectedIndex="0"
  1296. SelectedItem="{Binding SelectedPlcType}"
  1297. DisplayMemberPath="DisplayName"
  1298. MinWidth="140" Padding="4,3" Margin="0,0,8,0"
  1299. VerticalAlignment="Center"/>
  1300. </StackPanel>
  1301. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
  1302. <Button Content="{loc:Translate '➕ 添加'}" Style="{StaticResource ButtonPrimary}" Margin="8,0,4,0" Padding="12,4"
  1303. Command="{Binding AddCommunicationCommand}"/>
  1304. <Button Content="{loc:Translate '🗑 删除'}" Style="{StaticResource ButtonDanger}" Margin="4,0,8,0" Padding="12,4"
  1305. Command="{Binding DeleteCommunicationCommand}"
  1306. IsEnabled="{Binding HasSelectedCommunication}"/>
  1307. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
  1308. <Button Content="{loc:Translate '🔗 连接'}" Style="{StaticResource ButtonDefault}" Margin="8,0,4,0" Padding="10,4"
  1309. Command="{Binding ConnectCommunicationCommand}"
  1310. IsEnabled="{Binding HasSelectedCommunication}"/>
  1311. <Button Content="{loc:Translate '⛓ 断开'}" Style="{StaticResource ButtonDefault}" Margin="4,0,8,0" Padding="10,4"
  1312. Command="{Binding DisconnectCommunicationCommand}"
  1313. IsEnabled="{Binding HasSelectedCommunication}"/>
  1314. <Button Content="{loc:Translate '🔗 全部连接'}" Style="{StaticResource ButtonDefault}" Margin="0,0,4,0" Padding="10,4"
  1315. Command="{Binding ConnectAllCommand}"/>
  1316. <Button Content="{loc:Translate '⛓ 全部断开'}" Style="{StaticResource ButtonDefault}" Margin="4,0,8,0" Padding="10,4"
  1317. Command="{Binding DisconnectAllCommand}"/>
  1318. <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
  1319. <Button Content="{loc:Translate '💾 保存配置'}" Style="{StaticResource ButtonDefault}" Margin="8,0,0,0" Padding="12,4"
  1320. Command="{Binding SaveCommunicationsCommand}"/>
  1321. </StackPanel>
  1322. </Border>
  1323. <!-- 列表 + 编辑区 -->
  1324. <Grid Grid.Row="1" Margin="0,10,0,0">
  1325. <Grid.ColumnDefinitions>
  1326. <ColumnDefinition Width="200"/>
  1327. <ColumnDefinition Width="8"/>
  1328. <ColumnDefinition Width="320"/>
  1329. <ColumnDefinition Width="8"/>
  1330. <ColumnDefinition Width="*"/>
  1331. </Grid.ColumnDefinitions>
  1332. <!-- 左:通讯列表 -->
  1333. <Border Grid.Column="0" Background="{DynamicResource RegionBrush}"
  1334. BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" CornerRadius="6">
  1335. <DockPanel>
  1336. <TextBlock DockPanel.Dock="Top" Text="{Binding CommTabDisplayText}" FontSize="13" FontWeight="Bold"
  1337. Foreground="{DynamicResource PrimaryTextBrush}" Margin="12,10,12,8"/>
  1338. <ListBox ItemsSource="{Binding DisplayedCommunications}"
  1339. SelectedItem="{Binding SelectedCommunication}"
  1340. BorderThickness="0" Background="Transparent"
  1341. ScrollViewer.HorizontalScrollBarVisibility="Disabled">
  1342. <ListBox.ItemTemplate>
  1343. <DataTemplate>
  1344. <StackPanel Margin="4,6">
  1345. <DockPanel>
  1346. <Border DockPanel.Dock="Right" CornerRadius="8"
  1347. Background="{DynamicResource SecondaryRegionBrush}"
  1348. Padding="8,2" VerticalAlignment="Center">
  1349. <TextBlock FontSize="11">
  1350. <TextBlock.Style>
  1351. <Style TargetType="TextBlock">
  1352. <Setter Property="Text" Value="未连接"/>
  1353. <Setter Property="Foreground" Value="{DynamicResource SecondaryTextBrush}"/>
  1354. <Style.Triggers>
  1355. <DataTrigger Binding="{Binding IsConnected}" Value="True">
  1356. <Setter Property="Text" Value="已连接"/>
  1357. <Setter Property="Foreground" Value="#4CAF50"/>
  1358. </DataTrigger>
  1359. </Style.Triggers>
  1360. </Style>
  1361. </TextBlock.Style>
  1362. </TextBlock>
  1363. </Border>
  1364. <TextBlock Text="{Binding Name}" FontSize="13" FontWeight="Bold"
  1365. Foreground="{DynamicResource PrimaryTextBrush}"
  1366. TextTrimming="CharacterEllipsis"/>
  1367. </DockPanel>
  1368. <TextBlock Text="{Binding EndpointUrl}" FontSize="11" Margin="0,3,0,0"
  1369. Foreground="{DynamicResource SecondaryTextBrush}"
  1370. TextTrimming="CharacterEllipsis"/>
  1371. </StackPanel>
  1372. </DataTemplate>
  1373. </ListBox.ItemTemplate>
  1374. </ListBox>
  1375. </DockPanel>
  1376. </Border>
  1377. <!-- 中:属性编辑区 -->
  1378. <Border Grid.Column="2" Background="{DynamicResource RegionBrush}"
  1379. BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" CornerRadius="6"
  1380. IsEnabled="{Binding IsPropertyGridEnabled}">
  1381. <DockPanel Margin="8,8">
  1382. <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '属性配置'}" FontSize="13" FontWeight="Bold"
  1383. Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
  1384. <TextBlock DockPanel.Dock="Bottom" Text="{Binding CommMessage}" FontSize="11"
  1385. TextWrapping="Wrap"
  1386. Foreground="{DynamicResource PrimaryBrush}" Margin="0,6,0,0"/>
  1387. <pg:PropertyGrid SelectedObject="{Binding PropertyGridSelectedObject}"
  1388. ShowSearchBar="True"
  1389. ShowDescription="True"/>
  1390. </DockPanel>
  1391. </Border>
  1392. <!-- 右:调试页宿主(CommunicationDebugPageFactory 创建品牌专属页或库内 DefaultCommunicationDebugPage,恒非空) -->
  1393. <Border Grid.Column="4" Background="{DynamicResource RegionBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" CornerRadius="6">
  1394. <ContentControl Content="{Binding CurrentCommunicationDebugPage}" Focusable="False"/>
  1395. </Border>
  1396. </Grid>
  1397. </Grid>
  1398. </Grid>
  1399. </Grid>
  1400. </UserControl>