XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEToolBox

【WPF】XFE工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
<UserControl x:Class="XFEToolBox.Tools.SpaceEngineers.Views.MainPage"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:controls="clr-namespace:XFEToolBox.WpfCore.Controls;assembly=XFEToolBox.WpfCore"
 Background="{DynamicResource ToolControlBackgroundBrush}" Foreground="{DynamicResource ToolTextPrimaryBrush}" FontSize="13">
 <UserControl.Resources>
  <BooleanToVisibilityConverter x:Key="BooleanVisibility"/>
  <Style x:Key="Card" TargetType="Border">
   <Setter Property="Background" Value="{DynamicResource ToolSurfaceBrush}"/>
   <Setter Property="BorderBrush" Value="{DynamicResource ToolControlBorderBrush}"/>
   <Setter Property="BorderThickness" Value="1"/><Setter Property="CornerRadius" Value="12"/>
   <Setter Property="Padding" Value="16"/>
  </Style>
  <Style x:Key="Hint" TargetType="TextBlock">
   <Setter Property="Foreground" Value="{DynamicResource ToolTextSecondaryBrush}"/>
   <Setter Property="TextWrapping" Value="Wrap"/>
  </Style>
  <Style x:Key="SectionTitle" TargetType="TextBlock">
   <Setter Property="FontSize" Value="16"/><Setter Property="FontWeight" Value="SemiBold"/>
   <Setter Property="Margin" Value="0,0,0,10"/>
  </Style>
  <Style x:Key="Action" TargetType="Button" BasedOn="{StaticResource ToolBoxButtonStyle}">
   <Setter Property="Margin" Value="0,0,8,8"/><Setter Property="MinHeight" Value="32"/>
  </Style>
  <Style x:Key="Field" TargetType="controls:TextEditor" BasedOn="{StaticResource {x:Type controls:TextEditor}}">
   <Setter Property="MinHeight" Value="34"/><Setter Property="VerticalAlignment" Value="Center"/>
  </Style>
 </UserControl.Resources>
 <Grid Margin="16">
  <Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="12"/><RowDefinition Height="*"/><RowDefinition Height="10"/><RowDefinition Height="Auto"/></Grid.RowDefinitions>
  <Border Style="{StaticResource Card}" Padding="16,12">
   <Grid>
    <Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
    <StackPanel Margin="0,0,16,0">
     <TextBlock Text="XFE Loader · Space Engineers" FontSize="21" FontWeight="SemiBold"/>
     <TextBlock Text="{Binding ProcessStatus}" Style="{StaticResource Hint}" Margin="0,5,0,0"/>
    </StackPanel>
    <StackPanel Grid.Column="1" VerticalAlignment="Center">
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
      <Button Content="启动游戏" Command="{Binding LaunchCommand}" controls:ButtonAssist.IsPrimary="True" MinWidth="88"/>
      <Button Content="正常退出" Command="{Binding CloseGameCommand}" Margin="8,0,0,0"/>
      <Button Content="重启游戏" Command="{Binding RestartCommand}" Margin="8,0,0,0"/>
     </StackPanel>
     <TextBlock Text="退出与重启前请先保存存档" Style="{StaticResource Hint}" FontSize="11" HorizontalAlignment="Right" Margin="0,5,0,0"/>
    </StackPanel>
   </Grid>
  </Border>
  <TabControl Grid.Row="2" SelectedIndex="{Binding SelectedTab}">
   <TabItem Header="插件管理">
    <Grid Margin="0,12,0,0">
     <Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions>
     <Grid Margin="0,0,0,10">
      <Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
      <controls:TextEditor Text="{Binding Filter, UpdateSourceTrigger=PropertyChanged}" HintText="筛选插件名称、来源或路径" Style="{StaticResource Field}"/>
      <ComboBox Grid.Column="1" ItemsSource="{Binding PluginFilters}" SelectedIndex="{Binding SelectedPluginFilter}" MinWidth="104" Margin="10,0,0,0"/>
      <Button Grid.Column="2" Content="刷新清单" Command="{Binding RefreshCommand}" Margin="10,0,0,0"/>
     </Grid>
     <WrapPanel Grid.Row="1" IsEnabled="{Binding CanEdit}">
      <Button Content="添加本地 DLL" Command="{Binding ImportDllCommand}" Style="{StaticResource Action}"/>
      <Button Content="添加插件目录" Command="{Binding ImportDirectoryCommand}" Style="{StaticResource Action}" ToolTip="选择包含已编译插件 DLL 的目录,自动识别入口及依赖"/>
      <Button Content="移除选中项" Command="{Binding RemovePluginCommand}" Style="{StaticResource Action}" ToolTip="从管理清单移除,保留插件文件;应用后生效"/>
     </WrapPanel>
     <Grid Grid.Row="2">
      <Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
      <Border Style="{StaticResource Card}" Padding="0">
       <Grid>
        <DataGrid x:Name="PluginsGrid" ItemsSource="{Binding PluginsView}" SelectedItem="{Binding SelectedPlugin}"
         AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False"
         HeadersVisibility="Column" SelectionMode="Single" SelectionUnit="FullRow" RowHeaderWidth="0"
         IsEnabled="{Binding CanEdit}" IsReadOnly="True" GridLinesVisibility="None" BorderThickness="0"
         HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
         <DataGrid.Columns>
          <DataGridTemplateColumn Header="启用" Width="64" CanUserSort="False">
           <DataGridTemplateColumn.CellTemplate><DataTemplate><CheckBox IsChecked="{Binding IsEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource ToolBoxGridCheckBoxStyle}" AutomationProperties.Name="启用插件"/></DataTemplate></DataGridTemplateColumn.CellTemplate>
          </DataGridTemplateColumn>
          <DataGridTemplateColumn Header="插件" Width="*" MinWidth="150" SortMemberPath="Name">
           <DataGridTemplateColumn.CellTemplate><DataTemplate><StackPanel Margin="8,8"><TextBlock Text="{Binding Name}" FontWeight="SemiBold" TextTrimming="CharacterEllipsis"/><TextBlock Text="{Binding Id}" Style="{StaticResource Hint}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" FontSize="11" Margin="0,3,0,0"/></StackPanel></DataTemplate></DataGridTemplateColumn.CellTemplate>
          </DataGridTemplateColumn>
          <DataGridTextColumn Header="原始文件" Binding="{Binding SourcePath}" IsReadOnly="True" Width="1.3*" MinWidth="180">
           <DataGridTextColumn.ElementStyle><Style TargetType="TextBlock" BasedOn="{StaticResource ToolBoxDataGridTextElementStyle}"><Setter Property="ToolTip" Value="{Binding SourcePath}"/></Style></DataGridTextColumn.ElementStyle>
          </DataGridTextColumn>
         </DataGrid.Columns>
        </DataGrid>
        <StackPanel Visibility="{Binding ShowEmptyPlugins, Converter={StaticResource BooleanVisibility}}" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="30" IsHitTestVisible="False">
         <TextBlock Text="{Binding EmptyPluginsTitle}" FontSize="18" FontWeight="SemiBold" TextAlignment="Center"/>
         <TextBlock Text="{Binding EmptyPluginsHint}" Style="{StaticResource Hint}" TextAlignment="Center" MaxWidth="390" Margin="0,8,0,0"/>
        </StackPanel>
       </Grid>
      </Border>
     </Grid>
     <StackPanel Grid.Row="3" Margin="0,10,0,0">
      <Border Background="{DynamicResource ToolAccentSoftBrush}" CornerRadius="8" Padding="10,8" Visibility="{Binding HasSelectedPlugin, Converter={StaticResource BooleanVisibility}}" Margin="0,0,0,9">
       <StackPanel><TextBlock Text="{Binding SelectedPlugin.Name}" FontWeight="SemiBold"/><TextBlock Text="{Binding SelectedPlugin.Description}" Style="{StaticResource Hint}" FontSize="12" MaxHeight="34" Margin="0,3,0,0"/><TextBlock Text="{Binding SelectedPlugin.Location}" Style="{StaticResource Hint}" FontSize="11" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" ToolTip="{Binding SelectedPlugin.Location}" Margin="0,3,0,0"/></StackPanel>
      </Border>
      <DockPanel LastChildFill="True">
       <Button DockPanel.Dock="Right" Content="应用更改" Command="{Binding ApplyCommand}" controls:ButtonAssist.IsPrimary="True" MinWidth="112" Margin="14,0,0,0"/>
       <StackPanel VerticalAlignment="Center"><TextBlock Text="{Binding PluginSummary}" FontWeight="SemiBold"/><TextBlock Text="{Binding ApplyHint}" Style="{StaticResource Hint}" FontSize="11" Margin="0,3,0,0"/></StackPanel>
      </DockPanel>
     </StackPanel>
    </Grid>
   </TabItem>
   <TabItem Header="启动与环境">
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" Margin="0,12,0,0">
     <StackPanel IsEnabled="{Binding CanEdit}" Margin="0,0,8,0">
      <Border Style="{StaticResource Card}">
       <StackPanel>
        <DockPanel><Button DockPanel.Dock="Right" Content="自动检测" Command="{Binding DetectCommand}"/><TextBlock Text="游戏与 XFE 加载器" Style="{StaticResource SectionTitle}"/></DockPanel>
        <Grid><Grid.ColumnDefinitions><ColumnDefinition Width="98"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
         <TextBlock Text="游戏 Bin64" VerticalAlignment="Center" Style="{StaticResource Hint}"/>
         <controls:TextEditor Grid.Column="1" Text="{Binding Bin64Path, UpdateSourceTrigger=PropertyChanged}" HintText="选择包含 SpaceEngineers.exe 的 Bin64 文件夹" Style="{StaticResource Field}"/>
         <Button Grid.Column="2" Content="浏览" Command="{Binding BrowseGameCommand}" Margin="8,0,0,0"/>
        </Grid>
        <Grid Margin="0,10,0,0"><Grid.ColumnDefinitions><ColumnDefinition Width="98"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
         <TextBlock Text="加载组件" VerticalAlignment="Center" Style="{StaticResource Hint}"/>
         <TextBlock Grid.Column="1" Text="XFE Loader" FontWeight="SemiBold" VerticalAlignment="Center"/>
         <Button Grid.Column="2" Content="构建 / 更新 XFE 加载器" Command="{Binding BuildLoaderCommand}" Margin="8,0,0,0"/>
        </Grid>
        <TextBlock Text="{Binding LoaderStatus}" Style="{StaticResource Hint}" FontSize="12" Margin="98,7,0,0"/>
        <Grid Margin="0,10,0,0"><Grid.ColumnDefinitions><ColumnDefinition Width="98"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
         <TextBlock Text="XFE 启动器" VerticalAlignment="Center" Style="{StaticResource Hint}"/>
         <controls:TextEditor Grid.Column="1" Grid.ColumnSpan="2" Text="{Binding LauncherPath, Mode=OneWay}" IsReadOnly="True" HintText="构建后显示生成的启动器路径" Style="{StaticResource Field}"/>
        </Grid>
        <Grid Margin="0,10,0,0"><Grid.ColumnDefinitions><ColumnDefinition Width="98"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
         <TextBlock Text="插件配置" VerticalAlignment="Center" Style="{StaticResource Hint}"/>
         <controls:TextEditor Grid.Column="1" Text="{Binding ProfilePath, UpdateSourceTrigger=PropertyChanged}" HintText="XFE 插件配置 JSON,留空使用工具独立配置" Style="{StaticResource Field}"/>
         <Button Grid.Column="2" Content="浏览" Command="{Binding BrowseProfileCommand}" Margin="8,0,0,0"/>
        </Grid>
       </StackPanel>
      </Border>
      <Border Style="{StaticResource Card}" Margin="0,12,0,0">
       <StackPanel>
        <DockPanel><Button DockPanel.Dock="Right" Content="+ 添加参数" Command="{Binding AddArgumentCommand}"/><TextBlock Text="启动参数" Style="{StaticResource SectionTitle}"/></DockPanel>
        <TextBlock Text="每行作为一个参数,无需自行添加引号。选项和它的值分别填写;空行保留为空字符串。" Style="{StaticResource Hint}" FontSize="12" Margin="0,0,0,10"/>
        <ItemsControl ItemsSource="{Binding Arguments}">
         <ItemsControl.ItemTemplate><DataTemplate><Grid Margin="0,0,0,8"><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions><controls:TextEditor Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource Field}"/><Button Grid.Column="1" Content="删除" Command="{Binding DataContext.RemoveArgumentCommand, RelativeSource={RelativeSource AncestorType=UserControl}}" CommandParameter="{Binding}" Margin="8,0,0,0"/></Grid></DataTemplate></ItemsControl.ItemTemplate>
        </ItemsControl>
       </StackPanel>
      </Border>
      <Border Style="{StaticResource Card}" Margin="0,12,0,0">
       <StackPanel>
        <TextBlock Text="自动重启" Style="{StaticResource SectionTitle}"/>
        <CheckBox Content="应用插件更改后,自动正常重启正在运行的游戏" IsChecked="{Binding AutoRestartAfterApply}" Margin="0,0,0,10"/>
        <CheckBox Content="已启用插件的源文件变化后,自动同步并正常重启" IsChecked="{Binding RestartOnLocalChanges}" Margin="0,0,0,8"/>
        <TextBlock Text="保存设置后开始监视。工具关闭或有未应用更改时暂停监视;请先保存存档,游戏未能正常退出时不会强制结束。" Style="{StaticResource Hint}" FontSize="12" Margin="24,0,0,10"/>
        <StackPanel Orientation="Horizontal"><TextBlock Text="正常退出等待时间" Style="{StaticResource Hint}" VerticalAlignment="Center"/><controls:TextEditor Text="{Binding CloseTimeoutText, UpdateSourceTrigger=PropertyChanged}" Width="72" Margin="12,0,8,0" Style="{StaticResource Field}"/><TextBlock Text="秒" Style="{StaticResource Hint}" VerticalAlignment="Center"/></StackPanel>
       </StackPanel>
      </Border>
      <WrapPanel Margin="0,12,0,0">
       <Button Content="保存环境设置" Command="{Binding SaveSettingsCommand}" Style="{StaticResource Action}" controls:ButtonAssist.IsPrimary="True"/>
       <Button Content="原版启动(不加载插件)" Command="{Binding LaunchVanillaCommand}" Style="{StaticResource Action}"/>
       <Button Content="打开游戏目录" Command="{Binding OpenGameDirectoryCommand}" Style="{StaticResource Action}"/>
      </WrapPanel>
     </StackPanel>
    </ScrollViewer>
   </TabItem>
   <TabItem Header="备份与日志">
    <Grid Margin="0,12,0,0">
     <Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="12"/><RowDefinition Height="*"/></Grid.RowDefinitions>
     <Border Style="{StaticResource Card}">
      <StackPanel>
       <TextBlock Text="插件配置备份" Style="{StaticResource SectionTitle}"/>
       <TextBlock Text="应用配置前自动备份。恢复插件清单与对应的 DLL 版本,不修改插件源文件和游戏存档。" Style="{StaticResource Hint}" FontSize="12" Margin="0,0,0,10"/>
       <Grid><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
        <ComboBox ItemsSource="{Binding Backups}" SelectedItem="{Binding SelectedBackup}" DisplayMemberPath="Name" MinHeight="34" ToolTip="{Binding SelectedBackup.Path}" IsEnabled="{Binding CanEdit}"/>
        <Button Grid.Column="1" Content="刷新备份" Command="{Binding RefreshBackupsCommand}" Margin="8,0,0,0"/>
        <Button Grid.Column="2" Content="恢复选中备份" Command="{Binding RestoreCommand}" Margin="8,0,0,0"/>
       </Grid>
       <TextBlock Text="{Binding BackupSummary}" Style="{StaticResource Hint}" FontSize="11" Margin="0,8,0,0"/>
      </StackPanel>
     </Border>
     <Border Grid.Row="2" Style="{StaticResource Card}" Padding="12">
      <Grid>
       <Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions>
       <DockPanel Margin="0,0,0,8"><StackPanel DockPanel.Dock="Right" Orientation="Horizontal"><Button Content="导出日志" Command="{Binding ExportLogCommand}"/><Button Content="清空" Command="{Binding ClearLogCommand}" Margin="8,0,0,0"/></StackPanel><TextBlock Text="运行日志" FontSize="16" FontWeight="SemiBold" VerticalAlignment="Center"/></DockPanel>
       <TextBox x:Name="LogBox" Grid.Row="1" Text="{Binding LogText, Mode=OneWay}" IsReadOnly="True" AcceptsReturn="True" TextWrapping="Wrap" VerticalContentAlignment="Top" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" BorderThickness="0" Background="Transparent" FontFamily="Cascadia Mono, Consolas" FontSize="12"/>
      </Grid>
     </Border>
    </Grid>
   </TabItem>
  </TabControl>
  <Grid Grid.Row="4">
   <Grid.RowDefinitions><RowDefinition Height="3"/><RowDefinition Height="6"/><RowDefinition Height="Auto"/></Grid.RowDefinitions>
   <ProgressBar IsIndeterminate="{Binding IsBusy}" Visibility="{Binding IsBusy, Converter={StaticResource BooleanVisibility}}" Height="3"/>
   <DockPanel Grid.Row="2"><Button DockPanel.Dock="Right" Content="取消" Command="{Binding CancelCommand}" Visibility="{Binding IsBusy, Converter={StaticResource BooleanVisibility}}" Margin="12,0,0,0" Padding="10,4"/><TextBlock Text="{Binding Status}" Style="{StaticResource Hint}" VerticalAlignment="Center" MaxHeight="36" TextTrimming="CharacterEllipsis" ToolTip="{Binding Status}"/></DockPanel>
  </Grid>
 </Grid>
</UserControl>