| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512 |
- <UserControl x:Class="TeamAAS.Views.SettingView"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:hc="https://handyorg.github.io/handycontrol"
- xmlns:prism="http://prismlibrary.com/"
- xmlns:conv="clr-namespace:TeamAAS.Converters"
- xmlns:ctrl="clr-namespace:TeamAAS.Camera.UI.Controls;assembly=TeamAAS.Camera"
- xmlns:sys="clr-namespace:System;assembly=mscorlib"
- xmlns:io="clr-namespace:System.IO.Ports;assembly=System"
- xmlns:fe="clr-namespace:TeamAAS.Feeder.Enums;assembly=TeamAAS.Feeder"
- xmlns:fm="clr-namespace:TeamAAS.Feeder.Models;assembly=TeamAAS.Feeder"
- xmlns:pg="clr-namespace:PropertyGridLib;assembly=PropertyGridLib"
- xmlns:loc="clr-namespace:TeamAAS.Localization"
- xmlns:views="clr-namespace:TeamAAS.Views"
- prism:ViewModelLocator.AutoWireViewModel="True"
- Background="{DynamicResource RegionBrush}">
- <UserControl.Resources>
- <conv:IsEqualConverter x:Key="IsEqualConverter"/>
- <conv:EnumDescriptionConverter x:Key="EnumDescriptionConverter"/>
- <BooleanToVisibilityConverter x:Key="BoolToVis"/>
- <!-- FeederAction 枚举列表(ObjectDataProvider 反射拿值,自动显示 Description) -->
- <ObjectDataProvider x:Key="FeederActionEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
- <ObjectDataProvider.MethodParameters>
- <x:Type TypeName="fe:FeederAction"/>
- </ObjectDataProvider.MethodParameters>
- </ObjectDataProvider>
- <ObjectDataProvider x:Key="SequenceStepTypeEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
- <ObjectDataProvider.MethodParameters>
- <x:Type TypeName="fm:SequenceStepType"/>
- </ObjectDataProvider.MethodParameters>
- </ObjectDataProvider>
- <ObjectDataProvider x:Key="FeederBrandEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
- <ObjectDataProvider.MethodParameters>
- <x:Type TypeName="fe:FeederBrand"/>
- </ObjectDataProvider.MethodParameters>
- </ObjectDataProvider>
- <!-- 串口枚举值 -->
- <x:Array x:Key="ParityValues" Type="{x:Type io:Parity}">
- <io:Parity>None</io:Parity>
- <io:Parity>Odd</io:Parity>
- <io:Parity>Even</io:Parity>
- <io:Parity>Mark</io:Parity>
- <io:Parity>Space</io:Parity>
- </x:Array>
- <x:Array x:Key="StopBitsValues" Type="{x:Type io:StopBits}">
- <io:StopBits>One</io:StopBits>
- <io:StopBits>OnePointFive</io:StopBits>
- <io:StopBits>Two</io:StopBits>
- </x:Array>
- <!-- 供料器枚举值 -->
- <ObjectDataProvider x:Key="FeederConnectTypeEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
- <ObjectDataProvider.MethodParameters>
- <x:Type TypeName="fe:FeederConnectType"/>
- </ObjectDataProvider.MethodParameters>
- </ObjectDataProvider>
- <!-- 子导航按钮样式 -->
- <Style x:Key="SubNavItem" TargetType="RadioButton">
- <Setter Property="GroupName" Value="SettingNav"/>
- <Setter Property="Cursor" Value="Hand"/>
- <Setter Property="FontSize" Value="13"/>
- <Setter Property="Padding" Value="16,10"/>
- <Setter Property="Foreground" Value="{DynamicResource SecondaryTextBrush}"/>
- <Setter Property="HorizontalContentAlignment" Value="Left"/>
- <Setter Property="Template">
- <Setter.Value>
- <ControlTemplate TargetType="RadioButton">
- <Border x:Name="bd" Background="Transparent" CornerRadius="6" Padding="{TemplateBinding Padding}">
- <ContentPresenter x:Name="cp" VerticalAlignment="Center"/>
- </Border>
- <ControlTemplate.Triggers>
- <Trigger Property="IsMouseOver" Value="True">
- <Setter TargetName="bd" Property="Background" Value="{DynamicResource SecondaryRegionBrush}"/>
- </Trigger>
- <Trigger Property="IsChecked" Value="True">
- <Setter TargetName="bd" Property="Background" Value="{DynamicResource PrimaryBrush}"/>
- <Setter Property="Foreground" Value="White"/>
- </Trigger>
- </ControlTemplate.Triggers>
- </ControlTemplate>
- </Setter.Value>
- </Setter>
- </Style>
- <!-- 通讯Tab按钮样式(独立GroupName) -->
- <Style x:Key="CommTabNavItem" TargetType="RadioButton" BasedOn="{StaticResource SubNavItem}">
- <Setter Property="GroupName" Value="CommTab"/>
- </Style>
- </UserControl.Resources>
- <Grid Background="{DynamicResource RegionBrush}" >
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto" MinWidth="180" MaxWidth="240"/>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
- <!-- 左侧:子导航 -->
- <Border Grid.Column="0" Background="{DynamicResource RegionBrush}"
- BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,1,0">
- <ScrollViewer VerticalScrollBarVisibility="Auto">
- <StackPanel Margin="8,12">
- <TextBlock Text="{loc:Translate '设备管理'}" FontSize="14" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="8,0,0,12"/>
- <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '📷 相机管理'}"
- IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=Camera, Mode=TwoWay}"/>
- <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '🤖 机器人'}"
- IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=Robot, Mode=TwoWay}"/>
- <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '🔌 通讯设备'}"
- IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=BasicComm, Mode=TwoWay}"/>
- <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '🖥 PLC通讯'}"
- IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=PlcComm, Mode=TwoWay}"/>
- <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '💡 光源'}"
- IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=Light, Mode=TwoWay}"/>
- <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '📦 供料器'}"
- IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=Feeder, Mode=TwoWay}"/>
- <RadioButton Style="{StaticResource SubNavItem}"
- Content="{loc:Translate '🎛️ 控制卡'}"
- IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=MotionCard, Mode=TwoWay}" />
- <Border Height="1" Background="{DynamicResource BorderBrush}" Margin="8,14,8,14"/>
- <TextBlock Text="{loc:Translate '系统管理'}" FontSize="14" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="8,0,0,12"/>
- <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '📊 全局变量'}"
- IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=GlobalVariable, Mode=TwoWay}"/>
- <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '⚡ 全局事件'}"
- IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=GlobalEvent, Mode=TwoWay}"/>
- <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '🗄 产品数据'}"
- IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=ProductData, Mode=TwoWay}"/>
- <Border Height="1" Background="{DynamicResource BorderBrush}" Margin="8,14,8,14"/>
- <TextBlock Text="{loc:Translate '通用设置'}" FontSize="14" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="8,0,0,12"/>
- <RadioButton Style="{StaticResource SubNavItem}" Content="{loc:Translate '⚙ 程序配置'}"
- IsChecked="{Binding SelectedSection, Converter={StaticResource IsEqualConverter}, ConverterParameter=General, Mode=TwoWay}"/>
- </StackPanel>
- </ScrollViewer>
- </Border>
- <!-- 右侧:内容区 -->
- <Grid Grid.Column="1" Margin="16,12">
- <!-- ========== 产品数据管理(数据库) ========== -->
- <Grid>
- <Grid.Style>
- <Style TargetType="Grid">
- <Setter Property="Visibility" Value="Collapsed"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding SelectedSection}" Value="ProductData">
- <Setter Property="Visibility" Value="Visible"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </Grid.Style>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}" CornerRadius="8" Padding="12,8" Margin="0,0,0,12">
- <StackPanel Orientation="Horizontal">
- <TextBlock Text="{loc:Translate '当前产品:'}" VerticalAlignment="Center" Foreground="{DynamicResource SecondaryTextBrush}"/>
- <TextBlock Text="{Binding DbProductName}" VerticalAlignment="Center" FontWeight="SemiBold" Foreground="{DynamicResource PrimaryTextBrush}"/>
- <TextBlock Text="{loc:Translate '(每个产品一个数据库,跟着产品走)'}" VerticalAlignment="Center" Margin="10,0,0,0" Foreground="{DynamicResource SecondaryTextBrush}"/>
- </StackPanel>
- </Border>
- <ContentControl Grid.Row="1" Content="{Binding CurrentProductDatabasePage}"/>
- </Grid>
- <!-- ========== 相机管理 ========== -->
- <Grid>
- <Grid.Style>
- <Style TargetType="Grid">
- <Setter Property="Visibility" Value="Collapsed"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding SelectedSection}" Value="Camera">
- <Setter Property="Visibility" Value="Visible"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </Grid.Style>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <!-- 工具栏 -->
- <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="8" Padding="12,8" Margin="0,0,0,12">
- <StackPanel Orientation="Horizontal">
- <Button Content="{loc:Translate '搜索并添加相机'}" Command="{Binding SearchDevicesCommand}"
- Style="{StaticResource ButtonPrimary}" Margin="0,0,8,0" Padding="16,6"/>
- <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
- <Button Content="{loc:Translate '连接'}" Command="{Binding ConnectCommand}"
- Style="{StaticResource ButtonDefault}" Margin="8,0,4,0" Padding="16,6"
- IsEnabled="{Binding HasSelectedCamera}"/>
- <Button Content="{loc:Translate '断开'}" Command="{Binding DisconnectCommand}"
- Style="{StaticResource ButtonDefault}" Margin="4,0,8,0" Padding="16,6"
- IsEnabled="{Binding HasSelectedCamera}"/>
- <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
- <Button Content="{loc:Translate '开始采集'}" Command="{Binding StartGrabbingCommand}"
- Style="{StaticResource ButtonDefault}" Margin="8,0,4,0" Padding="16,6"
- IsEnabled="{Binding HasSelectedCamera}"/>
- <Button Content="{loc:Translate '停止采集'}" Command="{Binding StopGrabbingCommand}"
- Style="{StaticResource ButtonDefault}" Margin="4,0,8,0" Padding="16,6"
- IsEnabled="{Binding HasSelectedCamera}"/>
- <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
- <Button Content="{loc:Translate '删除相机'}" Command="{Binding DeleteCameraCommand}"
- Style="{StaticResource ButtonDanger}" Margin="8,0,0,0" Padding="16,6"
- IsEnabled="{Binding HasSelectedCamera}"/>
- <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="8,0"/>
- <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveCameraConfigCommand}"
- Style="{StaticResource ButtonDefault}" Margin="4,0,0,0" Padding="16,6"/>
- </StackPanel>
- </Border>
- <!-- SDK状态条 -->
- <Border Grid.Row="1" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="6" Padding="12,6" Margin="0,0,0,12">
- <ItemsControl ItemsSource="{Binding SdkStatus}">
- <ItemsControl.ItemsPanel>
- <ItemsPanelTemplate>
- <StackPanel Orientation="Horizontal"/>
- </ItemsPanelTemplate>
- </ItemsControl.ItemsPanel>
- <ItemsControl.ItemTemplate>
- <DataTemplate>
- <StackPanel Orientation="Horizontal" Margin="0,0,16,0">
- <Ellipse Width="8" Height="8" Margin="0,0,6,0">
- <Ellipse.Style>
- <Style TargetType="Ellipse">
- <Setter Property="Fill" Value="#F44336"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding Installed}" Value="True">
- <Setter Property="Fill" Value="#4CAF50"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </Ellipse.Style>
- </Ellipse>
- <TextBlock Text="{Binding Name}" FontSize="12"
- Foreground="{DynamicResource SecondaryTextBrush}"
- VerticalAlignment="Center"/>
- <TextBlock FontSize="11" Margin="6,0,0,0" VerticalAlignment="Center"
- Foreground="{DynamicResource SecondaryTextBrush}">
- <TextBlock.Style>
- <Style TargetType="TextBlock">
- <Setter Property="Text" Value="未安装"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding Installed}" Value="True">
- <Setter Property="Text" Value="{Binding Version, StringFormat='v{0}'}"/>
- <Setter Property="Foreground" Value="#4CAF50"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </TextBlock.Style>
- </TextBlock>
- </StackPanel>
- </DataTemplate>
- </ItemsControl.ItemTemplate>
- </ItemsControl>
- </Border>
- <!-- 主内容:相机列表 + 属性编辑器 + 调试页(三列) -->
- <Grid Grid.Row="2">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*"/>
- <ColumnDefinition Width="8"/>
- <ColumnDefinition Width="340"/>
- <ColumnDefinition Width="8"/>
- <ColumnDefinition Width="1.4*"/>
- </Grid.ColumnDefinitions>
- <!-- 左侧:已配置相机列表 -->
- <Border Grid.Column="0" Background="{DynamicResource RegionBrush}"
- CornerRadius="8" Margin="0,0,6,0">
- <DockPanel>
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '已配置相机'}" FontSize="14" FontWeight="Bold"
- Margin="16,12,0,8" Foreground="{DynamicResource PrimaryTextBrush}"/>
- <DataGrid x:Name="CameraDataGrid" ItemsSource="{Binding Cameras}"
- SelectedItem="{Binding SelectedCamera}"
- AutoGenerateColumns="False" CanUserAddRows="False"
- IsReadOnly="True" HeadersVisibility="All"
- GridLinesVisibility="Horizontal" BorderThickness="0"
- AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}"
- Margin="8,0,8,8">
- <DataGrid.Columns>
- <DataGridTextColumn Header="{loc:Translate '编号'}" Binding="{Binding CameraNo}" Width="50"/>
- <DataGridTextColumn Header="{loc:Translate '名称'}" Binding="{Binding CameraName}" Width="150"/>
- <DataGridTextColumn Header="{loc:Translate '品牌'}" Binding="{Binding CameraBrandDisplay}" Width="100"/>
- <DataGridTextColumn Header="{loc:Translate 'IP地址'}" Binding="{Binding CameraIp}" Width="110"/>
- <DataGridTextColumn Header="{loc:Translate '序列号'}" Binding="{Binding SerialNumber}" Width="*"/>
- </DataGrid.Columns>
- </DataGrid>
- </DockPanel>
- </Border>
- <!-- 中:相机属性编辑器(纵向自带滚动,不要套外层 ScrollViewer,会使其失效) -->
- <Border Grid.Column="2" Background="{DynamicResource RegionBrush}"
- BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" CornerRadius="6"
- IsEnabled="{Binding HasSelectedCamera}">
- <DockPanel Margin="10,8">
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '相机属性'}" FontSize="13" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
- <pg:PropertyGrid SelectedObject="{Binding SelectedCameraDevice}"
- ShowSearchBar="True" ShowDescription="True"/>
- </DockPanel>
- </Border>
- <!-- 右:调试页宿主:按选中相机的 [Camera] 特性加载品牌专属页,
- 未指定时由 CameraDebugPageFactory 回退到通用调试页(实时图像) -->
- <Border Grid.Column="4" Background="Black" CornerRadius="6">
- <Grid>
- <TextBlock Text="{loc:Translate '选择相机后显示调试页'}"
- HorizontalAlignment="Center" VerticalAlignment="Center"
- Foreground="{DynamicResource SecondaryTextBrush}"/>
- <ContentControl Content="{Binding CurrentDebugPage}" Focusable="False"/>
- </Grid>
- </Border>
- </Grid>
- </Grid>
- <!-- ========== 机器人管理 ========== -->
- <Grid>
- <Grid.Style>
- <Style TargetType="Grid">
- <Setter Property="Visibility" Value="Collapsed"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding SelectedSection}" Value="Robot">
- <Setter Property="Visibility" Value="Visible"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </Grid.Style>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <!-- 工具栏 -->
- <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="8" Padding="12,8" Margin="0,0,0,12">
- <StackPanel Orientation="Horizontal">
- <Button Content="{loc:Translate '添加机器人'}" Command="{Binding AddRobotCommand}"
- Style="{StaticResource ButtonPrimary}" Margin="0,0,8,0" Padding="16,6"/>
- <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
- <Button Content="{loc:Translate '连接'}" Command="{Binding ConnectRobotCommand}"
- Style="{StaticResource ButtonDefault}" Margin="8,0,4,0" Padding="16,6"
- IsEnabled="{Binding HasSelectedRobot}"/>
- <Button Content="{loc:Translate '断开'}" Command="{Binding DisconnectRobotCommand}"
- Style="{StaticResource ButtonDefault}" Margin="4,0,8,0" Padding="16,6"
- IsEnabled="{Binding HasSelectedRobot}"/>
- <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
- <Button Content="{loc:Translate '删除'}" Command="{Binding DeleteRobotCommand}"
- Style="{StaticResource ButtonDanger}" Margin="8,0,0,0" Padding="16,6"
- IsEnabled="{Binding HasSelectedRobot}"/>
- <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="8,0"/>
- <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveRobotConfigCommand}"
- Style="{StaticResource ButtonDefault}" Margin="4,0,0,0" Padding="16,6"/>
- </StackPanel>
- </Border>
- <!-- 主内容:机器人列表 + 手动调试 -->
- <Grid Grid.Row="1">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*"/>
- <ColumnDefinition Width="380"/>
- </Grid.ColumnDefinitions>
- <!-- 左侧:机器人列表 -->
- <Border Grid.Column="0" Background="{DynamicResource RegionBrush}"
- CornerRadius="8" Margin="0,0,6,0">
- <DockPanel>
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '机器人列表'}" FontSize="14" FontWeight="Bold"
- Margin="16,12,0,8" Foreground="{DynamicResource PrimaryTextBrush}"/>
- <DataGrid x:Name="RobotDataGrid" ItemsSource="{Binding Robots}"
- SelectedItem="{Binding SelectedRobot}"
- AutoGenerateColumns="False" CanUserAddRows="False"
- IsReadOnly="True" HeadersVisibility="All"
- GridLinesVisibility="Horizontal" BorderThickness="0"
- AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}"
- Margin="8,0,8,8"
- MouseDoubleClick="RobotDataGrid_MouseDoubleClick">
- <DataGrid.Columns>
- <DataGridTextColumn Header="{loc:Translate '编号'}" Binding="{Binding RobotNo}" Width="50"/>
- <DataGridTextColumn Header="{loc:Translate '名称'}" Binding="{Binding RobotName}" Width="120"/>
- <DataGridTextColumn Header="{loc:Translate '品牌'}" Binding="{Binding RobotBrand}" Width="80"/>
- <DataGridTextColumn Header="{loc:Translate 'IP地址'}" Binding="{Binding IP}" Width="110"/>
- <DataGridTextColumn Header="{loc:Translate '端口'}" Binding="{Binding Port}" Width="60"/>
- <DataGridTextColumn Header="{loc:Translate '连接方式'}" Binding="{Binding ConnectType}" Width="80"/>
- <DataGridTextColumn Header="{loc:Translate '结束符'}" Binding="{Binding Terminator}" Width="70"/>
- <DataGridTextColumn Header="{loc:Translate '编码格式'}" Binding="{Binding DataEncoding}" Width="80"/>
- </DataGrid.Columns>
- </DataGrid>
- </DockPanel>
- </Border>
- <!-- 右侧:调试页宿主(RobotDebugPageFactory 创建品牌专属页或库内 DefaultRobotDebugPage,恒非空) -->
- <Border Grid.Column="1" Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="6,0,0,0">
- <ContentControl Content="{Binding CurrentRobotDebugPage}" Focusable="False"/>
- </Border>
- </Grid>
- </Grid>
- <!-- ========== 控制卡管理 ========== -->
- <Grid>
- <Grid.Style>
- <Style TargetType="Grid">
- <Setter Property="Visibility"
- Value="Collapsed" />
- <Style.Triggers>
- <DataTrigger Binding="{Binding SelectedSection}"
- Value="MotionCard">
- <Setter Property="Visibility"
- Value="Visible" />
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </Grid.Style>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto" />
- <RowDefinition Height="*" />
- </Grid.RowDefinitions>
- <!-- 工具栏 -->
- <Border Grid.Row="0"
- Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="8"
- Padding="12,8"
- Margin="0,0,0,12">
- <StackPanel Orientation="Horizontal">
- <Button Content="{loc:Translate '添加控制卡'}"
- Command="{Binding AddMotionCardCommand}"
- Style="{StaticResource ButtonPrimary}"
- Margin="0,0,8,0"
- Padding="16,6" />
- <Rectangle Width="1"
- Height="24"
- Fill="{DynamicResource BorderBrush}"
- Margin="4,0" />
- <Button Content="{loc:Translate '连接'}"
- Command="{Binding ConnectMotionCardommand}"
- Style="{StaticResource ButtonDefault}"
- Margin="8,0,4,0"
- Padding="16,6"
- IsEnabled="{Binding HasSelectedRobot}" />
- <Button Content="{loc:Translate '断开'}"
- Command="{Binding DisconnectMotionCardCommand}"
- Style="{StaticResource ButtonDefault}"
- Margin="4,0,8,0"
- Padding="16,6"
- IsEnabled="{Binding HasSelectedRobot}" />
- <Rectangle Width="1"
- Height="24"
- Fill="{DynamicResource BorderBrush}"
- Margin="4,0" />
- <Button Content="{loc:Translate '删除'}"
- Command="{Binding DeleteMotionCardCommand}"
- Style="{StaticResource ButtonDanger}"
- Margin="8,0,0,0"
- Padding="16,6"
- IsEnabled="{Binding HasSelectedRobot}" />
- <Rectangle Width="1"
- Height="24"
- Fill="{DynamicResource BorderBrush}"
- Margin="8,0" />
- <Button Content="{loc:Translate '💾 保存配置'}"
- Command="{Binding SaveMotionCardConfigCommand}"
- Style="{StaticResource ButtonDefault}"
- Margin="4,0,0,0"
- Padding="16,6" />
- </StackPanel>
- </Border>
- <!-- 主内容:控制卡列表 + 手动调试 -->
- <Grid Grid.Row="1">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="380" />
- <ColumnDefinition Width="*" />
- </Grid.ColumnDefinitions>
- <!-- 左侧:控制卡列表 -->
- <Border Grid.Column="0"
- Background="{DynamicResource RegionBrush}"
- CornerRadius="8"
- Margin="0,0,6,0">
- <DockPanel>
- <TextBlock DockPanel.Dock="Top"
- Text="{loc:Translate '控制卡列表'}"
- FontSize="14"
- FontWeight="Bold"
- Margin="16,12,0,8"
- Foreground="{DynamicResource PrimaryTextBrush}" />
- <DataGrid x:Name="MotionCardDataGrid"
- ItemsSource="{Binding MotionCards}"
- SelectedItem="{Binding SelectedMotionCard}"
- AutoGenerateColumns="False"
- CanUserAddRows="False"
- IsReadOnly="True"
- HeadersVisibility="All"
- GridLinesVisibility="Horizontal"
- BorderThickness="0"
- AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}"
- Margin="8,0,8,8"
- MouseDoubleClick="RobotDataGrid_MouseDoubleClick">
- <DataGrid.Columns>
- <DataGridTextColumn Header="{loc:Translate '编号'}"
- Binding="{Binding RobotNo}"
- Width="50" />
- <DataGridTextColumn Header="{loc:Translate '名称'}"
- Binding="{Binding Name}"
- Width="120" />
- <DataGridTextColumn Header="{loc:Translate '品牌'}"
- Binding="{Binding AdapterKey}"
- Width="80" />
- <DataGridTextColumn Header="{loc:Translate '卡号'}"
- Binding="{Binding BoardIndex}"
- Width="50" />
-
- </DataGrid.Columns>
- </DataGrid>
- </DockPanel>
- </Border>
- <!-- 右侧:调试页宿主(RobotDebugPageFactory 创建品牌专属页或库内 DefaultRobotDebugPage,恒非空) -->
- <Border Grid.Column="1"
- Background="{DynamicResource RegionBrush}"
- CornerRadius="8"
- Margin="6,0,0,0">
- <ContentControl Content="{Binding CurrentMotionDebugPage}"
- Focusable="False" />
- </Border>
- </Grid>
- </Grid>
- <!-- ========== 光源 ========== -->
- <Border>
- <Border.Style>
- <Style TargetType="Border">
- <Setter Property="Visibility" Value="Collapsed"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding SelectedSection}" Value="Light">
- <Setter Property="Visibility" Value="Visible"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </Border.Style>
- <DockPanel>
- <!-- 顶部配置栏 -->
- <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="8" Padding="12,8" Margin="0,0,0,12">
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="200"/>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="200"/>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="100"/>
- <ColumnDefinition Width="*"/>
- <ColumnDefinition Width="Auto"/>
- </Grid.ColumnDefinitions>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- </Grid.RowDefinitions>
- <!-- 型号选择 -->
- <TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Translate '光源型号:'}" FontSize="12"
- VerticalAlignment="Center" Margin="0,0,8,8"/>
- <ComboBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding LightModelDisplayOptions}"
- SelectedItem="{Binding SelectedLightModelItem}"
- DisplayMemberPath="Display" FontSize="12"
- Margin="0,0,0,8"/>
- <!-- 串口设备选择 -->
- <TextBlock Grid.Row="0" Grid.Column="2" Text="{loc:Translate '串口设备:'}" FontSize="12"
- VerticalAlignment="Center" Margin="16,0,8,8"/>
- <ComboBox Grid.Row="0" Grid.Column="3" ItemsSource="{Binding LightSerialDeviceNames}"
- SelectedItem="{Binding SelectedLightSerialDevice}" FontSize="12"
- Margin="0,0,0,8"/>
- <Button Grid.Row="0" Grid.Column="4" Content="{loc:Translate '🔄刷新'}"
- Command="{Binding LightRefreshDevicesCommand}"
- Margin="5,0,0,8" FontSize="12" HorizontalAlignment="Stretch"/>
- <!-- 协议/通道信息 -->
- <TextBlock Grid.Row="0" Grid.Column="5" Text="{loc:Translate '协议:'}" FontSize="12"
- VerticalAlignment="Center" Margin="16,0,8,8"/>
- <TextBlock Grid.Row="0" Grid.Column="6" Text="{Binding LightProtocolName}"
- FontSize="12" FontWeight="Bold" Foreground="#4FC3F7"
- VerticalAlignment="Center" Margin="0,0,0,8"/>
- <!-- 超时 -->
- <TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Translate '超时(ms):'}" FontSize="12"
- VerticalAlignment="Center" Margin="0,0,8,0"/>
- <hc:NumericUpDown Grid.Row="1" Grid.Column="1" Value="{Binding LightTimeoutMs}"
- Minimum="100" Maximum="5000" Increment="100"
- FontSize="12" Margin="0,0,0,0"/>
- <!-- 连接/断开按钮 -->
- <StackPanel Grid.Row="0" Grid.Column="7" Grid.RowSpan="2"
- Orientation="Horizontal" HorizontalAlignment="Right">
- <Button Content="{loc:Translate '🔌 连接'}" Command="{Binding LightConnectCommand}"
- FontSize="12" Padding="16,6" Margin="8,0,0,0"/>
- <Button Content="{loc:Translate '✖ 断开'}" Command="{Binding LightDisconnectCommand}"
- FontSize="12" Padding="16,6" Margin="8,0,0,0"
- IsEnabled="{Binding IsLightConnected}"/>
- </StackPanel>
- </Grid>
- </Border>
- <!-- 状态信息栏 -->
- <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="4" Padding="12,8" Margin="0,0,0,12">
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="*"/>
- <ColumnDefinition Width="Auto"/>
- </Grid.ColumnDefinitions>
- <TextBlock Grid.Column="0" Text="{loc:Translate '状态:'}" FontSize="12"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center"/>
- <TextBlock Grid.Column="1" Text="{Binding LightConnectionStatus}" FontSize="12"
- FontWeight="Bold" Foreground="{DynamicResource PrimaryBrush}"
- VerticalAlignment="Center" Margin="8,0,16,0"/>
- <TextBlock Grid.Column="2" Text="{Binding LightMessage}" FontSize="12"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center"/>
- <TextBlock Grid.Column="3" Text="{Binding LightChannelCount, StringFormat=通道数: {0}}"
- FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}"
- VerticalAlignment="Center"/>
- </Grid>
- </Border>
- <!-- 主内容:通道列表 + 控制 -->
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*"/>
- <ColumnDefinition Width="280"/>
- </Grid.ColumnDefinitions>
- <!-- 左侧:通道列表 DataGrid -->
- <Border Grid.Column="0" Background="{DynamicResource RegionBrush}"
- CornerRadius="8" Margin="0,0,6,0">
- <DockPanel>
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '通道列表'}" FontSize="14" FontWeight="Bold"
- Margin="16,12,0,8" Foreground="{DynamicResource PrimaryTextBrush}"/>
- <DataGrid ItemsSource="{Binding LightChannels}"
- AutoGenerateColumns="False" CanUserAddRows="False"
- IsReadOnly="True" HeadersVisibility="All"
- GridLinesVisibility="Horizontal" BorderThickness="0"
- AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}"
- Margin="8,0,8,8">
- <DataGrid.Columns>
- <DataGridTextColumn Header="CH" Binding="{Binding Channel}" Width="60"/>
- <DataGridTextColumn Header="{loc:Translate '名称'}" Binding="{Binding ChannelName}" Width="100"/>
- <DataGridTextColumn Header="{loc:Translate '亮度'}" Binding="{Binding Brightness}" Width="100"/>
- <DataGridTextColumn Header="{loc:Translate '状态'}" Binding="{Binding StatusText}" Width="80"/>
- </DataGrid.Columns>
- </DataGrid>
- </DockPanel>
- </Border>
- <!-- 右侧:控制面板 -->
- <Border Grid.Column="1" Background="{DynamicResource RegionBrush}"
- CornerRadius="8" Margin="6,0,0,0">
- <ScrollViewer VerticalScrollBarVisibility="Auto">
- <DockPanel Margin="12">
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '光源控制'}" FontSize="14" FontWeight="Bold"
- Margin="0,0,0,12" Foreground="{DynamicResource PrimaryTextBrush}"/>
- <!-- 预设指令 -->
- <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="6" Padding="12" Margin="0,0,0,12">
- <StackPanel>
- <TextBlock Text="{loc:Translate '预设指令'}" FontSize="12" FontWeight="SemiBold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*"/>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
- <Button Grid.Column="0" Content="{loc:Translate '💡 全开'}"
- Command="{Binding LightTurnOnAllCommand}"
- FontSize="12" Margin="0,0,4,0"
- IsEnabled="{Binding IsLightConnected}"/>
- <Button Grid.Column="1" Content="{loc:Translate '⚫ 全关'}"
- Command="{Binding LightTurnOffAllCommand}"
- FontSize="12" Margin="4,0,0,0"
- IsEnabled="{Binding IsLightConnected}"/>
- </Grid>
- </StackPanel>
- </Border>
- <!-- 单通道控制 -->
- <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="6" Padding="12" Margin="0,0,0,12">
- <StackPanel>
- <TextBlock Text="{loc:Translate '单通道控制'}" FontSize="12" FontWeight="SemiBold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
- <TextBlock Text="{loc:Translate 'CH口'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
- <hc:NumericUpDown Value="{Binding LightChannel}"
- Minimum="1" Maximum="8" Increment="1"
- FontSize="12" Margin="0,2,0,8"/>
- <TextBlock Text="{loc:Translate '亮度 (0-255)'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
- <hc:NumericUpDown Value="{Binding LightBrightness}"
- Minimum="0" Maximum="255" Increment="1"
- FontSize="12" Margin="0,2,0,8"/>
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*"/>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
- <Button Grid.Column="0" Content="{loc:Translate '📖 读取'}"
- Command="{Binding LightReadBrightnessCommand}"
- FontSize="12" Padding="12,6" Margin="0,0,4,0"
- IsEnabled="{Binding IsLightConnected}"/>
- <Button Grid.Column="1" Content="{loc:Translate '✏️ 设置'}"
- Command="{Binding LightSetBrightnessCommand}"
- FontSize="12" Padding="12,6" Margin="4,0,0,0"
- IsEnabled="{Binding IsLightConnected}"/>
- </Grid>
- </StackPanel>
- </Border>
- <!-- 刷新设备 -->
- <Border DockPanel.Dock="Top" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="6" Padding="12">
-
- </Border>
- </DockPanel>
- </ScrollViewer>
- </Border>
- </Grid>
- </DockPanel>
- </Border>
- <!-- ========== 供料器管理(完整调试界面) ========== -->
- <Grid>
- <Grid.Style>
- <Style TargetType="Grid">
- <Setter Property="Visibility" Value="Collapsed"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding SelectedSection}" Value="Feeder">
- <Setter Property="Visibility" Value="Visible"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </Grid.Style>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="*"/>
- <RowDefinition Height="Auto"/>
- </Grid.RowDefinitions>
- <!-- 顶部工具栏:设备选择 + 操作按钮 -->
- <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="8" Padding="12,8" Margin="0,0,0,8">
- <StackPanel Orientation="Horizontal">
- <TextBlock Text="{loc:Translate '设备:'}" VerticalAlignment="Center"
- Foreground="{DynamicResource SecondaryTextBrush}"/>
- <ComboBox ItemsSource="{Binding Feeders}" SelectedItem="{Binding SelectedFeeder}"
- IsSynchronizedWithCurrentItem="False"
- DisplayMemberPath="FeederName" MinWidth="140" Margin="4,0,12,0"
- Padding="8,2"/>
- <Button Content="{loc:Translate '➕ 添加'}" Command="{Binding AddFeederCommand}"
- Style="{StaticResource ButtonPrimary}" Margin="0,0,4,0" Padding="10,3"/>
- <Button Content="{loc:Translate '🗑 删除'}" Command="{Binding DeleteFeederCommand}"
- Style="{StaticResource ButtonDanger}" Margin="4,0" Padding="10,3"
- IsEnabled="{Binding HasSelectedFeeder}"/>
- <Rectangle Width="1" Height="22" Fill="{DynamicResource BorderBrush}" Margin="6,0"/>
- <Button Content="{loc:Translate '🔌 连接'}" Command="{Binding ConnectFeederCommand}"
- Style="{StaticResource ButtonDefault}" Margin="4,0" Padding="10,3"
- IsEnabled="{Binding HasSelectedFeeder}"/>
- <Button Content="{loc:Translate '🔍 搜索IP'}" Command="{Binding SearchFeederIpCommand}"
- Style="{StaticResource ButtonDefault}" Margin="4,0" Padding="10,3"
- IsEnabled="{Binding HasSelectedFeeder}"/>
- <Button Content="{loc:Translate '⏹ 断开'}" Command="{Binding DisconnectFeederCommand}"
- Style="{StaticResource ButtonDefault}" Margin="4,0" Padding="10,3"
- IsEnabled="{Binding HasSelectedFeeder}"/>
- <Rectangle Width="1" Height="22" Fill="{DynamicResource BorderBrush}" Margin="6,0"/>
- <Button Content="{loc:Translate '💡 背光'}" Command="{Binding ToggleBacklightCommand}"
- Padding="10,3" IsEnabled="{Binding HasSelectedFeeder}">
- <Button.Style>
- <Style TargetType="Button" BasedOn="{StaticResource ButtonDefault}">
- <Setter Property="Background" Value="Transparent"/>
- <Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding SelectedFeeder.IsBacklightOn}" Value="True">
- <Setter Property="Background" Value="#FF8C00"/>
- <Setter Property="Foreground" Value="White"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </Button.Style>
- </Button>
- <Rectangle Width="1" Height="22" Fill="{DynamicResource BorderBrush}" Margin="6,0"/>
- <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveFeederConfigCommand}"
- Style="{StaticResource ButtonDefault}" Margin="4,0" Padding="10,3"/>
- <TextBlock Text="{Binding FeederStatusText}"
- VerticalAlignment="Center" Margin="16,0,0,0"
- Foreground="{DynamicResource PrimaryBrush}" FontWeight="Bold"/>
- </StackPanel>
- </Border>
- <!-- 连接参数编辑区 -->
- <Border Grid.Row="1" Background="{DynamicResource RegionBrush}" CornerRadius="8"
- Padding="12,10" Margin="0,0,0,8"
- IsEnabled="{Binding HasSelectedFeeder}">
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
- <TextBlock Grid.Column="0" Text="{loc:Translate '🔧 连接参数'}"
- VerticalAlignment="Center" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,12,0"/>
- <StackPanel Grid.Column="1" Orientation="Horizontal">
- <!-- 编号 -->
- <StackPanel Orientation="Vertical" Margin="0,0,10,0">
- <TextBlock Text="{loc:Translate '编号'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
- <TextBox Text="{Binding SelectedFeeder.FeederNo}" Width="60" Padding="4,2"/>
- </StackPanel>
- <!-- 名称 -->
- <StackPanel Orientation="Vertical" Margin="0,0,10,0">
- <TextBlock Text="{loc:Translate '名称'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
- <TextBox Text="{Binding SelectedFeeder.FeederName}" Width="120" Padding="4,2"/>
- </StackPanel>
- <!-- 品牌 -->
- <StackPanel Orientation="Vertical" Margin="0,0,10,0">
- <TextBlock Text="{loc:Translate '品牌'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
- <ComboBox ItemsSource="{Binding Source={StaticResource FeederBrandEnum}}"
- SelectedItem="{Binding SelectedFeeder.FeederBrand}"
- Width="90" Padding="4,2"/>
- </StackPanel>
- <!-- 连接方式 -->
- <StackPanel Orientation="Vertical" Margin="0,0,10,0">
- <TextBlock Text="{loc:Translate '连接方式'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
- <ComboBox ItemsSource="{Binding Source={StaticResource FeederConnectTypeEnum}}"
- SelectedItem="{Binding SelectedFeeder.ConnectType}"
- Width="100" Padding="4,2"/>
- </StackPanel>
- <!-- IP -->
- <StackPanel Orientation="Vertical" Margin="0,0,10,0">
- <TextBlock Text="{loc:Translate 'IP 地址'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
- <TextBox Text="{Binding SelectedFeeder.IP}" Width="130" Padding="4,2"/>
- </StackPanel>
- <!-- 端口 -->
- <StackPanel Orientation="Vertical" Margin="0,0,10,0">
- <TextBlock Text="{loc:Translate '端口'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
- <TextBox Text="{Binding SelectedFeeder.Port}" Width="70" Padding="4,2"/>
- </StackPanel>
- <!-- 串口号(仅支持 COM 连接的品牌显示;Team 只走 TCP) -->
- <StackPanel Orientation="Vertical" Margin="0,0,10,0"
- Visibility="{Binding ShowSerialConnection, Converter={StaticResource BoolToVis}}">
- <TextBlock Text="{loc:Translate '串口号'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
- <TextBox Text="{Binding SelectedFeeder.SerialPortName}" Width="80" Padding="4,2"/>
- </StackPanel>
- <!-- 波特率(仅支持 COM 连接的品牌显示) -->
- <StackPanel Orientation="Vertical"
- Visibility="{Binding ShowSerialConnection, Converter={StaticResource BoolToVis}}">
- <TextBlock Text="{loc:Translate '波特率'}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}"/>
- <TextBox Text="{Binding SelectedFeeder.BaudRate}" Width="80" Padding="4,2"/>
- </StackPanel>
- </StackPanel>
- </Grid>
- </Border>
- <!-- 主调试区:单 ContentControl 承载选中供料器类型的调试页(FeederDebugPageFactory 恒返回:Team→库内 DefaultFeederDebugPage,Afag→专属页);未选设备时显示提示 -->
- <Grid Grid.Row="2">
- <TextBlock Text="{loc:Translate '选择设备后显示调试页'}"
- HorizontalAlignment="Center" VerticalAlignment="Center"
- Foreground="{DynamicResource SecondaryTextBrush}"/>
- <ContentControl Content="{Binding CurrentFeederDebugPage}" Focusable="False"/>
- </Grid>
- <!-- 底部:收发通讯日志 (SendLog / ReceiveLog) -->
- <Border Grid.Row="3" Background="{DynamicResource RegionBrush}" CornerRadius="8"
- Padding="8" Margin="0,8,0,0" Height="170">
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,6">
- <TextBlock Text="{loc:Translate '📡 收发日志 (SendLog / ReceiveLog)'}" FontWeight="Bold" VerticalAlignment="Center"/>
- <Button Content="{loc:Translate '清空'}" Command="{Binding ClearCommLogCommand}"
- Style="{StaticResource ButtonDefault}" Margin="12,0,0,0" Padding="10,2"/>
- </StackPanel>
- <ListBox Grid.Row="1" ItemsSource="{Binding CommLogs}" Background="Transparent" BorderThickness="0"
- ScrollViewer.HorizontalScrollBarVisibility="Auto" FontFamily="Consolas" FontSize="12">
- <ListBox.ItemTemplate>
- <DataTemplate>
- <StackPanel Orientation="Horizontal">
- <TextBlock Text="{Binding TimeText}" Foreground="{DynamicResource SecondaryTextBrush}" Margin="0,0,8,0"/>
- <TextBlock Text="{Binding Direction}" Width="46" Margin="0,0,8,0">
- <TextBlock.Style>
- <Style TargetType="TextBlock">
- <Setter Property="Foreground" Value="{DynamicResource PrimaryBrush}"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding IsSend}" Value="False">
- <Setter Property="Foreground" Value="#FF8C00"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </TextBlock.Style>
- </TextBlock>
- <TextBlock Text="{Binding Content}" Foreground="{DynamicResource PrimaryTextBrush}"/>
- </StackPanel>
- </DataTemplate>
- </ListBox.ItemTemplate>
- </ListBox>
- </Grid>
- </Border>
- </Grid>
- <!-- ========== 全局固定变量(Global 作用域,不随产品变) ========== -->
- <Grid>
- <Grid.Style>
- <Style TargetType="Grid">
- <Setter Property="Visibility" Value="Collapsed"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding SelectedSection}" Value="GlobalVariable">
- <Setter Property="Visibility" Value="Visible"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </Grid.Style>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <!-- 标题 + 保存 -->
- <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="8" Padding="12,8" Margin="0,0,0,8">
- <DockPanel LastChildFill="False">
- <TextBlock DockPanel.Dock="Left" VerticalAlignment="Center" FontSize="13" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryBrush}"
- Text="{loc:Translate '全局固定变量(不随产品变);产品级变量请在产品右键菜单的全局变量中配置'}"/>
- <Button DockPanel.Dock="Right" Content="{loc:Translate '💾 保存'}"
- Command="{Binding SaveGlobalVarsCommand}"
- Style="{StaticResource ButtonPrimary}" Padding="12,4" FontSize="12"/>
- </DockPanel>
- </Border>
- <!-- 复用编辑器(绑定 Global 作用域工作集) -->
- <views:GlobalVarEditorView Grid.Row="1" DataContext="{Binding GlobalVarEditor}"/>
- </Grid>
- <!-- ========== 全局事件 ========== -->
- <DockPanel>
- <DockPanel.Style>
- <Style TargetType="DockPanel">
- <Setter Property="Visibility" Value="Collapsed"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding SelectedSection}" Value="GlobalEvent">
- <Setter Property="Visibility" Value="Visible"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </DockPanel.Style>
- <!-- 底部固定操作按钮 -->
- <Border DockPanel.Dock="Bottom" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="8" Padding="16" Margin="0,8,0,0">
- <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
- <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveGlobalEventConfigCommand}"
- Style="{StaticResource ButtonPrimary}" FontSize="14" Margin="0,0,8,0"/>
- <Button Content="{loc:Translate '📂 加载配置'}" Command="{Binding LoadGlobalEventConfigCommand}"
- Style="{StaticResource ButtonDefault}" FontSize="14"/>
- </StackPanel>
- </Border>
- <!-- 可滚动内容 -->
- <ScrollViewer VerticalScrollBarVisibility="Auto">
- <StackPanel Margin="8">
- <!-- 心跳配置 -->
- <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
- <DockPanel Margin="16">
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '(1) 全局心跳配置'}" FontSize="16" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
- <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,8">
- <Button Content="{loc:Translate '➕ 添加心跳'}" Command="{Binding AddHeartbeatCommand}"
- Style="{StaticResource ButtonPrimary}" Padding="12,4" FontSize="12" Margin="0,0,8,0"/>
- </StackPanel>
- <DataGrid ItemsSource="{Binding GlobalEventConfig.Heartbeats}" AutoGenerateColumns="False"
- CanUserAddRows="False" HeadersVisibility="All" GridLinesVisibility="Horizontal"
- AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}" MaxHeight="220">
- <DataGrid.Columns>
- <DataGridCheckBoxColumn Header="{loc:Translate '启用'}" Binding="{Binding Enabled}" Width="60"/>
- <DataGridTextColumn Header="{loc:Translate '设备名称'}" Binding="{Binding DeviceName}" Width="160"/>
- <DataGridTextColumn Header="{loc:Translate '设备类型'}" Binding="{Binding DeviceType}" Width="120"/>
- <DataGridTextColumn Header="{loc:Translate '间隔(ms)'}" Binding="{Binding IntervalMs}" Width="100"/>
- <DataGridTextColumn Header="{loc:Translate '超时(ms)'}" Binding="{Binding TimeoutMs}" Width="100"/>
- <DataGridTemplateColumn Header="{loc:Translate '操作'}" Width="80">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <Button Content="{loc:Translate '删除'}" Command="{Binding DataContext.RemoveHeartbeatCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
- CommandParameter="{Binding}"
- Style="{StaticResource ButtonDanger}" Padding="8,2" FontSize="11"/>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
- </DataGrid.Columns>
- </DataGrid>
- </DockPanel>
- </Border>
- <!-- 产品切换事件 -->
- <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
- <DockPanel Margin="16">
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '(2) 产品切换事件'}" FontSize="16" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
- <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,8">
- <Button Content="{loc:Translate '➕ 添加产品切换'}" Command="{Binding AddProductSwitchEventCommand}"
- Style="{StaticResource ButtonPrimary}" Padding="12,4" FontSize="12" Margin="0,0,8,0"/>
- </StackPanel>
- <DataGrid ItemsSource="{Binding GlobalEventConfig.ProductSwitchEvents}" AutoGenerateColumns="False"
- CanUserAddRows="False" HeadersVisibility="All" GridLinesVisibility="Horizontal"
- AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}" MaxHeight="220">
- <DataGrid.Columns>
- <DataGridTextColumn Header="{loc:Translate '序号'}" Binding="{Binding Sequence}" Width="60"/>
- <DataGridTextColumn Header="{loc:Translate '产品名称'}" Binding="{Binding ProductName}" Width="180"/>
- <DataGridTemplateColumn Header="{loc:Translate '操作'}" Width="80">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <Button Content="{loc:Translate '删除'}" Command="{Binding DataContext.RemoveProductSwitchEventCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
- CommandParameter="{Binding}"
- Style="{StaticResource ButtonDanger}" Padding="8,2" FontSize="11"/>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
- </DataGrid.Columns>
- </DataGrid>
- </DockPanel>
- </Border>
- </StackPanel>
- </ScrollViewer>
- </DockPanel>
- <!-- ========== 通用设置 ========== -->
- <DockPanel>
- <DockPanel.Style>
- <Style TargetType="DockPanel">
- <Setter Property="Visibility" Value="Collapsed"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding SelectedSection}" Value="General">
- <Setter Property="Visibility" Value="Visible"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </DockPanel.Style>
- <!-- 底部固定操作按钮 -->
- <Border DockPanel.Dock="Bottom" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="8" Padding="16" Margin="0,8,0,0">
- <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
- <Button Content="{loc:Translate '💾 保存配置'}" Command="{Binding SaveSystemConfigCommand}"
- Style="{StaticResource ButtonPrimary}" FontSize="14" Margin="0,0,8,0"/>
- <Button Content="{loc:Translate '📂 加载配置'}" Command="{Binding LoadSystemConfigCommand}"
- Style="{StaticResource ButtonDefault}" FontSize="14"/>
- </StackPanel>
- </Border>
- <!-- 可滚动内容 -->
- <ScrollViewer VerticalScrollBarVisibility="Auto">
- <StackPanel Margin="8">
- <!-- 应用信息 -->
- <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
- <DockPanel Margin="16">
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '应用信息'}" FontSize="16" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="*"/>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- </Grid.RowDefinitions>
- <TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Translate '软件标题:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
- <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding SystemConfig.Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- FontSize="13" Margin="0,0,0,12"/>
- <TextBlock Grid.Row="0" Grid.Column="2" Text="{loc:Translate '公司/品牌:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
- <TextBox Grid.Row="0" Grid.Column="3" Text="{Binding SystemConfig.CompanyTitle, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- FontSize="13" Margin="0,0,0,12"/>
- <TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Translate '软件版本:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
- <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding SystemConfig.SoftwareVersion}"
- FontSize="13" FontWeight="Bold" Foreground="{DynamicResource PrimaryBrush}"
- VerticalAlignment="Center" Margin="0,0,0,12"/>
-
- </Grid>
- </DockPanel>
- </Border>
- <!-- 视觉引擎(画面数/排列/名称已移至 产品管理,跟产品走) -->
- <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
- <DockPanel Margin="16">
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '👁 视觉引擎'}" FontSize="16" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
- <TextBlock Grid.Column="0" Text="{loc:Translate '视觉引擎:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,0"/>
- <ComboBox Grid.Column="1"
- ItemsSource="{Binding AvailableEngines}"
- SelectedItem="{Binding SelectedEngine, Mode=TwoWay}"
- DisplayMemberPath="EngineName"
- FontSize="13" MinWidth="260" HorizontalAlignment="Left"
- VerticalAlignment="Center"
- ToolTip="{loc:Translate '反射探测到的可用引擎,切换后主页画面与标定页随引擎变化'}"/>
- </Grid>
- </DockPanel>
- </Border>
- <!-- 语言设置 -->
- <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
- <DockPanel Margin="16">
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '🌍 语言设置'}" FontSize="16" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="Auto"/>
- </Grid.ColumnDefinitions>
- <TextBlock Grid.Column="0" Text="{loc:Translate '界面语言:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,0"/>
- <ComboBox Grid.Column="1"
- ItemsSource="{Binding AvailableLanguages}"
- SelectedItem="{Binding SelectedLanguage, Mode=TwoWay}"
- DisplayMemberPath="DisplayName"
- FontSize="13"
- MinWidth="200"
- HorizontalAlignment="Left"/>
- <Button Grid.Column="2" Content="{loc:Translate '🔄 刷新语言列表'}"
- Command="{Binding RefreshLanguagesCommand}"
- Style="{StaticResource ButtonDefault}"
- FontSize="13"
- Margin="15,0,0,0"
- HorizontalAlignment="Left"
- ToolTip="重新扫描 Localization 目录,发现新添加的语言"/>
- </Grid>
- </DockPanel>
- </Border>
- <!-- 插件日志 -->
- <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
- <DockPanel Margin="16">
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '📝 日志设置'}" FontSize="16" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- </Grid.RowDefinitions>
- <TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Translate '日志根目录:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
- <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.RootPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- FontSize="13" Margin="0,0,0,10" MinWidth="200" Width="auto" HorizontalAlignment="Left"
- ToolTip="{loc:Translate '程序目录下的相对子目录(默认 Logs),也可填绝对路径'}"/>
- <TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Translate '公共日志公式:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
- <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.CommonPattern, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- FontSize="13" Margin="0,0,0,10" FontFamily="Consolas" MinWidth="200" Width="auto" HorizontalAlignment="Left"
- ToolTip="{loc:Translate '占位符:{root} {flow} {task} {year} {month} {day} {time} {timestamp};默认 年\时间.log,1/2级日志写入此处'}"/>
- <TextBlock Grid.Row="2" Grid.Column="0" Text="{loc:Translate '任务日志公式:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
- <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.TaskPattern, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- FontSize="13" Margin="0,0,0,10" FontFamily="Consolas" MinWidth="200" Width="auto" HorizontalAlignment="Left"
- ToolTip="{loc:Translate '默认 流程名\任务名\年\时间.log,3/4级日志写入此处'}"/>
- <TextBlock Grid.Row="3" Grid.Column="0" Text="{loc:Translate '默认存储详细度:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
- <ComboBox Grid.Row="3" Grid.Column="1" ItemsSource="{Binding LogVerbosities}"
- SelectedItem="{Binding SystemConfig.PluginLog.DefaultStoreVerbosity, Mode=TwoWay}"
- FontSize="13" HorizontalAlignment="Left" MinWidth="200" Width="auto" Margin="0,0,0,10"
- ToolTip="{loc:Translate '新建插件默认「日志存储」详细度:粗略=只写公共日志(L1/L2);详细=额外写 流程/任务 独立日志(L3/L4)'}"/>
- <TextBlock Grid.Row="4" Grid.Column="0" Text="{loc:Translate '默认显示详细度:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
- <ComboBox Grid.Row="4" Grid.Column="1" ItemsSource="{Binding LogVerbosities}"
- SelectedItem="{Binding SystemConfig.PluginLog.DefaultDisplayVerbosity, Mode=TwoWay}"
- FontSize="13" HorizontalAlignment="Left" MinWidth="200" Width="auto" Margin="0,0,0,10"
- ToolTip="{loc:Translate '新建插件默认「日志显示」详细度:粗略=实时日志只显 L1/L2;详细=额外显 L3/L4(独立于存储)'}"/>
- <TextBlock Grid.Row="5" Grid.Column="0" Text="{loc:Translate '单文件上限(MB):'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,10"/>
- <TextBox Grid.Row="5" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.MaxFileMB, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- FontSize="13" Margin="0,0,0,10" MinWidth="200" Width="auto" HorizontalAlignment="Left"
- ToolTip="{loc:Translate '单个日志文件超过该大小(MB)自动归档;0 表示不按大小切分'}"/>
- <TextBlock Grid.Row="6" Grid.Column="0" Text="{loc:Translate '日志保留天数:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,0"/>
- <TextBox Grid.Row="6" Grid.Column="1" Text="{Binding SystemConfig.PluginLog.RetentionDays, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- FontSize="13" MinWidth="200" Width="auto" HorizontalAlignment="Left"
- ToolTip="{loc:Translate '超过该天数的归档日志由 NLog 自动删除;0 表示不删除'}"/>
- </Grid>
- </DockPanel>
- </Border>
- <!-- 顶部栏 & 导航按钮尺寸 -->
- <Border Background="{DynamicResource RegionBrush}" CornerRadius="8" Margin="0,0,0,12">
- <DockPanel Margin="16">
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '顶部栏、标题 & 状态栏'}" FontSize="16" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,12"/>
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="*"/>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- </Grid.RowDefinitions>
- <TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Translate '顶栏高度:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
- <hc:NumericUpDown Grid.Row="0" Grid.Column="1"
- Value="{Binding SystemConfig.Font.TopBarHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- Minimum="50" Maximum="120" Increment="2"
- FontSize="13" Margin="0,0,0,12"/>
- <TextBlock Grid.Row="0" Grid.Column="2" Text="{loc:Translate '中心标题字号:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
- <hc:NumericUpDown Grid.Row="0" Grid.Column="3"
- Value="{Binding SystemConfig.Font.CenterTitleFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- Minimum="12" Maximum="48" Increment="1"
- FontSize="13" Margin="0,0,0,12"/>
- <TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Translate '状态栏高度:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
- <hc:NumericUpDown Grid.Row="1" Grid.Column="1"
- Value="{Binding SystemConfig.Font.StatusBarHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- Minimum="30" Maximum="100" Increment="2"
- FontSize="13" Margin="0,0,0,12"/>
- <TextBlock Grid.Row="1" Grid.Column="2" Text="{loc:Translate '状态栏字号:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
- <hc:NumericUpDown Grid.Row="1" Grid.Column="3"
- Value="{Binding SystemConfig.Font.StatusBarFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- Minimum="9" Maximum="18" Increment="1"
- FontSize="13" Margin="0,0,0,12"/>
- <TextBlock Grid.Row="2" Grid.Column="0" Text="{loc:Translate '按钮宽度:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
- <hc:NumericUpDown Grid.Row="2" Grid.Column="1"
- Value="{Binding SystemConfig.Font.NavButtonWidth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- Minimum="60" Maximum="160" Increment="4"
- FontSize="13" Margin="0,0,0,12"/>
- <TextBlock Grid.Row="2" Grid.Column="2" Text="{loc:Translate '按钮高度:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
- <hc:NumericUpDown Grid.Row="2" Grid.Column="3"
- Value="{Binding SystemConfig.Font.NavButtonHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- Minimum="50" Maximum="120" Increment="2"
- FontSize="13" Margin="0,0,0,12"/>
- <TextBlock Grid.Row="3" Grid.Column="0" Text="{loc:Translate '按钮字体:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
- <hc:NumericUpDown Grid.Row="3" Grid.Column="1"
- Value="{Binding SystemConfig.Font.NavButtonFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- Minimum="10" Maximum="28" Increment="1"
- FontSize="13" Margin="0,0,0,12"/>
- <TextBlock Grid.Row="3" Grid.Column="2" Text="{loc:Translate '主题图标字号:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,12"/>
- <hc:NumericUpDown Grid.Row="3" Grid.Column="3"
- Value="{Binding SystemConfig.Font.ThemeIconSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- Minimum="12" Maximum="40" Increment="1"
- FontSize="13" Margin="0,0,0,12"/>
- <TextBlock Grid.Row="4" Grid.Column="0" Text="{loc:Translate '图标尺寸:'}" FontSize="13"
- Foreground="{DynamicResource SecondaryTextBrush}" VerticalAlignment="Center" Margin="0,0,12,0"/>
- <hc:NumericUpDown Grid.Row="4" Grid.Column="1"
- Value="{Binding SystemConfig.Font.NavIconSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- Minimum="16" Maximum="48" Increment="2"
- FontSize="13" Margin="0,0,0,0"/>
- </Grid>
- </DockPanel>
- </Border>
- </StackPanel>
- </ScrollViewer>
- </DockPanel>
- <!-- ========== 通讯管理 ========== -->
- <Grid>
- <Grid.Style>
- <Style TargetType="Grid">
- <Setter Property="Visibility" Value="Collapsed"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding IsCommSection}" Value="True">
- <Setter Property="Visibility" Value="Visible"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </Grid.Style>
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <!-- 工具栏 -->
- <Border Grid.Row="0" Background="{DynamicResource SecondaryRegionBrush}"
- CornerRadius="8" Padding="12,8" Margin="0,0,0,12">
- <StackPanel Orientation="Horizontal">
- <!-- 基础Tab: 选择类型 -->
- <StackPanel Orientation="Horizontal">
- <StackPanel.Style>
- <Style TargetType="StackPanel">
- <Setter Property="Visibility" Value="Visible"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding IsPlcTab}" Value="True">
- <Setter Property="Visibility" Value="Collapsed"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </StackPanel.Style>
- <TextBlock Text="{loc:Translate '类型:'}" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}"
- VerticalAlignment="Center" Margin="0,0,4,0"/>
- <ComboBox ItemsSource="{Binding BasicCommTypes}"
- SelectedValuePath="TypeKey"
- SelectedIndex="0"
- SelectedValue="{Binding AddTypeKey}"
- DisplayMemberPath="DisplayName"
- MinWidth="140" Padding="4,3" Margin="0,0,8,0"
- VerticalAlignment="Center"/>
- </StackPanel>
- <!-- PLC Tab: 选择协议 -->
- <StackPanel Orientation="Horizontal">
- <StackPanel.Style>
- <Style TargetType="StackPanel">
- <Setter Property="Visibility" Value="Collapsed"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding IsPlcTab}" Value="True">
- <Setter Property="Visibility" Value="Visible"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </StackPanel.Style>
- <TextBlock Text="{loc:Translate '协议:'}" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}"
- VerticalAlignment="Center" Margin="0,0,4,0"/>
- <ComboBox ItemsSource="{Binding PlcTypes}"
- SelectedIndex="0"
- SelectedItem="{Binding SelectedPlcType}"
- DisplayMemberPath="DisplayName"
- MinWidth="140" Padding="4,3" Margin="0,0,8,0"
- VerticalAlignment="Center"/>
- </StackPanel>
- <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
- <Button Content="{loc:Translate '➕ 添加'}" Style="{StaticResource ButtonPrimary}" Margin="8,0,4,0" Padding="12,4"
- Command="{Binding AddCommunicationCommand}"/>
- <Button Content="{loc:Translate '🗑 删除'}" Style="{StaticResource ButtonDanger}" Margin="4,0,8,0" Padding="12,4"
- Command="{Binding DeleteCommunicationCommand}"
- IsEnabled="{Binding HasSelectedCommunication}"/>
- <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
- <Button Content="{loc:Translate '🔗 连接'}" Style="{StaticResource ButtonDefault}" Margin="8,0,4,0" Padding="10,4"
- Command="{Binding ConnectCommunicationCommand}"
- IsEnabled="{Binding HasSelectedCommunication}"/>
- <Button Content="{loc:Translate '⛓ 断开'}" Style="{StaticResource ButtonDefault}" Margin="4,0,8,0" Padding="10,4"
- Command="{Binding DisconnectCommunicationCommand}"
- IsEnabled="{Binding HasSelectedCommunication}"/>
- <Button Content="{loc:Translate '🔗 全部连接'}" Style="{StaticResource ButtonDefault}" Margin="0,0,4,0" Padding="10,4"
- Command="{Binding ConnectAllCommand}"/>
- <Button Content="{loc:Translate '⛓ 全部断开'}" Style="{StaticResource ButtonDefault}" Margin="4,0,8,0" Padding="10,4"
- Command="{Binding DisconnectAllCommand}"/>
- <Rectangle Width="1" Height="24" Fill="{DynamicResource BorderBrush}" Margin="4,0"/>
- <Button Content="{loc:Translate '💾 保存配置'}" Style="{StaticResource ButtonDefault}" Margin="8,0,0,0" Padding="12,4"
- Command="{Binding SaveCommunicationsCommand}"/>
- </StackPanel>
- </Border>
- <!-- 列表 + 编辑区 -->
- <Grid Grid.Row="1" Margin="0,10,0,0">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="200"/>
- <ColumnDefinition Width="8"/>
- <ColumnDefinition Width="320"/>
- <ColumnDefinition Width="8"/>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
- <!-- 左:通讯列表 -->
- <Border Grid.Column="0" Background="{DynamicResource RegionBrush}"
- BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" CornerRadius="6">
- <DockPanel>
- <TextBlock DockPanel.Dock="Top" Text="{Binding CommTabDisplayText}" FontSize="13" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="12,10,12,8"/>
- <ListBox ItemsSource="{Binding DisplayedCommunications}"
- SelectedItem="{Binding SelectedCommunication}"
- BorderThickness="0" Background="Transparent"
- ScrollViewer.HorizontalScrollBarVisibility="Disabled">
- <ListBox.ItemTemplate>
- <DataTemplate>
- <StackPanel Margin="4,6">
- <DockPanel>
- <Border DockPanel.Dock="Right" CornerRadius="8"
- Background="{DynamicResource SecondaryRegionBrush}"
- Padding="8,2" VerticalAlignment="Center">
- <TextBlock FontSize="11">
- <TextBlock.Style>
- <Style TargetType="TextBlock">
- <Setter Property="Text" Value="未连接"/>
- <Setter Property="Foreground" Value="{DynamicResource SecondaryTextBrush}"/>
- <Style.Triggers>
- <DataTrigger Binding="{Binding IsConnected}" Value="True">
- <Setter Property="Text" Value="已连接"/>
- <Setter Property="Foreground" Value="#4CAF50"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </TextBlock.Style>
- </TextBlock>
- </Border>
- <TextBlock Text="{Binding Name}" FontSize="13" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}"
- TextTrimming="CharacterEllipsis"/>
- </DockPanel>
- <TextBlock Text="{Binding EndpointUrl}" FontSize="11" Margin="0,3,0,0"
- Foreground="{DynamicResource SecondaryTextBrush}"
- TextTrimming="CharacterEllipsis"/>
- </StackPanel>
- </DataTemplate>
- </ListBox.ItemTemplate>
- </ListBox>
- </DockPanel>
- </Border>
- <!-- 中:属性编辑区 -->
- <Border Grid.Column="2" Background="{DynamicResource RegionBrush}"
- BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" CornerRadius="6"
- IsEnabled="{Binding IsPropertyGridEnabled}">
- <DockPanel Margin="8,8">
- <TextBlock DockPanel.Dock="Top" Text="{loc:Translate '属性配置'}" FontSize="13" FontWeight="Bold"
- Foreground="{DynamicResource PrimaryTextBrush}" Margin="0,0,0,8"/>
- <TextBlock DockPanel.Dock="Bottom" Text="{Binding CommMessage}" FontSize="11"
- TextWrapping="Wrap"
- Foreground="{DynamicResource PrimaryBrush}" Margin="0,6,0,0"/>
- <pg:PropertyGrid SelectedObject="{Binding PropertyGridSelectedObject}"
- ShowSearchBar="True"
- ShowDescription="True"/>
- </DockPanel>
- </Border>
- <!-- 右:调试页宿主(CommunicationDebugPageFactory 创建品牌专属页或库内 DefaultCommunicationDebugPage,恒非空) -->
- <Border Grid.Column="4" Background="{DynamicResource RegionBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" CornerRadius="6">
- <ContentControl Content="{Binding CurrentCommunicationDebugPage}" Focusable="False"/>
- </Border>
- </Grid>
- </Grid>
- </Grid>
- </Grid>
- </UserControl>
|