MainWindow.axaml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <Window xmlns="https://github.com/avaloniaui"
  2. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  3. xmlns:vm="using:YZWater.Core.ViewModels"
  4. xmlns:views="using:YZWater.Avalonia.Views"
  5. xmlns:conv="using:YZWater.Avalonia.Converters"
  6. xmlns:th="using:YZWater.Avalonia.Controls"
  7. x:Class="YZWater.Avalonia.Views.MainWindow"
  8. x:DataType="vm:MainViewModel"
  9. Title="{Binding Title}"
  10. Icon="/Assets/app-icon.png"
  11. WindowDecorations="None"
  12. Width="1280" Height="800"
  13. MinWidth="1024" MinHeight="700"
  14. WindowStartupLocation="CenterScreen"
  15. WindowState="Maximized"
  16. Background="{DynamicResource AppBgBrush}">
  17. <Window.DataContext>
  18. <vm:MainViewModel/>
  19. </Window.DataContext>
  20. <DockPanel>
  21. <!-- ═══ 自定义标题栏 ═══ -->
  22. <Border DockPanel.Dock="Top" Background="{DynamicResource NavBgBrush}" Height="32"
  23. PointerPressed="OnTitleBarPointerPressed" Cursor="Hand">
  24. <Grid ColumnDefinitions="Auto,*,Auto">
  25. <Image Source="/Assets/app-icon.png" Width="20" Height="20" Margin="8,0,4,0" VerticalAlignment="Center"/>
  26. <TextBlock Grid.Column="1" Text="{Binding Title}" FontSize="13" FontWeight="SemiBold"
  27. VerticalAlignment="Center" Foreground="{DynamicResource TextPrimaryBrush}"/>
  28. <StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Center">
  29. <Button Content="─" Click="OnMinimizeClick" Width="36" Height="32" BorderThickness="0"
  30. Background="Transparent" FontSize="14" HorizontalContentAlignment="Center"/>
  31. <Button x:Name="MaximizeBtn" Content="☐" Click="OnMaximizeClick" Width="36" Height="32" BorderThickness="0"
  32. Background="Transparent" FontSize="14" HorizontalContentAlignment="Center"/>
  33. <Button Content="✕" Click="OnCloseClick" Width="36" Height="32" BorderThickness="0"
  34. Background="Transparent" FontSize="14" HorizontalContentAlignment="Center"
  35. Foreground="#E74C3C"/>
  36. </StackPanel>
  37. </Grid>
  38. </Border>
  39. <!-- ═══ 底部导航栏 ═══ -->
  40. <Border x:Name="NavBar" DockPanel.Dock="Bottom" Background="{DynamicResource NavBgBrush}"
  41. BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0" Padding="4,0">
  42. <Grid ColumnDefinitions="*,Auto,Auto,Auto">
  43. <!-- 导航按钮 -->
  44. <StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Center" Spacing="0">
  45. <Button Command="{Binding ShowViewACommand}" Padding="20,8" BorderThickness="0" Background="Transparent">
  46. <StackPanel Orientation="Horizontal" Spacing="6">
  47. <Border Width="3" Height="14" CornerRadius="1"
  48. Background="{Binding IsTabAActive, Converter={x:Static conv:BoolConverters.ToBrush}}"/>
  49. <TextBlock Text="{Binding NavProcess}" FontFamily="Consolas, monospace" FontSize="11"
  50. FontWeight="{Binding IsTabAActive, Converter={x:Static conv:BoolConverters.ToFontWeight}}"
  51. Foreground="{Binding IsTabAActive, Converter={x:Static conv:BoolConverters.ToBrush}}"/>
  52. </StackPanel>
  53. </Button>
  54. <Border Background="{DynamicResource BorderBrush}" Width="1" Height="20" VerticalAlignment="Center"/>
  55. <Button Command="{Binding ShowViewBCommand}" Padding="20,8" BorderThickness="0" Background="Transparent">
  56. <StackPanel Orientation="Horizontal" Spacing="6">
  57. <Border Width="3" Height="14" CornerRadius="1"
  58. Background="{Binding IsTabBActive, Converter={x:Static conv:BoolConverters.ToBrush}}"/>
  59. <TextBlock Text="{Binding NavParams}" FontFamily="Consolas, monospace" FontSize="11"
  60. FontWeight="{Binding IsTabBActive, Converter={x:Static conv:BoolConverters.ToFontWeight}}"
  61. Foreground="{Binding IsTabBActive, Converter={x:Static conv:BoolConverters.ToBrush}}"/>
  62. </StackPanel>
  63. </Button>
  64. <Border Background="{DynamicResource BorderBrush}" Width="1" Height="20" VerticalAlignment="Center"/>
  65. <Button Command="{Binding ShowViewCCommand}" Padding="20,8" BorderThickness="0" Background="Transparent">
  66. <StackPanel Orientation="Horizontal" Spacing="6">
  67. <Border Width="3" Height="14" CornerRadius="1"
  68. Background="{Binding IsTabCActive, Converter={x:Static conv:BoolConverters.ToBrush}}"/>
  69. <TextBlock Text="{Binding NavFlow}" FontFamily="Consolas, monospace" FontSize="11"
  70. FontWeight="{Binding IsTabCActive, Converter={x:Static conv:BoolConverters.ToFontWeight}}"
  71. Foreground="{Binding IsTabCActive, Converter={x:Static conv:BoolConverters.ToBrush}}"/>
  72. </StackPanel>
  73. </Button>
  74. <Border Background="{DynamicResource BorderBrush}" Width="1" Height="20" VerticalAlignment="Center"/>
  75. <Button Command="{Binding ShowViewDCommand}" Padding="20,8" BorderThickness="0" Background="Transparent">
  76. <StackPanel Orientation="Horizontal" Spacing="6">
  77. <Border Width="3" Height="14" CornerRadius="1"
  78. Background="{Binding IsTabDActive, Converter={x:Static conv:BoolConverters.ToBrush}}"/>
  79. <TextBlock Text="{Binding NavAlarm}" FontFamily="Consolas, monospace" FontSize="11"
  80. FontWeight="{Binding IsTabDActive, Converter={x:Static conv:BoolConverters.ToFontWeight}}"
  81. Foreground="{Binding IsTabDActive, Converter={x:Static conv:BoolConverters.ToBrush}}"/>
  82. </StackPanel>
  83. </Button>
  84. <Border Background="{DynamicResource BorderBrush}" Width="1" Height="20" VerticalAlignment="Center"/>
  85. <Button Command="{Binding ShowViewECommand}" Padding="20,8" BorderThickness="0" Background="Transparent">
  86. <StackPanel Orientation="Horizontal" Spacing="6">
  87. <Border Width="3" Height="14" CornerRadius="1"
  88. Background="{Binding IsTabEActive, Converter={x:Static conv:BoolConverters.ToBrush}}"/>
  89. <TextBlock Text="{Binding NavAbout}" FontFamily="Consolas, monospace" FontSize="11"
  90. FontWeight="{Binding IsTabEActive, Converter={x:Static conv:BoolConverters.ToFontWeight}}"
  91. Foreground="{Binding IsTabEActive, Converter={x:Static conv:BoolConverters.ToBrush}}"/>
  92. </StackPanel>
  93. </Button>
  94. <Border Background="{DynamicResource BorderBrush}" Width="1" Height="20" VerticalAlignment="Center"/>
  95. <Button Command="{Binding ShowViewFCommand}" Padding="20,8" BorderThickness="0" Background="Transparent">
  96. <StackPanel Orientation="Horizontal" Spacing="6">
  97. <Border Width="3" Height="14" CornerRadius="1"
  98. Background="{Binding IsTabFActive, Converter={x:Static conv:BoolConverters.ToBrush}}"/>
  99. <TextBlock Text="{Binding NavAudit}" FontFamily="Consolas, monospace" FontSize="11"
  100. FontWeight="{Binding IsTabFActive, Converter={x:Static conv:BoolConverters.ToFontWeight}}"
  101. Foreground="{Binding IsTabFActive, Converter={x:Static conv:BoolConverters.ToBrush}}"/>
  102. </StackPanel>
  103. </Button>
  104. </StackPanel>
  105. <!-- 主题切换 -->
  106. <Button Grid.Column="1" Command="{Binding ToggleThemeCommand}" Classes="btn-toggle" Margin="8,0">
  107. <StackPanel Orientation="Horizontal" Spacing="6">
  108. <TextBlock Text="{Binding ThemeIcon}" FontSize="14" VerticalAlignment="Center"/>
  109. <TextBlock Text="THEME" FontSize="10" VerticalAlignment="Center"
  110. Foreground="{DynamicResource TextSecondaryBrush}"/>
  111. </StackPanel>
  112. </Button>
  113. <!-- 语言切换 -->
  114. <Button Grid.Column="2" Command="{Binding ToggleLanguageCommand}" Classes="btn-toggle" Margin="0,0,8,0">
  115. <StackPanel Orientation="Horizontal" Spacing="6">
  116. <TextBlock Text="{Binding LangIcon}" FontSize="12" FontWeight="Bold" VerticalAlignment="Center"/>
  117. <TextBlock Text="LANG" FontSize="10" VerticalAlignment="Center"
  118. Foreground="{DynamicResource TextSecondaryBrush}"/>
  119. </StackPanel>
  120. </Button>
  121. <!-- 用户信息 + 模式指示 -->
  122. <StackPanel Grid.Column="3" Orientation="Horizontal" Spacing="8" Margin="8,0" VerticalAlignment="Center">
  123. <Border CornerRadius="4" Padding="6,2" Background="{DynamicResource CardBgBrush}">
  124. <StackPanel Orientation="Horizontal" Spacing="4">
  125. <Ellipse Width="8" Height="8" Fill="{Binding PlcStatusColor}" VerticalAlignment="Center"/>
  126. <TextBlock Text="{Binding PlcStatusText}" FontSize="10" Foreground="{DynamicResource TextSecondaryBrush}"/>
  127. </StackPanel>
  128. </Border>
  129. <Border Background="{DynamicResource CardBgBrush}" CornerRadius="4" Padding="6,2">
  130. <TextBlock Text="{Binding HubStatusText}" FontSize="10" Foreground="{DynamicResource TextSecondaryBrush}"/>
  131. </Border>
  132. <TextBlock Text="{Binding CurrentUserName}" FontSize="12" FontWeight="Bold" VerticalAlignment="Center"/>
  133. <Border Background="{DynamicResource PrimaryBrush}" CornerRadius="4" Padding="6,2">
  134. <TextBlock Text="{Binding CurrentUserRole}" FontSize="10" Foreground="White"/>
  135. </Border>
  136. <Button Command="{Binding ToggleUserDialogCommand}" IsVisible="{Binding CanManageUsers}"
  137. Content="{Binding UserManageText}" Padding="8,4" FontSize="11" Classes="btn-primary"/>
  138. <Button Command="{Binding LogoutCommand}" Content="{Binding LogoutText}" Padding="8,4" FontSize="11" Classes="btn-danger"/>
  139. </StackPanel>
  140. </Grid>
  141. </Border>
  142. <!-- ═══ 主内容区域 ═══ -->
  143. <Panel>
  144. <!-- 视图内容(通过 CurrentView + DataTemplate 切换) -->
  145. <ContentControl Content="{Binding CurrentView}"/>
  146. <!-- ═══ 用户管理对话框 ═══ -->
  147. <Border IsVisible="{Binding ShowUserDialog}" ZIndex="100" Background="#CC000000">
  148. <Border Background="{DynamicResource CardBgBrush}" CornerRadius="12" Padding="24"
  149. MaxWidth="600" MaxHeight="500" VerticalAlignment="Center" HorizontalAlignment="Center"
  150. BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1">
  151. <DockPanel>
  152. <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Spacing="12" Margin="0,0,0,16">
  153. <TextBlock Text="{Binding UserManageText}" FontSize="18" FontWeight="Bold"/>
  154. <Button Content="{Binding CloseText}" Command="{Binding ToggleUserDialogCommand}" HorizontalAlignment="Right" Classes="btn-danger"/>
  155. </StackPanel>
  156. <!-- 创建用户 -->
  157. <Border DockPanel.Dock="Top" Background="{DynamicResource CardBgBrush}" CornerRadius="8" Padding="12" Margin="0,0,0,12">
  158. <StackPanel Spacing="8">
  159. <TextBlock Text="{Binding CreateNewUserText}" FontWeight="Bold" FontSize="14"/>
  160. <StackPanel Orientation="Horizontal" Spacing="8">
  161. <TextBox Text="{Binding NewUserName}" PlaceholderText="{Binding UserNameLabel}" Width="120"/>
  162. <TextBox Text="{Binding NewUserPassword}" PlaceholderText="{Binding PasswordLabel}" PasswordChar="●" Width="120"/>
  163. <TextBox Text="{Binding NewUserDisplayName}" PlaceholderText="{Binding DisplayNameLabel}" Width="120"/>
  164. <ComboBox SelectedIndex="{Binding NewUserRole}" Width="100">
  165. <ComboBoxItem Content="Viewer"/>
  166. <ComboBoxItem Content="Operator"/>
  167. <ComboBoxItem Content="Engineer"/>
  168. <ComboBoxItem Content="Admin"/>
  169. </ComboBox>
  170. <Button Content="{Binding CreateText}" Command="{Binding CreateUserCommand}" Classes="btn-success"/>
  171. </StackPanel>
  172. <TextBlock Text="{Binding UserManageMessage}" Foreground="Red" FontSize="12"/>
  173. </StackPanel>
  174. </Border>
  175. <!-- 用户列表 -->
  176. <DataGrid ItemsSource="{Binding UserList}" AutoGenerateColumns="False" IsReadOnly="True"
  177. GridLinesVisibility="Horizontal" CanUserResizeColumns="True">
  178. <DataGrid.Columns>
  179. <DataGridTextColumn Header="User" Binding="{Binding UserName}" Width="100"/>
  180. <DataGridTextColumn Header="Name" Binding="{Binding DisplayName}" Width="120"/>
  181. <DataGridTextColumn Header="Role" Binding="{Binding Role}" Width="80"/>
  182. <DataGridTextColumn Header="Status" Binding="{Binding IsActive}" Width="60"/>
  183. <DataGridTextColumn Header="Last Login" Binding="{Binding LastLoginTime, StringFormat='yyyy-MM-dd HH:mm'}" Width="140"/>
  184. <DataGridTemplateColumn Header="Action" Width="80">
  185. <DataGridTemplateColumn.CellTemplate>
  186. <DataTemplate>
  187. <Button Content="{Binding IsActive, Converter={x:Static conv:BoolConverters.ToActiveText}}"
  188. Command="{Binding $parent[DataGrid].((vm:MainViewModel)DataContext).ToggleUserActiveCommand}"
  189. CommandParameter="{Binding}"
  190. Classes="btn-toggle" Padding="6,2" FontSize="11"/>
  191. </DataTemplate>
  192. </DataGridTemplateColumn.CellTemplate>
  193. </DataGridTemplateColumn>
  194. </DataGrid.Columns>
  195. </DataGrid>
  196. </DockPanel>
  197. </Border>
  198. </Border>
  199. </Panel>
  200. </DockPanel>
  201. </Window>