<Window x:Class="DeviceService.MainWindow"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:local="clr-namespace:DeviceService"
|
xmlns:service="clr-namespace:DeviceService.Service"
|
mc:Ignorable="d"
|
Title="设备服务" Height="560" Width="960"
|
Background="{StaticResource PageBackgroundBrush}">
|
<Grid Margin="12">
|
<Grid.ColumnDefinitions>
|
<ColumnDefinition Width="250" />
|
<ColumnDefinition Width="*" />
|
</Grid.ColumnDefinitions>
|
|
<!-- 左侧:按 Type 分组的设备树 -->
|
<Border Grid.Column="0" Style="{StaticResource CardBorder}" Margin="0,0,10,0">
|
<DockPanel Margin="4">
|
<TextBlock DockPanel.Dock="Top"
|
Style="{StaticResource TitleText}"
|
Text="设备列表"
|
Margin="6,2,0,10" />
|
<TreeView x:Name="DeviceTree"
|
Background="Transparent"
|
BorderThickness="0"
|
ItemContainerStyle="{StaticResource DeviceTreeViewItem}"
|
SelectedItemChanged="DeviceTree_SelectedItemChanged">
|
<TreeView.Resources>
|
<HierarchicalDataTemplate DataType="{x:Type local:DeviceGroupNode}"
|
ItemsSource="{Binding Children}">
|
<StackPanel Orientation="Horizontal">
|
<Border Background="{StaticResource AccentFaintBrush}"
|
CornerRadius="4"
|
Padding="5,1"
|
Margin="0,0,6,0">
|
<TextBlock Text="{Binding Type}"
|
FontSize="11"
|
FontWeight="Bold"
|
Foreground="{StaticResource AccentPressedBrush}" />
|
</Border>
|
</StackPanel>
|
</HierarchicalDataTemplate>
|
<DataTemplate DataType="{x:Type local:DeviceNode}">
|
<TextBlock Text="{Binding DisplayName}" TextTrimming="CharacterEllipsis" />
|
</DataTemplate>
|
</TreeView.Resources>
|
</TreeView>
|
</DockPanel>
|
</Border>
|
|
<!-- 右侧:工具栏 + 设备配置区域 -->
|
<Grid Grid.Column="1">
|
<Grid.RowDefinitions>
|
<RowDefinition Height="Auto" />
|
<RowDefinition Height="*" />
|
</Grid.RowDefinitions>
|
|
<DockPanel Grid.Row="0" Margin="0,0,0,10">
|
<StackPanel Orientation="Horizontal" DockPanel.Dock="Right" VerticalAlignment="Center">
|
<!-- 服务状态徽标:绑定全局状态机 ServiceStateMachine.GlobalState.State -->
|
<Border x:Name="ServiceStateBadge"
|
CornerRadius="12"
|
Padding="12,5"
|
Margin="0,0,12,0"
|
VerticalAlignment="Center">
|
<Border.Style>
|
<Style TargetType="Border">
|
<Setter Property="Background" Value="#F3F4F6" />
|
<Style.Triggers>
|
<DataTrigger Binding="{Binding State, Source={x:Static service:ServiceStateMachine.GlobalState}}"
|
Value="Running">
|
<Setter Property="Background" Value="#D1FAE5" />
|
</DataTrigger>
|
<DataTrigger Binding="{Binding State, Source={x:Static service:ServiceStateMachine.GlobalState}}"
|
Value="Error">
|
<Setter Property="Background" Value="#FEE2E2" />
|
</DataTrigger>
|
</Style.Triggers>
|
</Style>
|
</Border.Style>
|
<TextBlock x:Name="ServiceStateText" FontSize="12.5" FontWeight="SemiBold">
|
<TextBlock.Style>
|
<Style TargetType="TextBlock">
|
<Setter Property="Text" Value="未启动" />
|
<Setter Property="Foreground" Value="{StaticResource TextSecondaryBrush}" />
|
<Style.Triggers>
|
<DataTrigger Binding="{Binding State, Source={x:Static service:ServiceStateMachine.GlobalState}}"
|
Value="Running">
|
<Setter Property="Text" Value="运行中" />
|
<Setter Property="Foreground" Value="#047857" />
|
</DataTrigger>
|
<DataTrigger Binding="{Binding State, Source={x:Static service:ServiceStateMachine.GlobalState}}"
|
Value="Error">
|
<Setter Property="Text" Value="异常" />
|
<Setter Property="Foreground" Value="#B91C1C" />
|
</DataTrigger>
|
</Style.Triggers>
|
</Style>
|
</TextBlock.Style>
|
</TextBlock>
|
</Border>
|
|
<!-- 启动/停止:Running 时文案变为“停止”,点击走停止逻辑 -->
|
<Button x:Name="StartServiceBtn"
|
MinWidth="92"
|
Click="StartService_Click">
|
<Button.Style>
|
<Style TargetType="Button" BasedOn="{StaticResource PrimaryButton}">
|
<Setter Property="Content" Value="启动" />
|
<Style.Triggers>
|
<DataTrigger Binding="{Binding State, Source={x:Static service:ServiceStateMachine.GlobalState}}"
|
Value="Running">
|
<Setter Property="Content" Value="停止" />
|
<Setter Property="Background" Value="#B91C1C" />
|
</DataTrigger>
|
</Style.Triggers>
|
</Style>
|
</Button.Style>
|
</Button>
|
|
<!-- 添加设备:服务运行中禁止操作 -->
|
<Button x:Name="AddDeviceButton"
|
MinWidth="92"
|
Margin="8,0,0,0"
|
Content="添加设备"
|
Click="AddDeviceButton_Click">
|
<Button.Style>
|
<Style TargetType="Button" BasedOn="{StaticResource PrimaryButton}">
|
<Style.Triggers>
|
<DataTrigger Binding="{Binding State, Source={x:Static service:ServiceStateMachine.GlobalState}}"
|
Value="Running">
|
<Setter Property="IsEnabled" Value="False" />
|
</DataTrigger>
|
</Style.Triggers>
|
</Style>
|
</Button.Style>
|
</Button>
|
|
<!-- 刷新:服务运行中禁止操作 -->
|
<Button x:Name="RefreshButton"
|
MinWidth="72"
|
Margin="8,0,0,0"
|
Content="刷新"
|
Click="RefreshButton_Click">
|
<Button.Style>
|
<Style TargetType="Button" BasedOn="{StaticResource SecondaryButton}">
|
<Style.Triggers>
|
<DataTrigger Binding="{Binding State, Source={x:Static service:ServiceStateMachine.GlobalState}}"
|
Value="Running">
|
<Setter Property="IsEnabled" Value="False" />
|
</DataTrigger>
|
</Style.Triggers>
|
</Style>
|
</Button.Style>
|
</Button>
|
<Button x:Name="DebugWindowButton"
|
Style="{StaticResource SecondaryButton}"
|
MinWidth="92"
|
Margin="8,0,0,0"
|
Content="调试窗口"
|
Click="DebugWindowButton_Click" />
|
<Button x:Name="LogWindowButton"
|
Style="{StaticResource SecondaryButton}"
|
MinWidth="72"
|
Margin="8,0,0,0"
|
Content="日志"
|
Click="LogWindowButton_Click" />
|
</StackPanel>
|
<TextBlock x:Name="HeaderText"
|
Style="{StaticResource SectionText}"
|
Text="设备配置"
|
VerticalAlignment="Center" />
|
</DockPanel>
|
|
<Border Grid.Row="1" Style="{StaticResource CardBorder}">
|
<ContentControl x:Name="ConfigHost" Margin="4" Focusable="False" />
|
</Border>
|
</Grid>
|
</Grid>
|
</Window>
|