Files
GSS2Rework/GSS2/Views/AmineContent/SampleCalibrationView.axaml
T
2026-08-10 11:55:39 +03:00

669 lines
31 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<UserControl
x:Class="GSS2.Views.AmineContent.SampleCalibrationView"
x:DataType="vm:SampleCalibrationViewModel"
xmlns:controls="using:GSS2.Controls"
xmlns:core="using:GSS2.UI.Core"
xmlns:i="using:Avalonia.Xaml.Interactivity"
xmlns:ia="using:Avalonia.Xaml.Interactions.Custom"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="using:GSS2.ViewModels.AmineContent"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="https://github.com/avaloniaui"
>
<Grid Background="{StaticResource MainBackground}">
<!-- Основная форма -->
<Grid IsEnabled="{Binding CanInteract}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" /> <!-- Кнопка "Удалить" -->
<ColumnDefinition Width="*" /> <!-- Кнопка "Сохранить" -->
<ColumnDefinition Width="*" /> <!-- Кнопки "К информации"/"К изображению" -->
</Grid.ColumnDefinitions>
<Grid.ColumnSpacing>5</Grid.ColumnSpacing>
<Grid.RowDefinitions>
<RowDefinition Height="*" /> <!-- Главная панель -->
<RowDefinition Height="Auto" /> <!-- Кнопки главной панели -->
</Grid.RowDefinitions>
<Grid.RowSpacing>5</Grid.RowSpacing>
<!-- Главная панель -->
<core:SectionPanel
CanScrollBackward="{Binding MainSectionCanScrollBackward}"
CanScrollForward="{Binding MainSectionCanScrollForward}"
ClipToBounds="True"
CurrentIndex="{Binding MainSectionCurrentIndex}"
Grid.Column="0"
Grid.ColumnSpan="3"
Grid.Row="0"
HorizontalAlignment="Stretch"
IsScrolling="{Binding MainSectionIsScrolling}"
Orientation="Vertical"
VerticalAlignment="Stretch"
>
<!-- Информация -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <!-- Кнопка меню -->
<ColumnDefinition Width="*" /> <!-- Информация -->
<ColumnDefinition Width="*" /> <!-- Информация -->
</Grid.ColumnDefinitions>
<Grid.ColumnSpacing>5</Grid.ColumnSpacing>
<Grid.RowDefinitions>
<RowDefinition Height="*" /> <!-- Информация -->
<RowDefinition Height="Auto" /> <!-- Кнопки -->
</Grid.RowDefinitions>
<Grid.RowSpacing>5</Grid.RowSpacing>
<!-- Кнопка меню -->
<Button
Classes="vertical"
Command="{Binding ToggleMenuCommand}"
Grid.Column="0"
Grid.Row="0"
Grid.RowSpan="3"
VerticalAlignment="Stretch"
>
<TextBlock Text="☰"/>
</Button>
<!-- Информация -->
<core:SectionPanel
CanScrollBackward="{Binding InfoSectionCanScrollBackward}"
CanScrollForward="{Binding InfoSectionCanScrollForward}"
ClipToBounds="True"
CurrentIndex="{Binding InfoSectionCurrentIndex}"
Cyclic="True"
Grid.Column="1"
Grid.ColumnSpan="2"
Grid.Row="0"
IsScrolling="{Binding InfoSectionIsScrolling}"
Orientation="Horizontal"
>
<!-- Id / Uuid / SampleName / BrandComboBox / SamplingDateTime / SamplingPlace -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.ColumnSpacing>5</Grid.ColumnSpacing>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <!-- Id (подпись) | Uuid (подпись) -->
<RowDefinition Height="Auto" /> <!-- Id (поле ) | Uuid (поле ) -->
<RowDefinition Height="Auto" /> <!-- SampleName (подпись) | BrandComboBox (подпись) -->
<RowDefinition Height="Auto" /> <!-- SampleName (поле ) | BrandComboBox (поле ) -->
<RowDefinition Height="Auto" /> <!-- SamplingDateTime (подпись) | SamplingPlace (подпись) -->
<RowDefinition Height="Auto" /> <!-- SamplingDateTime (поле ) | SamplingPlace (поле ) -->
<RowDefinition Height="*" /> <!-- Пустое пространство -->
</Grid.RowDefinitions>
<Grid.RowSpacing>5</Grid.RowSpacing>
<!-- Id (подпись) -->
<TextBlock
Classes="mini"
Grid.Column="0"
Grid.Row="0"
Text="ИД:"
/>
<!-- Id (поле) -->
<TextBox
Classes="singleline"
Grid.Column="0"
Grid.Row="1"
IsReadOnly="True"
PlaceholderText="ИД"
Text="{Binding Record.Id}"
/>
<!-- Uuid (подпись) -->
<TextBlock
Classes="mini"
Grid.Column="1"
Grid.Row="0"
Text="Уникальный ИД:"
/>
<!-- Uuid (поле) -->
<TextBox
Classes="singleline"
Grid.Column="1"
Grid.Row="1"
IsReadOnly="True"
PlaceholderText="Уникальный ИД"
Text="{Binding Record.Uuid}"
/>
<!-- SampleName (подпись) -->
<TextBlock
Grid.Row="2"
Grid.Column="0"
Classes="mini"
Text="Название пробы:"
/>
<!-- SampleName (поле) -->
<controls:TouchTextBox
Grid.Row="3"
Grid.Column="0"
Classes="singleline"
Text="{Binding Record.SampleName}"
PlaceholderText="Название пробы"
/>
<!-- BrandComboBox (подпись) -->
<TextBlock
Grid.Row="2"
Grid.Column="1"
Classes="mini"
Text="Марка пробы:"
/>
<!-- BrandComboBox (поле) -->
<ComboBox
Classes="singleline"
Grid.Column="1"
Grid.Row="3"
HorizontalAlignment="Stretch"
IsEditable="False"
ItemsSource="{Binding BrandComboBoxItems}"
PlaceholderText="Марка пробы"
SelectedIndex="{Binding BrandComboBoxSelectedIndex}"
>
<ComboBox.Styles>
<Style Selector="ComboBox /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
<Style Selector="ComboBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
</ComboBox.Styles>
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="vm:SampleCalibrationViewModel+BrandComboBoxItemViewModel">
<TextBlock>
<Run Text="{Binding Id, StringFormat='[{0}] '}" />
<Run Text="{Binding BrandName}" />
<Run Text=" - " />
<Run Text="{Binding MixtureName}" />
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<!-- SamplingDateTime (подпись) -->
<TextBlock
Classes="mini"
Grid.Column="0"
Grid.Row="4"
Text="Дата и время отбора пробы:"
/>
<!-- SamplingDateTime (поле) -->
<controls:TouchTextBox
Classes="singleline"
Grid.Column="0"
Grid.Row="5"
PlaceholderText="Дата и время отбора пробы"
Text="{Binding Record.SamplingDateTime, Converter={StaticResource DateTimeConverter}}"
/>
<!-- SamplingPlace (подпись) -->
<TextBlock
Classes="mini"
Grid.Column="1"
Grid.Row="4"
Text="Место отбора пробы:"
/>
<!-- SamplingPlace (поле) -->
<controls:TouchTextBox
Classes="singleline"
Grid.Column="1"
Grid.Row="5"
PlaceholderText="Место отбора пробы"
Text="{Binding Record.SamplingPlace}"
/>
</Grid>
<!-- MixtureActualRate / MeasuredContent / SampleComment -->
<Grid>
<Grid.ColumnSpacing>5</Grid.ColumnSpacing>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowSpacing>5</Grid.RowSpacing>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <!-- MixtureActualRate (подпись) | MeasuredContent (подпись) -->
<RowDefinition Height="Auto" /> <!-- MixtureActualRate (поле ) | MeasuredContent (поле ) -->
<RowDefinition Height="Auto" /> <!-- SampleComment (подпись) -->
<RowDefinition Height="*" /> <!-- SampleComment (поле ) -->
</Grid.RowDefinitions>
<!-- MixtureActualRate (подпись) -->
<TextBlock
Classes="mini" Text="Фактический расход смеси (кг/т | гр/кг):"
Grid.Column="0"
Grid.ColumnSpan="2"
Grid.Row="0"
/>
<!-- MixtureActualRate (поле) -->
<controls:TouchNumericUpDown
Classes="singleline"
FormatString="0.0000"
Grid.Column="0"
Grid.Row="1"
Increment="0.0001"
PlaceholderText="Фактический расход смеси (кг/т | гр/кг)"
Value="{Binding Record.MixtureActualRate}"
/>
<!-- MeasuredContent (подпись) -->
<TextBlock
Classes="mini" Text="Измеренное содержание смеси (кг/т | гр/кг):"
Grid.Column="1"
Grid.Row="0"
/>
<!-- MeasuredContent (поле) -->
<controls:TouchNumericUpDown
Classes="singleline"
FormatString="0.0000"
Grid.Column="1"
Grid.Row="1"
Increment="0.0001"
PlaceholderText="Измеренное содержание смеси (кг/т | гр/кг)"
Value="{Binding Record.MeasuredContent}"
/>
<!-- SampleComment (подпись) -->
<TextBlock
Classes="mini"
Grid.Column="0"
Grid.Row="2"
Text="Дополнительная информация о пробе:"
/>
<!-- SampleComment (поле) -->
<controls:TouchTextBox
Classes="multiline"
Grid.Column="0"
Grid.ColumnSpan="2"
Grid.Row="3"
PlaceholderText="Дополнительная информация о пробе"
Text="{Binding Record.SampleComment}"
/>
</Grid>
</core:SectionPanel>
<!-- Кнопка влево -->
<Button
Command="{Binding InfoSectionPreviousCommand}"
Grid.Column="1"
Grid.Row="1"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
>
<Button.IsEnabled>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="InfoSectionCanScrollBackward" />
<Binding Converter="{x:Static BoolConverters.Not}" Path="InfoSectionIsScrolling" />
</MultiBinding>
</Button.IsEnabled>
<TextBlock Text="◀"/>
</Button>
<!-- Кнопка вправо -->
<Button
Command="{Binding InfoSectionNextCommand}"
Grid.Column="2"
Grid.Row="1"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
>
<Button.IsEnabled>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="InfoSectionCanScrollForward" />
<Binding Converter="{x:Static BoolConverters.Not}" Path="InfoSectionIsScrolling" />
</MultiBinding>
</Button.IsEnabled>
<TextBlock Text="▶"/>
</Button>
</Grid>
<!-- Изображение -->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" /> <!-- Изображение -->
<RowDefinition Height="Auto" /> <!-- Кнопка "Получить изображения" / "Отменить съёмку" -->
</Grid.RowDefinitions>
<Grid.RowSpacing>5</Grid.RowSpacing>
<!-- Изображение -->
<Grid>
<!-- Изображение -->
<Grid>
</Grid>
<!-- Изображение -->
<core:ZoomPanImage
Background="Black"
HorizontalAlignment="Stretch"
ImageSource="{Binding Record.Image.Image}"
VerticalAlignment="Stretch"
>
<core:ZoomPanImage.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Converter="{x:Static StringConverters.IsNotNullOrEmpty}" Path="Record.Image.Data" />
<Binding Converter="{x:Static BoolConverters.Not}" Path="Record.Image.IsLoading" />
<Binding Converter="{x:Static BoolConverters.Not}" Path="ImagesIsCapturing" />
</MultiBinding>
</core:ZoomPanImage.IsVisible>
</core:ZoomPanImage>
<!-- Оверлей "Изображение загружается" -->
<StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Center" >
<StackPanel.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="Record.Image.IsLoading" />
<Binding Converter="{x:Static BoolConverters.Not}" Path="ImagesIsCapturing" />
</MultiBinding>
</StackPanel.IsVisible>
<ProgressBar IsIndeterminate="True" />
<TextBlock HorizontalAlignment="Center" Text="Изображение загружается" />
</StackPanel>
<!-- Оверлей "Изображение отсутствует" -->
<TextBlock
HorizontalAlignment="Center"
Text="Изображение отсутствует"
VerticalAlignment="Center"
>
<TextBlock.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Converter="{x:Static StringConverters.IsNullOrEmpty}" Path="Record.Image.Data" />
<Binding Converter="{x:Static BoolConverters.Not}" Path="Record.Image.IsLoading" />
<Binding Converter="{x:Static BoolConverters.Not}" Path="ImagesIsCapturing" />
</MultiBinding>
</TextBlock.IsVisible>
</TextBlock>
<!-- Оверлей прогресс -->
<StackPanel
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
>
<StackPanel.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Converter="{x:Static StringConverters.IsNullOrEmpty}" Path="Record.Image.Data" />
<Binding Converter="{x:Static BoolConverters.Not}" Path="Record.Image.IsLoading" />
<Binding Path="ImagesIsCapturing" />
</MultiBinding>
</StackPanel.IsVisible>
<ProgressBar IsIndeterminate="True" />
<TextBlock HorizontalAlignment="Center" Text="{Binding ImagesCapturingProgress}" />
</StackPanel>
</Grid>
<!-- Кнопка "Получить изображения" -->
<Button
Command="{Binding CaptureImageCommand}"
Grid.Row="1"
HorizontalAlignment="Stretch"
IsVisible="{Binding !ImagesIsCapturing}"
>
<TextBlock Text="Получить изображения"/>
</Button>
<!-- Кнопка "Отменить съёмку" -->
<Button
Command="{Binding CancelImageCapturingCommand}"
Grid.Row="1"
HorizontalAlignment="Stretch"
IsVisible="{Binding ImagesIsCapturing}"
>
<TextBlock Text="Отменить съёмку"/>
</Button>
</Grid>
</core:SectionPanel>
<!-- Кнопки главной панели -->
<!-- Кнопка "Удалить" -->
<Button
Classes="danger"
Command="{Binding DeleteRecordCommand}"
Grid.Column="0"
Grid.Row="1"
HorizontalAlignment="Stretch"
>
<TextBlock Text="Удалить"/>
</Button>
<!-- Кнопка "Сохранить" -->
<Button
Command="{Binding SaveRecordCommand}"
Content="Сохранить"
Grid.Column="1"
Grid.Row="1"
HorizontalAlignment="Stretch"
>
<TextBlock Text="Сохранить"/>
</Button>
<!-- Кнопка "К информации" -->
<Button
Command="{Binding SwitchMainSectionCommand}"
Content="К информации"
Grid.Column="2"
Grid.Row="1"
HorizontalAlignment="Stretch"
IsVisible="{Binding MainSectionCurrentIndex, Converter={StaticResource EqualsConverter}, ConverterParameter=1}"
>
<TextBlock Text="К информации"/>
<Button.IsEnabled>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="MainSectionCanScrollBackward" />
<Binding Converter="{x:Static BoolConverters.Not}" Path="MainSectionIsScrolling" />
</MultiBinding>
</Button.IsEnabled>
</Button>
<!-- Кнопка "К изображению" -->
<Button
Command="{Binding SwitchMainSectionCommand}"
Content="К изображению"
Grid.Column="2"
Grid.Row="1"
HorizontalAlignment="Stretch"
IsVisible="{Binding MainSectionCurrentIndex, Converter={StaticResource EqualsConverter}, ConverterParameter=0}"
>
<TextBlock Text="К изображению"/>
<Button.IsEnabled>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="MainSectionCanScrollForward" />
<Binding Converter="{x:Static BoolConverters.Not}" Path="MainSectionIsScrolling" />
</MultiBinding>
</Button.IsEnabled>
</Button>
</Grid>
<!-- Полупрозрачный оверлей -->
<Border
Background="{StaticResource Overlay}"
IsEnabled="{Binding MenuOpened}"
IsVisible="{Binding MenuOpened}"
>
<Interaction.Behaviors>
<TappedTrigger>
<InvokeCommandAction Command="{Binding CloseMenuCommand}" />
</TappedTrigger>
</Interaction.Behaviors>
</Border>
<!-- Выезжающая боковая панель -->
<Border
Background="{StaticResource MenuBackground}"
BorderBrush="{StaticResource MenuBorder}"
BorderThickness="0,0,1,0"
HorizontalAlignment="Left"
IsEnabled="{Binding MenuOpened}"
IsVisible="{Binding MenuOpened}"
>
<!-- Переходы -->
<Border.Transitions>
<Transitions>
<TransformOperationsTransition Duration="0:0:0.25" Property="RenderTransform" />
</Transitions>
</Border.Transitions>
<!-- Поведения -->
<Interaction.Behaviors>
<!-- Поведение при открытии меню -->
<DataTriggerBehavior
Binding="{Binding MenuOpened}"
ComparisonCondition="Equal"
Value="True"
>
<ChangePropertyAction PropertyName="RenderTransform" Value="translateX(0px)" />
</DataTriggerBehavior>
<!-- Поведение при закрытии меню -->
<DataTriggerBehavior
Binding="{Binding MenuOpened}"
ComparisonCondition="Equal"
Value="False"
>
<ChangePropertyAction PropertyName="RenderTransform" Value="translateX(-320px)" />
</DataTriggerBehavior>
</Interaction.Behaviors>
<!-- Содержимое меню -->
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <!-- Кнопка "Новая запись" -->
<RowDefinition Height="*"/> <!-- Элементы меню -->
</Grid.RowDefinitions>
<Grid.RowSpacing>10</Grid.RowSpacing>
<!-- Кнопка "Новая запись" -->
<Button
Command="{Binding CreateRecordCommand}"
Grid.Row="0"
HorizontalAlignment="Stretch"
MinWidth="200"
>
<TextBlock Text="Новая запись"/>
</Button>
<!-- Элементы меню -->
<ListBox
Background="{StaticResource MenuBackground}"
Grid.Row="1"
ItemsSource="{Binding MenuItems}"
SelectedIndex="{Binding MenuSelectedIndex}"
>
<!-- Шаблон списка элементов -->
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<!-- Стили элементов -->
<ListBox.Styles>
<!-- Общий стиль -->
<Style Selector="ListBoxItem">
<Setter Property="Background" Value="{StaticResource ButtonBackground}" />
</Style>
<!-- Стиль выбранного элемента -->
<Style Selector="ListBoxItem:selected /template/ ContentPresenter">
<Setter Property="Background" Value="{StaticResource MainBackground}" />
</Style>
<!-- Стиль элемента над которым находится указатель -->
<Style Selector="ListBoxItem:pointerover /template/ ContentPresenter">
<Setter Property="Background" Value="{StaticResource MainBackground}" />
</Style>
</ListBox.Styles>
<!-- Шаблон элемента -->
<ListBox.ItemTemplate>
<DataTemplate x:DataType="vm:SampleCalibrationViewModel+MenuItemViewModel">
<Border Margin="3" CornerRadius="5">
<TextBlock
Classes="mini"
HorizontalAlignment="Center"
VerticalAlignment="Center"
>
<Run Text="{Binding Id, StringFormat='[{0}] '}" />
<Run Text="{Binding SampleName}" />
</TextBlock>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Border>
</Grid>
</UserControl>