Добавьте файлы проекта.
This commit is contained in:
359
SQLVision.UI/Views/MainWindow.xaml
Normal file
359
SQLVision.UI/Views/MainWindow.xaml
Normal file
@@ -0,0 +1,359 @@
|
||||
<Window
|
||||
x:Class="SQLVision.UI.Views.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:controls="using:SQLVision.UI.Controls"
|
||||
xmlns:charts="using:LiveChartsCore.SkiaSharpView.WinUI"
|
||||
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
|
||||
xmlns:converters="using:SQLVision.UI.Converters"
|
||||
mc:Ignorable="d"
|
||||
Title="SQLVision"
|
||||
Width="1200"
|
||||
Height="800"
|
||||
MinWidth="800"
|
||||
MinHeight="600">
|
||||
|
||||
<Window.Resources>
|
||||
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibility"/>
|
||||
<converters:InverseBooleanConverter x:Key="InverseBool"/>
|
||||
|
||||
<Style TargetType="Button" x:Key="IconButtonStyle">
|
||||
<Setter Property="Margin" Value="2"/>
|
||||
<Setter Property="Padding" Value="8,4"/>
|
||||
<Setter Property="MinWidth" Value="80"/>
|
||||
</Style>
|
||||
</Window.Resources>
|
||||
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Панель инструментов -->
|
||||
<CommandBar Grid.Row="0" DefaultLabelPosition="Right">
|
||||
<AppBarButton
|
||||
Icon="Refresh"
|
||||
Label="Обновить скрипты"
|
||||
Command="{x:Bind ViewModel.LoadScriptsCommand}"/>
|
||||
<AppBarSeparator/>
|
||||
|
||||
<AppBarButton
|
||||
Icon="Play"
|
||||
Label="Выполнить"
|
||||
Command="{x:Bind ViewModel.ExecuteCommand}"
|
||||
IsEnabled="{x:Bind ViewModel.ExecuteCommand.IsRunning, Converter={StaticResource InverseBool}, Mode=OneWay}"/>
|
||||
|
||||
<AppBarButton
|
||||
Icon="Save"
|
||||
Label="Экспорт"
|
||||
Command="{x:Bind ViewModel.ExportCommand}"/>
|
||||
|
||||
<AppBarButton
|
||||
Icon="Copy"
|
||||
Label="Копировать SQL"
|
||||
Command="{x:Bind ViewModel.CopySqlCommand}"/>
|
||||
|
||||
<AppBarSeparator/>
|
||||
|
||||
<AppBarButton
|
||||
Icon="Clear"
|
||||
Label="Очистить результаты"
|
||||
Command="{x:Bind ViewModel.ClearResultsCommand}"/>
|
||||
|
||||
<AppBarSeparator/>
|
||||
|
||||
<AppBarButton
|
||||
Icon="SaveLocal"
|
||||
Label="Сохранить параметры"
|
||||
Command="{x:Bind ViewModel.SaveParametersCommand}"/>
|
||||
|
||||
<AppBarButton
|
||||
Icon="OpenLocal"
|
||||
Label="Загрузить параметры"
|
||||
Command="{x:Bind ViewModel.LoadParametersCommand}"/>
|
||||
|
||||
<CommandBar.Content>
|
||||
<TextBlock
|
||||
Text="SQLVision"
|
||||
FontSize="18"
|
||||
FontWeight="SemiBold"
|
||||
Margin="12,0"/>
|
||||
</CommandBar.Content>
|
||||
</CommandBar>
|
||||
|
||||
<!-- Основное содержимое -->
|
||||
<Grid Grid.Row="1">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="300" MinWidth="250"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- Левая панель: скрипты и параметры -->
|
||||
<Grid Grid.Column="0">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Поиск -->
|
||||
<AutoSuggestBox
|
||||
Grid.Row="0"
|
||||
PlaceholderText="Поиск скриптов..."
|
||||
Text="{x:Bind ViewModel.SearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Margin="8">
|
||||
<AutoSuggestBox.QueryIcon>
|
||||
<SymbolIcon Symbol="Find"/>
|
||||
</AutoSuggestBox.QueryIcon>
|
||||
</AutoSuggestBox>
|
||||
|
||||
<!-- Дерево скриптов -->
|
||||
<TreeView
|
||||
Grid.Row="1"
|
||||
ItemsSource="{x:Bind ViewModel.ScriptCategories, Mode=OneWay}"
|
||||
SelectedItem="{x:Bind ViewModel.SelectedScript, Mode=TwoWay}"
|
||||
Margin="8">
|
||||
|
||||
<TreeView.ItemTemplate>
|
||||
<DataTemplate x:DataType="viewmodels:ScriptCategory">
|
||||
<TreeViewItem
|
||||
ItemsSource="{x:Bind Scripts}"
|
||||
IsExpanded="{x:Bind IsExpanded, Mode=TwoWay}">
|
||||
|
||||
<TreeViewItem.Header>
|
||||
<StackPanel Orientation="Horizontal" Spacing="8">
|
||||
<TextBlock Text="{x:Bind Name}" FontWeight="SemiBold"/>
|
||||
<TextBlock
|
||||
Text="{x:Bind Scripts.Count}"
|
||||
Foreground="Gray"
|
||||
FontSize="12"/>
|
||||
</StackPanel>
|
||||
</TreeViewItem.Header>
|
||||
|
||||
<TreeViewItem.ItemTemplate>
|
||||
<DataTemplate x:DataType="models:ScriptMetadata">
|
||||
<TreeViewItem>
|
||||
<StackPanel Orientation="Vertical" Spacing="2">
|
||||
<TextBlock
|
||||
Text="{x:Bind FileName}"
|
||||
TextWrapping="Wrap"
|
||||
FontWeight="Normal"/>
|
||||
<TextBlock
|
||||
Text="{x:Bind Description}"
|
||||
FontSize="11"
|
||||
Foreground="Gray"
|
||||
TextWrapping="Wrap"
|
||||
MaxLines="2"
|
||||
TextTrimming="CharacterEllipsis"/>
|
||||
</StackPanel>
|
||||
</TreeViewItem>
|
||||
</DataTemplate>
|
||||
</TreeViewItem.ItemTemplate>
|
||||
</TreeViewItem>
|
||||
</DataTemplate>
|
||||
</TreeView.ItemTemplate>
|
||||
</TreeView>
|
||||
|
||||
<!-- Параметры скрипта -->
|
||||
<Border
|
||||
Grid.Row="2"
|
||||
BorderBrush="{ThemeResource SystemControlForegroundBaseLowBrush}"
|
||||
BorderThickness="0,1,0,0"
|
||||
Padding="8"
|
||||
MaxHeight="400">
|
||||
|
||||
<ScrollViewer>
|
||||
<StackPanel
|
||||
x:Name="ParametersPanel"
|
||||
Spacing="12"
|
||||
Visibility="{x:Bind ViewModel.SelectedScript, Converter={StaticResource NullToVisibilityConverter}, Mode=OneWay}">
|
||||
|
||||
<TextBlock
|
||||
Text="Параметры"
|
||||
FontSize="16"
|
||||
FontWeight="SemiBold"
|
||||
Margin="0,0,0,8"/>
|
||||
|
||||
<ItemsControl ItemsSource="{x:Bind ViewModel.Parameters, Mode=OneWay}">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="viewmodels:ParameterViewModel">
|
||||
<StackPanel Spacing="4" Margin="0,0,0,8">
|
||||
<ContentPresenter Content="{x:Bind Control}"/>
|
||||
|
||||
<TextBlock
|
||||
Text="{x:Bind ValidationError}"
|
||||
Foreground="Red"
|
||||
FontSize="11"
|
||||
Visibility="{x:Bind HasError, Converter={StaticResource BoolToVisibility}}"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
</Grid>
|
||||
|
||||
<!-- Splitter -->
|
||||
<GridSplitter
|
||||
Grid.Column="1"
|
||||
Width="4"
|
||||
HorizontalAlignment="Stretch"
|
||||
Background="Transparent"/>
|
||||
|
||||
<!-- Правая панель: результаты -->
|
||||
<Grid Grid.Column="2">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Вкладки с результатами -->
|
||||
<muxc:TabView
|
||||
Grid.Row="0"
|
||||
ItemsSource="{x:Bind ViewModel.ResultTabs, Mode=OneWay}"
|
||||
SelectedItem="{x:Bind ViewModel.SelectedResultTab, Mode=TwoWay}"
|
||||
TabWidthMode="SizeToContent"
|
||||
CanReorderTabs="True"
|
||||
CanCloseTabs="True"
|
||||
TabCloseRequested="OnTabCloseRequested">
|
||||
|
||||
<muxc:TabView.TabItemTemplate>
|
||||
<DataTemplate x:DataType="viewmodels:ResultTabViewModel">
|
||||
<muxc:TabViewItem
|
||||
Header="{x:Bind Title}"
|
||||
IconSource="{x:Bind IconSource}">
|
||||
|
||||
<ScrollViewer
|
||||
HorizontalScrollBarVisibility="Auto"
|
||||
VerticalScrollBarVisibility="Auto">
|
||||
<ContentPresenter Content="{x:Bind Content}"/>
|
||||
</ScrollViewer>
|
||||
|
||||
<muxc:TabViewItem.ContextFlyout>
|
||||
<MenuFlyout>
|
||||
<MenuFlyoutItem
|
||||
Text="Экспорт"
|
||||
Command="{x:Bind ExportCommand}"
|
||||
Icon="Save"/>
|
||||
<MenuFlyoutItem
|
||||
Text="Копировать данные"
|
||||
Command="{x:Bind CopyDataCommand}"
|
||||
Icon="Copy"/>
|
||||
<MenuFlyoutSeparator/>
|
||||
<MenuFlyoutItem
|
||||
Text="Закрыть"
|
||||
Click="OnCloseTabClick"/>
|
||||
</MenuFlyout>
|
||||
</muxc:TabViewItem.ContextFlyout>
|
||||
</muxc:TabViewItem>
|
||||
</DataTemplate>
|
||||
</muxc:TabView.TabItemTemplate>
|
||||
</muxc:TabView>
|
||||
|
||||
<!-- Панель истории -->
|
||||
<Grid
|
||||
Grid.Row="1"
|
||||
Visibility="{x:Bind ViewModel.History.Count, Converter={StaticResource CountToVisibilityConverter}, Mode=OneWay}">
|
||||
|
||||
<Expander
|
||||
Header="История выполненных запросов"
|
||||
IsExpanded="False"
|
||||
Margin="8">
|
||||
|
||||
<ListView
|
||||
ItemsSource="{x:Bind ViewModel.History, Mode=OneWay}"
|
||||
MaxHeight="200"
|
||||
SelectionMode="None">
|
||||
|
||||
<ListView.ItemTemplate>
|
||||
<DataTemplate x:DataType="models:ExecutionHistoryItem">
|
||||
<Grid Padding="8" BorderBrush="LightGray" BorderThickness="0,0,0,1">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<StackPanel Grid.Column="0">
|
||||
<TextBlock
|
||||
Text="{x:Bind ScriptName}"
|
||||
FontWeight="SemiBold"/>
|
||||
<TextBlock
|
||||
Text="{x:Bind ExecutionTime, StringFormat='{}{0:dd.MM.yyyy HH:mm:ss}'}"
|
||||
FontSize="11"
|
||||
Foreground="Gray"/>
|
||||
</StackPanel>
|
||||
|
||||
<TextBlock
|
||||
Grid.Column="1"
|
||||
Text="{x:Bind Duration, StringFormat='{}{0:mm\\:ss}'}"
|
||||
Margin="8,0"
|
||||
VerticalAlignment="Center"/>
|
||||
|
||||
<TextBlock
|
||||
Grid.Column="2"
|
||||
Text="{x:Bind RowCount, StringFormat='{}Строк: {0}'}"
|
||||
VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ListView.ItemTemplate>
|
||||
</ListView>
|
||||
</Expander>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
<!-- Статус бар -->
|
||||
<StatusBar Grid.Row="2">
|
||||
<StatusBarItem>
|
||||
<ProgressRing
|
||||
Width="16"
|
||||
Height="16"
|
||||
IsActive="{x:Bind ViewModel.IsBusy, Mode=OneWay}"/>
|
||||
</StatusBarItem>
|
||||
|
||||
<StatusBarItem>
|
||||
<TextBlock Text="{x:Bind ViewModel.StatusMessage, Mode=OneWay}"/>
|
||||
</StatusBarItem>
|
||||
|
||||
<StatusBarItem HorizontalAlignment="Right">
|
||||
<TextBlock>
|
||||
<Run Text="Скриптов:"/>
|
||||
<Run Text="{x:Bind ViewModel.ScriptCategories.Sum(c => c.Scripts.Count), Mode=OneWay}"/>
|
||||
<Run Text="|"/>
|
||||
<Run Text="Вкладок:"/>
|
||||
<Run Text="{x:Bind ViewModel.ResultTabs.Count, Mode=OneWay}"/>
|
||||
</TextBlock>
|
||||
</StatusBarItem>
|
||||
</StatusBar>
|
||||
|
||||
<!-- Прогресс выполнения -->
|
||||
<Grid
|
||||
Grid.Row="0"
|
||||
Grid.RowSpan="3"
|
||||
Background="#CC000000"
|
||||
Visibility="{x:Bind ViewModel.IsBusy, Converter={StaticResource BoolToVisibility}, Mode=OneWay}">
|
||||
|
||||
<Border
|
||||
Background="{ThemeResource SystemControlBackgroundAltHighBrush}"
|
||||
CornerRadius="8"
|
||||
Padding="24"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center">
|
||||
|
||||
<StackPanel Spacing="16" HorizontalAlignment="Center">
|
||||
<ProgressRing Width="40" Height="40" IsActive="True"/>
|
||||
<TextBlock
|
||||
Text="Выполнение запроса..."
|
||||
HorizontalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Window>
|
||||
Reference in New Issue
Block a user