VisionDynamicAccuracyAnalyzer.xaml 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. <UserControl x:Class="TeamAAS_VP.Views.Product.VisionDynamicAccuracyAnalyzer"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:prism="http://prismlibrary.com/"
  5. xmlns:wf="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
  6. xmlns:vp="clr-namespace:Cognex.VisionPro;assembly=Cognex.VisionPro.Controls"
  7. xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
  8. xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
  9. xmlns:sys="clr-namespace:System;assembly=mscorlib"
  10. xmlns:uControl="clr-namespace:TeamAAS_VP.Controls"
  11. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  12. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  13. xmlns:vm="clr-namespace:TeamAAS_VP.ViewModels.Product"
  14. xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
  15. xmlns:lex="http://wpflocalizeextension.codeplex.com"
  16. lex:LocalizeDictionary.DesignCulture="zh-CN"
  17. lex:ResxLocalizationProvider.DefaultAssembly="TeamAAS-VP"
  18. lex:ResxLocalizationProvider.DefaultDictionary="Lang"
  19. prism:ViewModelLocator.AutoWireViewModel="True"
  20. mc:Ignorable="d"
  21. d:DataContext="{d:DesignInstance Type=vm:VisionDynamicAccuracyAnalyzerViewModel}"
  22. d:Height="700"
  23. d:Width="1100"
  24. MinHeight="750"
  25. MinWidth="1000"
  26. d:Background="White"
  27. HorizontalAlignment="Stretch"
  28. VerticalAlignment="Stretch"
  29. FontFamily="{DynamicResource DefaultFont}">
  30. <prism:Dialog.WindowStyle>
  31. <Style TargetType="Window">
  32. <Setter Property="prism:Dialog.WindowStartupLocation"
  33. Value="CenterScreen" />
  34. <Setter Property="AllowDrop"
  35. Value="True" />
  36. <Setter Property="ShowInTaskbar"
  37. Value="True" />
  38. <Setter Property="WindowState"
  39. Value="Maximized" />
  40. <Setter Property="Topmost"
  41. Value="True" />
  42. </Style>
  43. </prism:Dialog.WindowStyle>
  44. <UserControl.Resources>
  45. <!-- 复用静态测试的样式 -->
  46. <Style TargetType="Button"
  47. BasedOn="{StaticResource MaterialDesignFlatDarkBgButton}">
  48. <Setter Property="Padding"
  49. Value="10 5" />
  50. <Setter Property="Margin"
  51. Value="5" />
  52. <Setter Property="FontSize"
  53. Value="14" />
  54. <Setter Property="BorderThickness"
  55. Value="0" />
  56. </Style>
  57. <Style TargetType="TextBlock">
  58. <Setter Property="VerticalAlignment"
  59. Value="Center" />
  60. <Setter Property="Margin"
  61. Value="5" />
  62. </Style>
  63. <Style TargetType="TextBox"
  64. BasedOn="{StaticResource MaterialDesignTextBox}">
  65. <Setter Property="Margin"
  66. Value="5" />
  67. <Setter Property="VerticalContentAlignment"
  68. Value="Center" />
  69. </Style>
  70. <Style x:Key="DataGridStyle"
  71. TargetType="DataGrid"
  72. BasedOn="{StaticResource MaterialDesignDataGrid}">
  73. <Setter Property="Margin"
  74. Value="5" />
  75. <Setter Property="AutoGenerateColumns"
  76. Value="False" />
  77. <Setter Property="CanUserAddRows"
  78. Value="False" />
  79. <Setter Property="CanUserDeleteRows"
  80. Value="False" />
  81. <Setter Property="IsReadOnly"
  82. Value="True" />
  83. <Setter Property="AlternatingRowBackground"
  84. Value="#F5F5F5" />
  85. </Style>
  86. <Style x:Key="TitleStyle"
  87. TargetType="TextBlock">
  88. <Setter Property="FontSize"
  89. Value="16" />
  90. <Setter Property="FontWeight"
  91. Value="Bold" />
  92. <Setter Property="Margin"
  93. Value="0 10 0 5" />
  94. <Setter Property="Foreground"
  95. Value="#2C3E50" />
  96. </Style>
  97. </UserControl.Resources>
  98. <Grid>
  99. <Grid.ColumnDefinitions>
  100. <ColumnDefinition Width="2.5*" />
  101. <ColumnDefinition Width="3.5*" />
  102. </Grid.ColumnDefinitions>
  103. <!-- 左侧控制面板 -->
  104. <Border Grid.Column="0"
  105. BorderBrush="#BDC3C7"
  106. BorderThickness="0 0 1 0">
  107. <Grid>
  108. <Grid.RowDefinitions>
  109. <RowDefinition Height="Auto" />
  110. <RowDefinition Height="Auto" />
  111. <RowDefinition Height="Auto" />
  112. <RowDefinition Height="*" />
  113. <RowDefinition Height="Auto" />
  114. </Grid.RowDefinitions>
  115. <!-- 机器人位置设置 -->
  116. <Border Grid.Row="0"
  117. Background="#ECF0F1"
  118. Padding="10">
  119. <StackPanel>
  120. <TextBlock Style="{StaticResource TitleStyle}"
  121. Text="机器人位置设置" />
  122. <Grid Margin="0 10 0 0">
  123. <Grid.RowDefinitions>
  124. <RowDefinition Height="Auto" />
  125. <RowDefinition Height="Auto" />
  126. <RowDefinition Height="Auto" />
  127. </Grid.RowDefinitions>
  128. <!-- A点坐标 -->
  129. <Grid Grid.Row="0"
  130. Margin="0 0 0 10">
  131. <Grid.ColumnDefinitions>
  132. <ColumnDefinition Width="Auto" />
  133. <ColumnDefinition Width="*" />
  134. <ColumnDefinition Width="Auto" />
  135. </Grid.ColumnDefinitions>
  136. <TextBlock Text="A点坐标:"
  137. Grid.Column="0"
  138. VerticalAlignment="Center" />
  139. <TextBox Grid.Column="1"
  140. Text="{Binding PointA, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  141. d:Text="X:0.000 Y:0.000 Z:0.000 RX:0.000 RY:0.000 RZ:0.000"
  142. ToolTip="机器人A点位置坐标"
  143. IsReadOnly="True"
  144. Background="#F8F9FA" />
  145. <Button Grid.Column="2"
  146. Content="示教"
  147. Command="{Binding TeachPointACommand}"
  148. Background="#3498DB"
  149. Foreground="White"
  150. Width="60"
  151. Margin="5,0,0,0" />
  152. </Grid>
  153. <!-- B点坐标 -->
  154. <Grid Grid.Row="1"
  155. Margin="0 0 0 10">
  156. <Grid.ColumnDefinitions>
  157. <ColumnDefinition Width="Auto" />
  158. <ColumnDefinition Width="*" />
  159. <ColumnDefinition Width="Auto" />
  160. </Grid.ColumnDefinitions>
  161. <TextBlock Text="B点坐标:"
  162. Grid.Column="0"
  163. VerticalAlignment="Center" />
  164. <TextBox Grid.Column="1"
  165. Text="{Binding PointB, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  166. d:Text="X:100.000 Y:50.000 Z:0.000 RX:0.000 RY:0.000 RZ:0.000"
  167. ToolTip="机器人B点拍照位置坐标"
  168. IsReadOnly="True"
  169. Background="#F8F9FA" />
  170. <Button Grid.Column="2"
  171. Content="示教"
  172. Command="{Binding TeachPointBCommand}"
  173. Background="#3498DB"
  174. Foreground="White"
  175. Width="60"
  176. Margin="5,0,0,0" />
  177. </Grid>
  178. <!-- 视觉流程选择 -->
  179. <Grid Grid.Row="2">
  180. <Grid.ColumnDefinitions>
  181. <ColumnDefinition Width="Auto" />
  182. <ColumnDefinition Width="*" />
  183. </Grid.ColumnDefinitions>
  184. <TextBlock Text="视觉流程:"
  185. Grid.Column="0"
  186. VerticalAlignment="Center" />
  187. <ComboBox Grid.Column="1"
  188. ItemsSource="{Binding ProcedureModels}"
  189. SelectedItem="{Binding SelectProcedure, Mode=TwoWay}"
  190. ToolTip="选择视觉处理流程">
  191. <ComboBox.ItemTemplate>
  192. <DataTemplate>
  193. <TextBlock Text="{Binding Name}" />
  194. </DataTemplate>
  195. </ComboBox.ItemTemplate>
  196. </ComboBox>
  197. </Grid>
  198. </Grid>
  199. </StackPanel>
  200. </Border>
  201. <!-- 测试参数设置 -->
  202. <Border Grid.Row="1"
  203. Background="#F8F9FA"
  204. Padding="10">
  205. <StackPanel>
  206. <TextBlock Style="{StaticResource TitleStyle}"
  207. Text="测试参数设置" />
  208. <Grid Margin="0 10 0 0">
  209. <Grid.ColumnDefinitions>
  210. <ColumnDefinition Width="*" />
  211. <ColumnDefinition Width="*" />
  212. </Grid.ColumnDefinitions>
  213. <!-- 重复次数 -->
  214. <StackPanel Grid.Column="0">
  215. <TextBlock Text="重复次数:" />
  216. <mah:NumericUpDown Value="{Binding RepeatCount, Mode=TwoWay}"
  217. Minimum="1"
  218. Maximum="1000"
  219. d:Value="50"
  220. TextAlignment="Center"
  221. HorizontalContentAlignment="Center"
  222. HorizontalAlignment="Stretch"
  223. IsEnabled="{Binding IsRunning, Converter={StaticResource InvertBooleanConverter}}" />
  224. </StackPanel>
  225. <!-- 移动速度 -->
  226. <StackPanel Grid.Column="1"
  227. Margin="10,0,0,0">
  228. <TextBlock Text="移动速度(%):" />
  229. <mah:NumericUpDown Value="{Binding MoveSpeed, Mode=TwoWay}"
  230. Minimum="1"
  231. Maximum="100"
  232. d:Value="50"
  233. TextAlignment="Center"
  234. HorizontalContentAlignment="Center"
  235. HorizontalAlignment="Stretch"
  236. IsEnabled="{Binding IsRunning, Converter={StaticResource InvertBooleanConverter}}" />
  237. </StackPanel>
  238. </Grid>
  239. </StackPanel>
  240. </Border>
  241. <!-- 测试控制区域 -->
  242. <Border Grid.Row="2"
  243. Background="#ECF0F1"
  244. Padding="10">
  245. <StackPanel>
  246. <TextBlock Style="{StaticResource TitleStyle}"
  247. Text="测试控制" />
  248. <WrapPanel HorizontalAlignment="Center"
  249. Margin="0 10 0 0">
  250. <Button Content="单次测试"
  251. Background="#3498DB"
  252. Foreground="White"
  253. MinWidth="100"
  254. Height="35"
  255. FontWeight="Bold"
  256. Command="{Binding SingleTestCommand}"
  257. IsEnabled="{Binding IsRunning, Converter={StaticResource InvertBooleanConverter}}" />
  258. <Button Content="连续测试"
  259. Background="#27AE60"
  260. Foreground="White"
  261. MinWidth="100"
  262. Height="35"
  263. FontWeight="Bold"
  264. Command="{Binding StartTestCommand}" />
  265. <Button Content="停止"
  266. Background="#E74C3C"
  267. Foreground="White"
  268. MinWidth="100"
  269. Height="35"
  270. Command="{Binding StopTestCommand}" />
  271. <Button Content="暂停"
  272. Background="#F39C12"
  273. Foreground="White"
  274. MinWidth="100"
  275. Height="35"
  276. Command="{Binding PauseTestCommand}" />
  277. </WrapPanel>
  278. </StackPanel>
  279. </Border>
  280. <!-- 进度显示 -->
  281. <Border Grid.Row="3"
  282. Background="White"
  283. Padding="10">
  284. <StackPanel>
  285. <TextBlock Style="{StaticResource TitleStyle}"
  286. Text="测试进度" />
  287. <Grid Margin="0 10 0 0">
  288. <Grid.RowDefinitions>
  289. <RowDefinition Height="Auto" />
  290. <RowDefinition Height="Auto" />
  291. </Grid.RowDefinitions>
  292. <ProgressBar Grid.Row="0"
  293. Height="25"
  294. Margin="5"
  295. Minimum="0"
  296. Maximum="{Binding RepeatCount}"
  297. Value="{Binding CurrentProgress}"
  298. IsEnabled="False"
  299. d:Maximum="100"
  300. d:Value="50" />
  301. <TextBlock Grid.Row="1"
  302. HorizontalAlignment="Center"
  303. FontSize="12"
  304. Foreground="#7F8C8D"
  305. d:Text="等待开始..."
  306. Text="{Binding Message}" />
  307. </Grid>
  308. <!-- 实时统计信息 -->
  309. <WrapPanel Margin="0 15 0 0"
  310. HorizontalAlignment="Center">
  311. <Border Background="#3498DB"
  312. Padding="10 5"
  313. Margin="5"
  314. CornerRadius="3">
  315. <StackPanel>
  316. <TextBlock Text="当前循环"
  317. Foreground="White"
  318. FontSize="11" />
  319. <TextBlock Text="{Binding CurrentCycle}"
  320. d:Text="1"
  321. Foreground="White"
  322. FontSize="16"
  323. FontWeight="Bold"
  324. HorizontalAlignment="Center" />
  325. </StackPanel>
  326. </Border>
  327. <Border Background="#2ECC71"
  328. Padding="10 5"
  329. Margin="5"
  330. CornerRadius="3">
  331. <StackPanel>
  332. <TextBlock Text="成功率"
  333. Foreground="White"
  334. FontSize="11" />
  335. <TextBlock Text="{Binding SuccessRate, StringFormat={}{0:F1}%}"
  336. d:Text="100%"
  337. Foreground="White"
  338. FontSize="16"
  339. FontWeight="Bold"
  340. HorizontalAlignment="Center" />
  341. </StackPanel>
  342. </Border>
  343. <Border Background="#9B59B6"
  344. Padding="10 5"
  345. Margin="5"
  346. CornerRadius="3">
  347. <StackPanel>
  348. <TextBlock Text="往返时间"
  349. Foreground="White"
  350. FontSize="11" />
  351. <TextBlock Text="{Binding CycleTime, StringFormat={}{0:F2}s}"
  352. d:Text="2.34s"
  353. Foreground="White"
  354. FontSize="16"
  355. FontWeight="Bold"
  356. HorizontalAlignment="Center" />
  357. </StackPanel>
  358. </Border>
  359. </WrapPanel>
  360. </StackPanel>
  361. </Border>
  362. <!-- 测试结果列表 -->
  363. <Border Grid.Row="4"
  364. Background="White"
  365. Padding="10">
  366. <Grid>
  367. <Grid.RowDefinitions>
  368. <RowDefinition Height="Auto" />
  369. <RowDefinition Height="*" />
  370. </Grid.RowDefinitions>
  371. <StackPanel Grid.Row="0"
  372. Orientation="Horizontal">
  373. <TextBlock Style="{StaticResource TitleStyle}"
  374. Text="测试结果列表" />
  375. <TextBlock Margin="10,0,0,0"
  376. VerticalAlignment="Center"
  377. Foreground="#7F8C8D"
  378. Text="(显示最近20次结果)" />
  379. </StackPanel>
  380. <DataGrid x:Name="dgResults"
  381. Grid.Row="1"
  382. Style="{StaticResource DataGridStyle}"
  383. MaxHeight="250"
  384. AutoGenerateColumns="False"
  385. CanUserAddRows="False"
  386. IsReadOnly="True"
  387. ItemsSource="{Binding TestResults}">
  388. <DataGrid.Columns>
  389. <DataGridTextColumn Header="序号"
  390. Binding="{Binding Index}"
  391. Width="50" />
  392. <DataGridTextColumn Header="状态"
  393. Binding="{Binding Status}"
  394. Width="60">
  395. <DataGridTextColumn.CellStyle>
  396. <Style TargetType="DataGridCell">
  397. <Setter Property="Foreground"
  398. Value="{Binding StatusColor}" />
  399. </Style>
  400. </DataGridTextColumn.CellStyle>
  401. </DataGridTextColumn>
  402. <DataGridTextColumn Header="X坐标"
  403. Binding="{Binding X, StringFormat={}{0:F3}}"
  404. Width="70" />
  405. <DataGridTextColumn Header="Y坐标"
  406. Binding="{Binding Y, StringFormat={}{0:F3}}"
  407. Width="70" />
  408. <DataGridTextColumn Header="角度"
  409. Binding="{Binding Angle, StringFormat={}{0:F2}}"
  410. Width="60" />
  411. <DataGridTextColumn Header="偏差X"
  412. Binding="{Binding DeviationX, StringFormat={}{0:F3}}"
  413. Width="70" />
  414. <DataGridTextColumn Header="偏差Y"
  415. Binding="{Binding DeviationY, StringFormat={}{0:F3}}"
  416. Width="70" />
  417. <DataGridTextColumn Header="循环时间"
  418. Binding="{Binding CycleTime, StringFormat={}{0:F2}s}"
  419. Width="80" />
  420. <DataGridTextColumn Header="时间戳"
  421. Binding="{Binding Timestamp}"
  422. Width="120" />
  423. </DataGrid.Columns>
  424. </DataGrid>
  425. </Grid>
  426. </Border>
  427. <!-- 导出和精度分析 -->
  428. <Border Grid.Row="5"
  429. Background="#ECF0F1"
  430. Padding="10">
  431. <StackPanel>
  432. <!-- 导出按钮 -->
  433. <WrapPanel HorizontalAlignment="Right">
  434. <Button Content="导出CSV"
  435. Background="#3498DB"
  436. Foreground="White"
  437. MinWidth="100"
  438. Command="{Binding ExportCSVCommand}" />
  439. <Button Content="生成报告"
  440. Background="#9B59B6"
  441. Foreground="White"
  442. MinWidth="100"
  443. Command="{Binding ExportReportCommand}" />
  444. <Button Content="清空数据"
  445. Background="#95A5A6"
  446. Foreground="White"
  447. MinWidth="100"
  448. Command="{Binding ClearDataCommand}" />
  449. </WrapPanel>
  450. <!-- 动态精度分析 -->
  451. <Border Margin="0 10 0 0"
  452. Background="#F8F9FA"
  453. Padding="10"
  454. CornerRadius="5">
  455. <StackPanel>
  456. <TextBlock Text="动态重复精度分析"
  457. FontWeight="Bold"
  458. Margin="0 0 0 5" />
  459. <Grid Margin="0 5 0 0">
  460. <Grid.ColumnDefinitions>
  461. <ColumnDefinition Width="*" />
  462. <ColumnDefinition Width="*" />
  463. </Grid.ColumnDefinitions>
  464. <StackPanel Grid.Column="0">
  465. <TextBlock>
  466. <Run Text="X方向精度: " />
  467. <Run Text="{Binding XPrecision, StringFormat={}{0:F3}mm}"
  468. d:Text="0.023mm"
  469. Foreground="#2C3E50"
  470. FontWeight="Bold" />
  471. </TextBlock>
  472. <TextBlock>
  473. <Run Text="Y方向精度: " />
  474. <Run Text="{Binding YPrecision, StringFormat={}{0:F3}mm}"
  475. d:Text="0.018mm"
  476. Foreground="#2C3E50"
  477. FontWeight="Bold" />
  478. </TextBlock>
  479. <TextBlock>
  480. <Run Text="角度精度: " />
  481. <Run Text="{Binding AnglePrecision, StringFormat={}{0:F2}°}"
  482. d:Text="0.12°"
  483. Foreground="#2C3E50"
  484. FontWeight="Bold" />
  485. </TextBlock>
  486. </StackPanel>
  487. <StackPanel Grid.Column="1">
  488. <TextBlock>
  489. <Run Text="3σ范围: " />
  490. <Run Text="{Binding ThreeSigmaRange, StringFormat={}±{0:F3}mm}"
  491. d:Text="±0.065mm"
  492. Foreground="#2C3E50"
  493. FontWeight="Bold" />
  494. </TextBlock>
  495. <TextBlock>
  496. <Run Text="CPK: " />
  497. <Run Text="{Binding ProcessCpk, StringFormat={}{0:F2}}"
  498. d:Text="1.85"
  499. Foreground="#2C3E50"
  500. FontWeight="Bold" />
  501. </TextBlock>
  502. <TextBlock>
  503. <Run Text="评级: " />
  504. <Run Text="{Binding ProcessRating}"
  505. d:Text="优秀"
  506. Foreground="#27AE60"
  507. FontWeight="Bold" />
  508. </TextBlock>
  509. </StackPanel>
  510. </Grid>
  511. <!-- 趋势图按钮 -->
  512. <Button Content="显示趋势图"
  513. Background="#E67E22"
  514. Foreground="White"
  515. HorizontalAlignment="Right"
  516. Margin="0 10 0 0"
  517. MinWidth="100"
  518. Command="{Binding ShowTrendChartCommand}" />
  519. </StackPanel>
  520. </Border>
  521. </StackPanel>
  522. </Border>
  523. </Grid>
  524. </Border>
  525. <!-- 右侧图像和轨迹显示区域 -->
  526. <Grid Grid.Column="1">
  527. <Grid.RowDefinitions>
  528. <RowDefinition Height="*" />
  529. <RowDefinition Height="Auto" />
  530. <RowDefinition Height="Auto" />
  531. </Grid.RowDefinitions>
  532. <!-- 图像显示区域 -->
  533. <Border Background="#2C3E50">
  534. <Grid>
  535. <Grid.RowDefinitions>
  536. <RowDefinition Height="*" />
  537. <RowDefinition Height="Auto" />
  538. </Grid.RowDefinitions>
  539. <!-- VisionPro图像显示 -->
  540. <wf:WindowsFormsHost Grid.Row="0">
  541. <vp:CogRecordDisplay x:Name="display"
  542. Dock="Fill" />
  543. </wf:WindowsFormsHost>
  544. <!-- 图像信息栏 -->
  545. <Border Grid.Row="1"
  546. Background="#34495E"
  547. Padding="10">
  548. <Grid>
  549. <Grid.ColumnDefinitions>
  550. <ColumnDefinition Width="*" />
  551. <ColumnDefinition Width="Auto" />
  552. </Grid.ColumnDefinitions>
  553. <StackPanel Grid.Column="0"
  554. Orientation="Horizontal">
  555. <TextBlock Text="图像信息: "
  556. Foreground="White" />
  557. <TextBlock Text="{Binding ImageInfo}"
  558. d:Text="第15次采集 - 检测成功"
  559. Foreground="#F1C40F"
  560. FontWeight="Bold" />
  561. </StackPanel>
  562. <StackPanel Grid.Column="1"
  563. Orientation="Horizontal">
  564. <TextBlock Text="检测时间: "
  565. Foreground="White" />
  566. <TextBlock Text="{Binding DetectTime, StringFormat={}{0:F3}s}"
  567. d:Text="0.123s"
  568. Foreground="#F1C40F"
  569. FontWeight="Bold"
  570. Width="60" />
  571. </StackPanel>
  572. </Grid>
  573. </Border>
  574. </Grid>
  575. </Border>
  576. <!-- 轨迹可视化区域 -->
  577. <Border Grid.Row="1"
  578. Background="#ECF0F1"
  579. Padding="10"
  580. BorderBrush="#BDC3C7"
  581. BorderThickness="0 1 0 0">
  582. <StackPanel>
  583. <TextBlock Text="机器人轨迹可视化"
  584. FontWeight="Bold"
  585. Margin="0 0 0 5" />
  586. <Grid>
  587. <Grid.ColumnDefinitions>
  588. <ColumnDefinition Width="*" />
  589. <ColumnDefinition Width="Auto" />
  590. </Grid.ColumnDefinitions>
  591. <!-- 简化轨迹图 -->
  592. <Canvas x:Name="trajectoryCanvas"
  593. Height="100"
  594. Background="White"
  595. Margin="0 5 0 0">
  596. <!-- A点标记 -->
  597. <Ellipse Canvas.Left="50"
  598. Canvas.Top="50"
  599. Width="12"
  600. Height="12"
  601. Fill="#3498DB"
  602. Stroke="#2C3E50"
  603. StrokeThickness="1">
  604. <Ellipse.ToolTip>
  605. <ToolTip>
  606. <StackPanel>
  607. <TextBlock Text="A点 - 起始位置"
  608. FontWeight="Bold" />
  609. <TextBlock Text="{Binding PointA}" />
  610. </StackPanel>
  611. </ToolTip>
  612. </Ellipse.ToolTip>
  613. </Ellipse>
  614. <TextBlock Canvas.Left="45"
  615. Canvas.Top="65"
  616. Text="A"
  617. FontWeight="Bold"
  618. Foreground="#2C3E50" />
  619. <!-- B点标记 -->
  620. <Ellipse Canvas.Left="200"
  621. Canvas.Top="50"
  622. Width="12"
  623. Height="12"
  624. Fill="#E74C3C"
  625. Stroke="#2C3E50"
  626. StrokeThickness="1">
  627. <Ellipse.ToolTip>
  628. <ToolTip>
  629. <StackPanel>
  630. <TextBlock Text="B点 - 拍照位置"
  631. FontWeight="Bold" />
  632. <TextBlock Text="{Binding PointB}" />
  633. </StackPanel>
  634. </ToolTip>
  635. </Ellipse.ToolTip>
  636. </Ellipse>
  637. <TextBlock Canvas.Left="195"
  638. Canvas.Top="65"
  639. Text="B"
  640. FontWeight="Bold"
  641. Foreground="#2C3E50" />
  642. <!-- 移动轨迹线 -->
  643. <Line x:Name="trajectoryLine"
  644. X1="56"
  645. Y1="56"
  646. X2="194"
  647. Y2="56"
  648. Stroke="#7F8C8D"
  649. StrokeThickness="2"
  650. StrokeDashArray="5,3" />
  651. <!-- 当前位置标记 -->
  652. <Ellipse x:Name="currentPositionMarker"
  653. Canvas.Left="125"
  654. Canvas.Top="50"
  655. Width="8"
  656. Height="8"
  657. Fill="#27AE60"
  658. Stroke="White"
  659. StrokeThickness="1"
  660. Visibility="Visible">
  661. <Ellipse.ToolTip>
  662. <ToolTip>
  663. <StackPanel>
  664. <TextBlock Text="当前位置"
  665. FontWeight="Bold" />
  666. <TextBlock Text="{Binding CurrentPosition}" />
  667. </StackPanel>
  668. </ToolTip>
  669. </Ellipse.ToolTip>
  670. </Ellipse>
  671. </Canvas>
  672. <!-- 轨迹控制 -->
  673. <StackPanel Grid.Column="1"
  674. Orientation="Vertical"
  675. Margin="10 0 0 0">
  676. <CheckBox Content="显示轨迹"
  677. IsChecked="{Binding ShowTrajectory, Mode=TwoWay}"
  678. Margin="0 0 0 5" />
  679. <CheckBox Content="实时更新"
  680. IsChecked="{Binding RealTimeUpdate, Mode=TwoWay}"
  681. Margin="0 0 0 5" />
  682. <Button Content="重置视图"
  683. MinWidth="80"
  684. Height="25"
  685. Command="{Binding ResetTrajectoryViewCommand}" />
  686. </StackPanel>
  687. </Grid>
  688. </StackPanel>
  689. </Border>
  690. <!-- 底部按钮 -->
  691. <StackPanel Grid.Row="2"
  692. Orientation="Horizontal"
  693. VerticalAlignment="Center"
  694. HorizontalAlignment="Right"
  695. Margin="0 5 5 5">
  696. <Button Height="30"
  697. MinWidth="100"
  698. Content="{lex:Loc 确定}"
  699. materialDesign:ButtonAssist.CornerRadius="10"
  700. ToolTip="{lex:Loc 确定}"
  701. Command="{Binding ConfirmCommand}" />
  702. <Button Height="30"
  703. Margin="10,0"
  704. MinWidth="100"
  705. materialDesign:ButtonAssist.CornerRadius="10"
  706. ToolTip="{lex:Loc 取消}"
  707. Content="{lex:Loc 取消}"
  708. Command="{Binding CancelCommand}" />
  709. </StackPanel>
  710. </Grid>
  711. <!-- 消息提示 -->
  712. <materialDesign:Snackbar Grid.ColumnSpan="2"
  713. Opacity="0.8"
  714. HorizontalContentAlignment="Center"
  715. FontSize="14"
  716. MessageQueue="{Binding MessageQueue}"
  717. VerticalAlignment="Bottom" />
  718. </Grid>
  719. </UserControl>