версия 2.0.9: размер шрифта/текста (масштаб интерфейса) в Настройках

- Настройки: выпадающий список «Размер шрифта / текста» (90/100/115/130/150%)
- масштаб применяется ко всему главному окну (LayoutTransform), сохраняется
  и восстанавливается при старте

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Exest 2026-08-13 16:39:46 +03:00
parent c808d62188
commit 60ab620608
9 changed files with 49 additions and 7 deletions

View File

@ -3,7 +3,7 @@
#define MyAppName "Электронная Фармация"
#define MyAppBrand "ЭльФиСА"
#define MyAppVersion "2.0.8"
#define MyAppVersion "2.0.9"
#define MyAppPublisher "PharmData"
#define MyAppURL "https://cdn.24pharmdata.ru"
#define MyAppSupportURL "https://24pharmdata.ru"

View File

@ -28,6 +28,14 @@ public partial class App : Application
app.Resources["AppFontFamily"] = new FontFamily(family);
}
/// <summary>Применяет масштаб интерфейса (размер шрифта/текста) к главному окну.</summary>
public static void ApplyScale(double scale)
{
if (Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime d
&& d.MainWindow is MainWindow mw)
mw.ApplyScale(scale);
}
public override void OnFrameworkInitializationCompleted()
{
RequestedThemeVariant = Elfisa.Core.SettingsStore.Current.Theme == "Dark"

View File

@ -5,9 +5,9 @@
<Nullable>enable</Nullable>
<ApplicationManifest>app.manifest</ApplicationManifest>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
<Version>2.0.8</Version>
<AssemblyVersion>2.0.8.0</AssemblyVersion>
<FileVersion>2.0.8.0</FileVersion>
<Version>2.0.9</Version>
<AssemblyVersion>2.0.9.0</AssemblyVersion>
<FileVersion>2.0.9.0</FileVersion>
<Product>ЭльФиСА — Электронная Фармация</Product>
<Company>PharmData</Company>
<!-- Кросс-платформенная публикация задаётся флагами CLI (RID + self-contained). -->

View File

@ -19,6 +19,12 @@ public partial class SettingsViewModel : ViewModelBase
public string[] Themes { get; } = { "Светлая", "Тёмная" };
[ObservableProperty] private int _themeIndex;
/// <summary>Размер шрифта/текста — масштаб интерфейса.</summary>
public string[] FontSizes { get; } = { "Мелкий (90%)", "Обычный (100%)", "Крупный (115%)", "Очень крупный (130%)", "Огромный (150%)" };
private static readonly double[] ScaleValues = { 0.9, 1.0, 1.15, 1.3, 1.5 };
[ObservableProperty] private int _fontSizeIndex = 1;
public double SelectedScale => ScaleValues[Math.Clamp(FontSizeIndex, 0, ScaleValues.Length - 1)];
/// <summary>Все системные шрифты + «По умолчанию» первым.</summary>
public ObservableCollection<string> Fonts { get; } = new();
[ObservableProperty] private string _selectedFont = DefaultFontLabel;
@ -32,6 +38,12 @@ public partial class SettingsViewModel : ViewModelBase
ApiBaseUrl = SettingsStore.Current.ApiBaseUrl ?? AppConfig.DefaultApiBaseUrl;
ThemeIndex = SettingsStore.Current.Theme == "Dark" ? 1 : 0;
var scale = SettingsStore.Current.UiScale;
var best = 1;
for (int i = 0; i < ScaleValues.Length; i++)
if (Math.Abs(ScaleValues[i] - scale) < Math.Abs(ScaleValues[best] - scale)) best = i;
FontSizeIndex = best;
Fonts.Add(DefaultFontLabel);
foreach (var f in FontManager.Current.SystemFonts
.Select(x => x.Name)

View File

@ -11,6 +11,9 @@
Background="{DynamicResource Bg}"
Title="ЭльФиСА">
<ContentControl Content="{Binding Current}"/>
<!-- Масштаб интерфейса (размер шрифта/текста) — зум всего содержимого. -->
<LayoutTransformControl x:Name="ScaleHost">
<ContentControl Content="{Binding Current}"/>
</LayoutTransformControl>
</Window>

View File

@ -1,4 +1,6 @@
using Avalonia.Controls;
using Avalonia.Media;
using Elfisa.Core;
namespace Elfisa.Avalonia.Views;
@ -7,5 +9,14 @@ public partial class MainWindow : Window
public MainWindow()
{
InitializeComponent();
ApplyScale(SettingsStore.Current.UiScale);
}
/// <summary>Масштабирует всё содержимое окна (размер шрифта/текста и элементов).</summary>
public void ApplyScale(double scale)
{
var host = this.FindControl<LayoutTransformControl>("ScaleHost");
if (host is null) return;
host.LayoutTransform = scale == 1.0 ? null : new ScaleTransform(scale, scale);
}
}

View File

@ -3,7 +3,7 @@
xmlns:vm="using:Elfisa.Avalonia.ViewModels"
x:Class="Elfisa.Avalonia.Views.SettingsWindow"
x:DataType="vm:SettingsViewModel"
Width="460" Height="520" CanResize="False"
Width="460" Height="590" CanResize="False"
WindowStartupLocation="CenterOwner"
Background="{DynamicResource Bg}"
Title="Настройки">
@ -33,6 +33,11 @@
</ComboBox>
</StackPanel>
<StackPanel Spacing="6">
<TextBlock Text="Размер шрифта / текста" Classes="label"/>
<ComboBox ItemsSource="{Binding FontSizes}" SelectedIndex="{Binding FontSizeIndex}" HorizontalAlignment="Stretch"/>
</StackPanel>
<StackPanel Spacing="6">
<TextBlock Text="Грузополучатель по умолчанию" Classes="label"/>
<ComboBox ItemsSource="{Binding Locations}" SelectedItem="{Binding SelectedLocation}" HorizontalAlignment="Stretch"/>

View File

@ -44,12 +44,14 @@ public partial class SettingsWindow : Window
SettingsStore.Current.Theme = vm.ThemeIndex == 1 ? "Dark" : "Light";
var font = vm.SelectedFont == SettingsViewModel.DefaultFontLabel ? null : vm.SelectedFont;
SettingsStore.Current.FontFamily = font;
SettingsStore.Current.UiScale = vm.SelectedScale;
SettingsStore.Current.DefaultLocationId = vm.SelectedLocation?.BuyerLocationId;
SettingsStore.Save();
if (Application.Current is { } app)
app.RequestedThemeVariant = vm.ThemeIndex == 1 ? ThemeVariant.Dark : ThemeVariant.Light;
App.ApplyFont(font); // применяем сразу ко всем окнам
App.ApplyFont(font); // шрифт — сразу ко всем окнам
App.ApplyScale(vm.SelectedScale); // масштаб — к главному окну
}
Close();
}

View File

@ -7,6 +7,7 @@ public sealed class AppSettings
public string? ApiBaseUrl { get; set; }
public string Theme { get; set; } = "Light"; // Light | Dark
public string? FontFamily { get; set; } // шрифт интерфейса (null = по умолчанию)
public double UiScale { get; set; } = 1.0; // масштаб интерфейса (размер шрифта/текста)
public string? DefaultLocationId { get; set; }
public string? Token { get; set; } // сохранённая сессия
public string? Role { get; set; }