ava12升级

This commit is contained in:
lincube
2026-04-25 22:51:18 +08:00
parent 0b603384b4
commit d310fc50ac
52 changed files with 965 additions and 1023 deletions

40
Directory.Packages.props Normal file
View File

@@ -0,0 +1,40 @@
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Avalonia" Version="12.0.1" />
<PackageVersion Include="Avalonia.Controls.WebView" Version="12.0.0" />
<PackageVersion Include="Avalonia.Desktop" Version="12.0.1" />
<PackageVersion Include="Avalonia.Fonts.Inter" Version="12.0.1" />
<PackageVersion Include="Avalonia.Themes.Fluent" Version="12.0.1" />
<PackageVersion Include="AvaloniaUI.DiagnosticsSupport" Version="2.2.1" />
<PackageVersion Include="ClassIsland.Markdown.Avalonia" Version="12.0.0" />
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.2.1" />
<PackageVersion Include="dotnetCampus.Ipc" Version="2.0.0-alpha434" />
<PackageVersion Include="DotNetCampus.AvaloniaInkCanvas" Version="1.0.1" />
<PackageVersion Include="Downloader" Version="4.1.1" />
<PackageVersion Include="FluentAvaloniaUI" Version="3.0.0-preview1" />
<PackageVersion Include="FluentIcons.Avalonia" Version="2.1.325" />
<PackageVersion Include="Material.Avalonia" Version="3.16.0" />
<PackageVersion Include="MaterialColorUtilities" Version="0.3.0" />
<PackageVersion Include="Material.Icons.Avalonia" Version="3.0.2" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageVersion Include="MudTools.OfficeInterop" Version="2.0.8" />
<PackageVersion Include="MudTools.OfficeInterop.Excel" Version="2.0.8" />
<PackageVersion Include="MudTools.OfficeInterop.PowerPoint" Version="2.0.8" />
<PackageVersion Include="MudTools.OfficeInterop.Word" Version="2.0.8" />
<PackageVersion Include="PortAudioSharp2" Version="1.0.6" />
<PackageVersion Include="PostHog" Version="2.4.0" />
<PackageVersion Include="Sentry" Version="4.0.0" />
<PackageVersion Include="System.Drawing.Common" Version="10.0.0" />
<PackageVersion Include="System.Runtime.WindowsRuntime" Version="4.7.0" />
<PackageVersion Include="Tmds.DBus.Protocol" Version="0.92.0" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
<PackageVersion Include="YamlDotNet" Version="16.3.0" />
<PackageVersion Include="log4net" Version="3.3.0" />
</ItemGroup>
</Project>

View File

@@ -5,7 +5,7 @@
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Avalonia" Version="11.3.12" /> <PackageReference Include="Avalonia" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\LanMountainDesktop.PluginSdk\LanMountainDesktop.PluginSdk.csproj" /> <ProjectReference Include="..\LanMountainDesktop.PluginSdk\LanMountainDesktop.PluginSdk.csproj" />

View File

@@ -22,12 +22,12 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Avalonia" Version="11.3.12" /> <PackageReference Include="Avalonia" />
<PackageReference Include="Avalonia.Desktop" Version="11.3.12" /> <PackageReference Include="Avalonia.Desktop" />
<PackageReference Include="FluentAvaloniaUI" Version="2.5.0" /> <PackageReference Include="FluentAvaloniaUI" />
<PackageReference Include="FluentIcons.Avalonia" Version="1.1.250403001" /> <PackageReference Include="FluentIcons.Avalonia" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.3.12" /> <PackageReference Include="Avalonia.Fonts.Inter" />
<PackageReference Include="Tmds.DBus.Protocol" Version="0.92.0" /> <PackageReference Include="Tmds.DBus.Protocol" />
</ItemGroup> </ItemGroup>
<!-- 资源文件 --> <!-- 资源文件 -->

View File

@@ -3,13 +3,13 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="clr-namespace:LanMountainDesktop.Launcher.Views" xmlns:views="clr-namespace:LanMountainDesktop.Launcher.Views"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:fi="using:FluentIcons.Avalonia"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignWidth="520" d:DesignWidth="520"
d:DesignHeight="480" d:DesignHeight="480"
x:Class="LanMountainDesktop.Launcher.Views.DataLocationPromptWindow" x:Class="LanMountainDesktop.Launcher.Views.DataLocationPromptWindow"
x:DataType="views:DataLocationPromptWindow" x:DataType="views:DataLocationPromptWindow"
Title="选择数据保存位置" Title="Choose Data Location"
Width="520" Width="520"
Height="480" Height="480"
CanResize="False" CanResize="False"
@@ -24,12 +24,13 @@
</Grid.RenderTransform> </Grid.RenderTransform>
<Grid Margin="36" RowDefinitions="Auto,*,Auto"> <Grid Margin="36" RowDefinitions="Auto,*,Auto">
<StackPanel Grid.Row="0" Spacing="8" Margin="0,0,0,20"> <StackPanel Grid.Row="0" Spacing="8" Margin="0,0,0,20">
<TextBlock Text="选择数据保存位置" <TextBlock Text="Choose Data Location"
FontSize="22" FontSize="22"
FontWeight="SemiBold" FontWeight="SemiBold"
Foreground="{DynamicResource TextFillColorPrimaryBrush}" /> Foreground="{DynamicResource TextFillColorPrimaryBrush}" />
<TextBlock Text="决定将应用数据保存在哪里,可随时在设置中更改" <TextBlock Text="Choose where launcher and desktop data should be stored. You can change this later in settings."
FontSize="13" FontSize="13"
TextWrapping="Wrap"
Foreground="{DynamicResource TextFillColorSecondaryBrush}" /> Foreground="{DynamicResource TextFillColorSecondaryBrush}" />
</StackPanel> </StackPanel>
@@ -41,15 +42,15 @@
IsVisible="False"> IsVisible="False">
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<StackPanel Orientation="Horizontal" Spacing="6"> <StackPanel Orientation="Horizontal" Spacing="6">
<ui:SymbolIcon Symbol="Important" <fi:SymbolIcon Symbol="Important"
FontSize="16" FontSize="16"
Foreground="{DynamicResource SystemFillColorCriticalBrush}" /> Foreground="{DynamicResource SystemFillColorCriticalBrush}" />
<TextBlock Text="无法保存到应用目录" <TextBlock Text="App folder is not writable"
FontWeight="SemiBold" FontWeight="SemiBold"
FontSize="13" FontSize="13"
Foreground="{DynamicResource SystemFillColorCriticalBrush}" /> Foreground="{DynamicResource SystemFillColorCriticalBrush}" />
</StackPanel> </StackPanel>
<TextBlock Text="当前安装目录需要管理员权限才能写入,数据将自动保存到系统用户目录。" <TextBlock Text="The current install directory requires elevated permissions. Data will be stored in the system user profile instead."
FontSize="12" FontSize="12"
TextWrapping="Wrap" TextWrapping="Wrap"
Foreground="{DynamicResource SystemFillColorCriticalBrush}" /> Foreground="{DynamicResource SystemFillColorCriticalBrush}" />
@@ -70,11 +71,11 @@
GroupName="DataLocation" GroupName="DataLocation"
IsChecked="True" /> IsChecked="True" />
<StackPanel Grid.Column="1" Spacing="4"> <StackPanel Grid.Column="1" Spacing="4">
<TextBlock Text="保存在系统用户目录(推荐)" <TextBlock Text="Store in the system user profile (Recommended)"
FontSize="14" FontSize="14"
FontWeight="SemiBold" FontWeight="SemiBold"
Foreground="{DynamicResource TextFillColorPrimaryBrush}" /> Foreground="{DynamicResource TextFillColorPrimaryBrush}" />
<TextBlock Text="数据与当前 Windows 用户绑定,重装应用或更新后数据不会丢失" <TextBlock Text="Data stays tied to the current Windows user and remains intact across app reinstalls and updates."
FontSize="12" FontSize="12"
TextWrapping="Wrap" TextWrapping="Wrap"
Foreground="{DynamicResource TextFillColorSecondaryBrush}" /> Foreground="{DynamicResource TextFillColorSecondaryBrush}" />
@@ -101,11 +102,11 @@
GroupName="DataLocation" GroupName="DataLocation"
IsEnabled="False" /> IsEnabled="False" />
<StackPanel Grid.Column="1" Spacing="4"> <StackPanel Grid.Column="1" Spacing="4">
<TextBlock Text="保存在应用安装目录" <TextBlock Text="Store next to the app"
FontSize="14" FontSize="14"
FontWeight="SemiBold" FontWeight="SemiBold"
Foreground="{DynamicResource TextFillColorPrimaryBrush}" /> Foreground="{DynamicResource TextFillColorPrimaryBrush}" />
<TextBlock Text="便于携带,可随应用文件夹整体移动到其他电脑" <TextBlock Text="Useful for portable installs. The whole app folder can be moved to another machine together with its data."
FontSize="12" FontSize="12"
TextWrapping="Wrap" TextWrapping="Wrap"
Foreground="{DynamicResource TextFillColorSecondaryBrush}" /> Foreground="{DynamicResource TextFillColorSecondaryBrush}" />
@@ -124,7 +125,7 @@
Padding="12,10" Padding="12,10"
IsVisible="False"> IsVisible="False">
<StackPanel Orientation="Horizontal" Spacing="6"> <StackPanel Orientation="Horizontal" Spacing="6">
<ui:SymbolIcon Symbol="Message" <fi:SymbolIcon Symbol="Info"
FontSize="16" FontSize="16"
Foreground="{DynamicResource SystemFillColorSuccessBrush}" /> Foreground="{DynamicResource SystemFillColorSuccessBrush}" />
<TextBlock x:Name="MigrationInfoText" <TextBlock x:Name="MigrationInfoText"
@@ -141,11 +142,11 @@
Spacing="10" Spacing="10"
Margin="0,20,0,0"> Margin="0,20,0,0">
<Button x:Name="CancelButton" <Button x:Name="CancelButton"
Content="取消" Content="Cancel"
Theme="{DynamicResource ButtonTheme}" Theme="{DynamicResource ButtonTheme}"
IsVisible="False" /> IsVisible="False" />
<Button x:Name="ConfirmButton" <Button x:Name="ConfirmButton"
Content="确认" Content="Confirm"
Theme="{DynamicResource AccentButtonTheme}" /> Theme="{DynamicResource AccentButtonTheme}" />
</StackPanel> </StackPanel>
</Grid> </Grid>

View File

@@ -48,14 +48,12 @@ internal partial class DataLocationPromptWindow : Window
if (systemRadio is not null) if (systemRadio is not null)
{ {
systemRadio.Checked += OnSelectionChanged; systemRadio.IsCheckedChanged += OnSelectionChanged;
systemRadio.Unchecked += OnSelectionChanged;
} }
if (portableRadio is not null) if (portableRadio is not null)
{ {
portableRadio.Checked += OnSelectionChanged; portableRadio.IsCheckedChanged += OnSelectionChanged;
portableRadio.Unchecked += OnSelectionChanged;
} }
if (confirmButton is not null) if (confirmButton is not null)
@@ -108,7 +106,7 @@ internal partial class DataLocationPromptWindow : Window
if (migrationInfoText is not null && hasExistingData) if (migrationInfoText is not null && hasExistingData)
{ {
migrationInfoText.Text = "检测到系统用户目录已有应用数据。如果选择保存在应用安装目录,将自动迁移现有数据。"; migrationInfoText.Text = "Existing system data was detected. Choosing portable mode will migrate the current data automatically.";
} }
} }

View File

@@ -17,7 +17,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="dotnetCampus.Ipc" Version="2.0.0-alpha434" /> <PackageReference Include="dotnetCampus.Ipc" />
<ProjectReference Include="..\LanMountainDesktop.PluginIsolation.Contracts\LanMountainDesktop.PluginIsolation.Contracts.csproj" /> <ProjectReference Include="..\LanMountainDesktop.PluginIsolation.Contracts\LanMountainDesktop.PluginIsolation.Contracts.csproj" />
</ItemGroup> </ItemGroup>

View File

@@ -4,7 +4,7 @@
<TargetFramework>net10.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<Version>4.0.2</Version> <Version>5.0.0-preview1</Version>
<PackageId>LanMountainDesktop.PluginSdk</PackageId> <PackageId>LanMountainDesktop.PluginSdk</PackageId>
<IsPackable>true</IsPackable> <IsPackable>true</IsPackable>
<Authors>LanMountainDesktop</Authors> <Authors>LanMountainDesktop</Authors>
@@ -19,13 +19,12 @@
<ItemGroup> <ItemGroup>
<Compile Remove="_build_verify_*\**\*.cs" /> <Compile Remove="_build_verify_*\**\*.cs" />
<PackageReference Include="Avalonia" Version="11.3.12" /> <PackageReference Include="Avalonia" />
<PackageReference Include="FluentAvaloniaUI" Version="2.5.0" ExcludeAssets="runtime" /> <PackageReference Include="FluentAvaloniaUI" ExcludeAssets="runtime" />
<PackageReference Include="FluentIcons.Avalonia" Version="2.0.320" ExcludeAssets="runtime" /> <PackageReference Include="FluentIcons.Avalonia" ExcludeAssets="runtime" />
<PackageReference Include="FluentIcons.Avalonia.Fluent" Version="2.0.320" ExcludeAssets="runtime" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.0" /> <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.0" /> <PackageReference Include="dotnetCampus.Ipc" />
<PackageReference Include="dotnetCampus.Ipc" Version="2.0.0-alpha434" />
<ProjectReference Include="..\LanMountainDesktop.PluginIsolation.Contracts\LanMountainDesktop.PluginIsolation.Contracts.csproj" /> <ProjectReference Include="..\LanMountainDesktop.PluginIsolation.Contracts\LanMountainDesktop.PluginIsolation.Contracts.csproj" />
<ProjectReference Include="..\LanMountainDesktop.Shared.Contracts\LanMountainDesktop.Shared.Contracts.csproj" /> <ProjectReference Include="..\LanMountainDesktop.Shared.Contracts\LanMountainDesktop.Shared.Contracts.csproj" />
<ProjectReference Include="..\LanMountainDesktop.Shared.IPC\LanMountainDesktop.Shared.IPC.csproj" /> <ProjectReference Include="..\LanMountainDesktop.Shared.IPC\LanMountainDesktop.Shared.IPC.csproj" />

View File

@@ -2,7 +2,7 @@ namespace LanMountainDesktop.PluginSdk;
public static class PluginSdkInfo public static class PluginSdkInfo
{ {
public const string ApiVersion = "4.0.2"; public const string ApiVersion = "5.0.0";
public const string ManifestFileName = "plugin.json"; public const string ManifestFileName = "plugin.json";
public const string PackageFileExtension = ".laapp"; public const string PackageFileExtension = ".laapp";
public const string DataDirectoryName = "Data"; public const string DataDirectoryName = "Data";

View File

@@ -17,7 +17,7 @@
<Copyright>Copyright (c) LanMountainDesktop Contributors</Copyright> <Copyright>Copyright (c) LanMountainDesktop Contributors</Copyright>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Avalonia" Version="11.3.12" /> <PackageReference Include="Avalonia" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="README.md" Pack="true" PackagePath="\" /> <None Include="README.md" Pack="true" PackagePath="\" />

View File

@@ -17,8 +17,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="dotnetCampus.Ipc" Version="2.0.0-alpha434" /> <PackageReference Include="dotnetCampus.Ipc" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
<ProjectReference Include="..\LanMountainDesktop.Shared.Contracts\LanMountainDesktop.Shared.Contracts.csproj" /> <ProjectReference Include="..\LanMountainDesktop.Shared.Contracts\LanMountainDesktop.Shared.Contracts.csproj" />
</ItemGroup> </ItemGroup>

View File

@@ -8,9 +8,9 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="xunit" Version="2.9.3" /> <PackageReference Include="xunit" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2"> <PackageReference Include="xunit.runner.visualstudio">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>

View File

@@ -14,7 +14,6 @@ using Avalonia.Media;
using Avalonia.Platform; using Avalonia.Platform;
using Avalonia.Styling; using Avalonia.Styling;
using Avalonia.Threading; using Avalonia.Threading;
using AvaloniaWebView;
using LanMountainDesktop.ComponentSystem; using LanMountainDesktop.ComponentSystem;
using LanMountainDesktop.DesktopHost; using LanMountainDesktop.DesktopHost;
using LanMountainDesktop.Models; using LanMountainDesktop.Models;
@@ -78,7 +77,6 @@ public partial class App : Application
private TransparentOverlayWindow? _transparentOverlayWindow; private TransparentOverlayWindow? _transparentOverlayWindow;
private FusedDesktopComponentLibraryWindow? _fusedComponentLibraryWindow; private FusedDesktopComponentLibraryWindow? _fusedComponentLibraryWindow;
private bool _mainWindowClosed; private bool _mainWindowClosed;
private bool _uiUnhandledExceptionHooked;
private DesktopShellHost? _desktopShellHost; private DesktopShellHost? _desktopShellHost;
private PublicIpcHostService? _publicIpcHostService; private PublicIpcHostService? _publicIpcHostService;
private LoadingStateManager? _loadingStateManager; private LoadingStateManager? _loadingStateManager;
@@ -194,8 +192,6 @@ public partial class App : Application
return; return;
} }
ConfigureWebViewUserDataFolder();
AvaloniaWebViewBuilder.Initialize(default);
ApplyThemeFromSettings(); ApplyThemeFromSettings();
ApplyCurrentCultureFromSettings(); ApplyCurrentCultureFromSettings();
EnsureSettingsWindowService(); EnsureSettingsWindowService();
@@ -213,7 +209,6 @@ public partial class App : Application
AppLogger.Info("App", "Framework initialization completed."); AppLogger.Info("App", "Framework initialization completed.");
RegisterUiUnhandledExceptionGuard();
LinuxDesktopEntryInstaller.EnsureInstalled(); LinuxDesktopEntryInstaller.EnsureInstalled();
InitializePublicIpc(); InitializePublicIpc();
CurrentSingleInstanceService?.StartActivationListener(ActivateMainWindow); CurrentSingleInstanceService?.StartActivationListener(ActivateMainWindow);
@@ -543,34 +538,6 @@ public partial class App : Application
} }
} }
private static void ConfigureWebViewUserDataFolder()
{
if (!OperatingSystem.IsWindows())
{
return;
}
const string userDataFolderEnvVar = "WEBVIEW2_USER_DATA_FOLDER";
try
{
if (!string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable(userDataFolderEnvVar)))
{
return;
}
var userDataFolder = WebView2RuntimeProbe.ResolveUserDataFolder();
Environment.SetEnvironmentVariable(
userDataFolderEnvVar,
userDataFolder,
EnvironmentVariableTarget.Process);
}
catch (Exception ex)
{
// Keep startup resilient if user profile folders are unavailable.
AppLogger.Warn("WebView2", "Failed to configure WebView2 user data folder.", ex);
}
}
private void InitializePluginRuntime() private void InitializePluginRuntime()
{ {
ReportStartupProgress(StartupStage.LoadingPlugins, 30, "姝e湪鍔犺浇鎻掍欢..."); ReportStartupProgress(StartupStage.LoadingPlugins, 30, "姝e湪鍔犺浇鎻掍欢...");
@@ -1178,43 +1145,6 @@ public partial class App : Application
_appearanceThemeService.ApplyThemeResources(Resources); _appearanceThemeService.ApplyThemeResources(Resources);
} }
private void RegisterUiUnhandledExceptionGuard()
{
if (_uiUnhandledExceptionHooked)
{
return;
}
Dispatcher.UIThread.UnhandledException += OnUiThreadUnhandledException;
_uiUnhandledExceptionHooked = true;
}
private void OnUiThreadUnhandledException(object? sender, DispatcherUnhandledExceptionEventArgs e)
{
if (!IsKnownWebViewStartupException(e.Exception))
{
return;
}
e.Handled = true;
AppLogger.Warn(
"WebView2",
"Suppressed a known WebView startup exception from AvaloniaWebView.Navigate to keep the host process alive.",
e.Exception);
}
private static bool IsKnownWebViewStartupException(Exception exception)
{
if (exception is not NullReferenceException)
{
return false;
}
var stackTrace = exception.StackTrace ?? string.Empty;
return stackTrace.Contains("AvaloniaWebView.WebView.Navigate", StringComparison.Ordinal) &&
stackTrace.Contains("AvaloniaWebView.WebView.OnAttachedToVisualTree", StringComparison.Ordinal);
}
private void ReleaseSingleInstanceAfterExit(string source) private void ReleaseSingleInstanceAfterExit(string source)
{ {
if (_singleInstanceReleased) if (_singleInstanceReleased)
@@ -1959,4 +1889,3 @@ public partial class App : Application
} }
} }

View File

@@ -41,44 +41,42 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Avalonia" Version="11.3.12" /> <PackageReference Include="Avalonia" />
<PackageReference Include="Avalonia.Desktop" Version="11.3.12" /> <PackageReference Include="Avalonia.Controls.WebView" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.12" /> <PackageReference Include="Avalonia.Desktop" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.3.12" /> <PackageReference Include="Avalonia.Themes.Fluent" />
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.--> <PackageReference Include="Avalonia.Fonts.Inter" />
<PackageReference Include="Avalonia.Diagnostics" Version="11.3.12"> <!--Condition below is needed to remove developer tools support from build output in Release configuration.-->
<PackageReference Include="AvaloniaUI.DiagnosticsSupport">
<IncludeAssets Condition="'$(Configuration)' != 'Debug'">None</IncludeAssets> <IncludeAssets Condition="'$(Configuration)' != 'Debug'">None</IncludeAssets>
<PrivateAssets Condition="'$(Configuration)' != 'Debug'">All</PrivateAssets> <PrivateAssets Condition="'$(Configuration)' != 'Debug'">All</PrivateAssets>
</PackageReference> </PackageReference>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.1" /> <PackageReference Include="CommunityToolkit.Mvvm" />
<PackageReference Include="DotNetCampus.AvaloniaInkCanvas" Version="1.0.1" /> <PackageReference Include="DotNetCampus.AvaloniaInkCanvas" />
<PackageReference Include="Downloader" Version="4.1.1" /> <PackageReference Include="Downloader" />
<PackageReference Include="FluentAvaloniaUI" Version="2.5.0" /> <PackageReference Include="FluentAvaloniaUI" />
<PackageReference Include="FluentIcons.Avalonia" Version="2.0.320" /> <PackageReference Include="FluentIcons.Avalonia" />
<PackageReference Include="FluentIcons.Avalonia.Fluent" Version="2.0.320" /> <PackageReference Include="Material.Avalonia" />
<PackageReference Include="Material.Avalonia" Version="3.13.4" /> <PackageReference Include="Material.Icons.Avalonia" />
<PackageReference Include="Material.Icons.Avalonia" Version="2.4.1" /> <PackageReference Include="ClassIsland.Markdown.Avalonia" />
<PackageReference Include="ClassIsland.Markdown.Avalonia" Version="11.0.3.4" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0" /> <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.0" /> <PackageReference Include="Microsoft.Data.Sqlite" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="10.0.0" /> <PackageReference Include="MudTools.OfficeInterop" />
<PackageReference Include="MudTools.OfficeInterop" Version="2.0.8" /> <PackageReference Include="MudTools.OfficeInterop.Word" />
<PackageReference Include="MudTools.OfficeInterop.Word" Version="2.0.8" /> <PackageReference Include="MudTools.OfficeInterop.Excel" />
<PackageReference Include="MudTools.OfficeInterop.Excel" Version="2.0.8" /> <PackageReference Include="MudTools.OfficeInterop.PowerPoint" />
<PackageReference Include="MudTools.OfficeInterop.PowerPoint" Version="2.0.8" />
<PackageReference Include="PortAudioSharp2" Version="1.0.6" /> <PackageReference Include="PortAudioSharp2" />
<PackageReference Include="MaterialColorUtilities" Version="0.3.0" /> <PackageReference Include="MaterialColorUtilities" />
<PackageReference Include="PostHog" Version="2.4.0" /> <PackageReference Include="PostHog" />
<PackageReference Include="Sentry" Version="4.0.0" /> <PackageReference Include="Sentry" />
<PackageReference Include="System.Runtime.WindowsRuntime" Version="4.7.0" /> <PackageReference Include="System.Runtime.WindowsRuntime" />
<PackageReference Include="System.Drawing.Common" Version="10.0.0" /> <PackageReference Include="System.Drawing.Common" />
<PackageReference Include="WebView.Avalonia" Version="11.0.0.1" /> <PackageReference Include="YamlDotNet" />
<PackageReference Include="WebView.Avalonia.Desktop" Version="11.0.0.1" /> <PackageReference Include="Tmds.DBus.Protocol" />
<PackageReference Include="YamlDotNet" Version="16.3.0" /> <PackageReference Include="log4net" />
<PackageReference Include="Tmds.DBus.Protocol" Version="0.92.0" />
<PackageReference Include="log4net" Version="3.3.0" />
</ItemGroup> </ItemGroup>
<!-- Launcher 构建目标已移除 - Launcher 现在是独立应用,由 CI/CD 单独构建 --> <!-- Launcher 构建目标已移除 - Launcher 现在是独立应用,由 CI/CD 单独构建 -->

View File

@@ -3,7 +3,6 @@ using System.Diagnostics;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Avalonia; using Avalonia;
using Avalonia.WebView.Desktop;
using LanMountainDesktop.DesktopHost; using LanMountainDesktop.DesktopHost;
using LanMountainDesktop.Models; using LanMountainDesktop.Models;
using LanMountainDesktop.Plugins; using LanMountainDesktop.Plugins;
@@ -111,7 +110,6 @@ public sealed class Program
{ {
var builder = AppBuilder.Configure<App>() var builder = AppBuilder.Configure<App>()
.UsePlatformDetect() .UsePlatformDetect()
.UseDesktopWebView()
.WithInterFont() .WithInterFont()
.LogToTrace(); .LogToTrace();

View File

@@ -65,7 +65,7 @@ public interface INotificationService
{ {
void Show(NotificationContent content); void Show(NotificationContent content);
Task<ContentDialogResult> ShowDialogAsync(NotificationContent content); Task<FAContentDialogResult> ShowDialogAsync(NotificationContent content);
void ShowInfo(string title, string? message = null, void ShowInfo(string title, string? message = null,
NotificationPosition position = NotificationPosition.TopRight); NotificationPosition position = NotificationPosition.TopRight);
@@ -79,17 +79,17 @@ public interface INotificationService
void ShowError(string title, string? message = null, void ShowError(string title, string? message = null,
NotificationPosition position = NotificationPosition.TopRight); NotificationPosition position = NotificationPosition.TopRight);
Task<ContentDialogResult> ShowDialogInfoAsync(string title, string? message = null, Task<FAContentDialogResult> ShowDialogInfoAsync(string title, string? message = null,
string? primaryButtonText = "确定", string? closeButtonText = "取消"); string? primaryButtonText = "OK", string? closeButtonText = "Cancel");
Task<ContentDialogResult> ShowDialogSuccessAsync(string title, string? message = null, Task<FAContentDialogResult> ShowDialogSuccessAsync(string title, string? message = null,
string? primaryButtonText = "确定", string? closeButtonText = "取消"); string? primaryButtonText = "OK", string? closeButtonText = "Cancel");
Task<ContentDialogResult> ShowDialogWarningAsync(string title, string? message = null, Task<FAContentDialogResult> ShowDialogWarningAsync(string title, string? message = null,
string? primaryButtonText = "确定", string? closeButtonText = "取消"); string? primaryButtonText = "OK", string? closeButtonText = "Cancel");
Task<ContentDialogResult> ShowDialogErrorAsync(string title, string? message = null, Task<FAContentDialogResult> ShowDialogErrorAsync(string title, string? message = null,
string? primaryButtonText = "确定", string? closeButtonText = "取消"); string? primaryButtonText = "OK", string? closeButtonText = "Cancel");
} }
internal sealed class NotificationService : INotificationService internal sealed class NotificationService : INotificationService
@@ -105,20 +105,17 @@ internal sealed class NotificationService : INotificationService
public void Show(NotificationContent content) public void Show(NotificationContent content)
{ {
// 检查通知开关是否启用
if (!IsNotificationEnabled()) if (!IsNotificationEnabled())
{ {
return; // 通知已禁用,不显示 return;
} }
// If it's a dialog notification (center position), show as dialog window
if (content.IsDialogNotification) if (content.IsDialogNotification)
{ {
Dispatcher.UIThread.Post(() => ShowDialogWindow(content), DispatcherPriority.Normal); Dispatcher.UIThread.Post(() => ShowDialogWindow(content), DispatcherPriority.Normal);
return; return;
} }
// Otherwise, show as toast notification
Dispatcher.UIThread.Post(() => ShowCore(content), DispatcherPriority.Normal); Dispatcher.UIThread.Post(() => ShowCore(content), DispatcherPriority.Normal);
} }
@@ -153,37 +150,35 @@ internal sealed class NotificationService : INotificationService
}); });
} }
public async Task<ContentDialogResult> ShowDialogAsync(NotificationContent content) public async Task<FAContentDialogResult> ShowDialogAsync(NotificationContent content)
{ {
// 检查通知开关是否启用
if (!IsNotificationEnabled()) if (!IsNotificationEnabled())
{ {
return ContentDialogResult.None; // 通知已禁用,不显示 return FAContentDialogResult.None;
} }
return await Dispatcher.UIThread.InvokeAsync(() => ShowDialogCoreAsync(content)); return await Dispatcher.UIThread.InvokeAsync(() => ShowDialogCoreAsync(content));
} }
private async Task<ContentDialogResult> ShowDialogCoreAsync(NotificationContent content) private async Task<FAContentDialogResult> ShowDialogCoreAsync(NotificationContent content)
{ {
// Get the main window as the dialog host
var mainWindow = GetMainWindow(); var mainWindow = GetMainWindow();
if (mainWindow is null) if (mainWindow is null)
{ {
AppLogger.Warn("Notification", "Cannot show dialog notification: main window not found"); AppLogger.Warn("Notification", "Cannot show dialog notification: main window not found");
return ContentDialogResult.None; return FAContentDialogResult.None;
} }
var dialog = new ContentDialog var dialog = new FAContentDialog
{ {
Title = content.Title, Title = content.Title,
Content = content.Message ?? string.Empty, Content = content.Message ?? string.Empty,
PrimaryButtonText = content.PrimaryButtonText, PrimaryButtonText = content.PrimaryButtonText,
SecondaryButtonText = content.SecondaryButtonText, SecondaryButtonText = content.SecondaryButtonText,
CloseButtonText = content.CloseButtonText, CloseButtonText = content.CloseButtonText,
DefaultButton = !string.IsNullOrEmpty(content.PrimaryButtonText) ? ContentDialogButton.Primary : DefaultButton = !string.IsNullOrEmpty(content.PrimaryButtonText) ? FAContentDialogButton.Primary :
!string.IsNullOrEmpty(content.SecondaryButtonText) ? ContentDialogButton.Secondary : !string.IsNullOrEmpty(content.SecondaryButtonText) ? FAContentDialogButton.Secondary :
ContentDialogButton.Close FAContentDialogButton.Close
}; };
var result = await dialog.ShowAsync(mainWindow); var result = await dialog.ShowAsync(mainWindow);
@@ -191,10 +186,10 @@ internal sealed class NotificationService : INotificationService
// Execute callbacks based on result // Execute callbacks based on result
switch (result) switch (result)
{ {
case ContentDialogResult.Primary: case FAContentDialogResult.Primary:
content.OnPrimaryButtonClick?.Invoke(); content.OnPrimaryButtonClick?.Invoke();
break; break;
case ContentDialogResult.Secondary: case FAContentDialogResult.Secondary:
content.OnSecondaryButtonClick?.Invoke(); content.OnSecondaryButtonClick?.Invoke();
break; break;
} }
@@ -206,14 +201,13 @@ internal sealed class NotificationService : INotificationService
{ {
try try
{ {
// 从全局设置服务中读取通知开关状态
var settingsFacade = HostSettingsFacadeProvider.GetOrCreate(); var settingsFacade = HostSettingsFacadeProvider.GetOrCreate();
var snapshot = settingsFacade.Settings.LoadSnapshot<AppSettingsSnapshot>(PluginSdk.SettingsScope.App); var snapshot = settingsFacade.Settings.LoadSnapshot<AppSettingsSnapshot>(PluginSdk.SettingsScope.App);
return snapshot.NotificationEnabled; return snapshot.NotificationEnabled;
} }
catch catch
{ {
// 如果读取失败,默认启用通知 // 濠电姷顣介埀顒€鍟块埀顒€缍婇幃妯诲緞鐏炴儳鐝伴柣鐘叉处瑜板啰寰婇崹顕呯唵闁诡垱澹嗙花鍧楁偡濞嗘瑧鐣甸柡浣哥Т閻f繈宕熼鐐殿偧闂佽崵濮抽梽宥夊磹閺囥垹绠氶幖娣妽閸嬨劑鏌曟繛鐐澒闁稿鎸搁~婵囨綇閳轰礁缁?
return true; return true;
} }
} }
@@ -286,8 +280,8 @@ internal sealed class NotificationService : INotificationService
Show(new NotificationContent(title, message, Severity: NotificationSeverity.Error, Position: position)); Show(new NotificationContent(title, message, Severity: NotificationSeverity.Error, Position: position));
} }
public Task<ContentDialogResult> ShowDialogInfoAsync(string title, string? message = null, public Task<FAContentDialogResult> ShowDialogInfoAsync(string title, string? message = null,
string? primaryButtonText = "确定", string? closeButtonText = "取消") string? primaryButtonText = "OK", string? closeButtonText = "Cancel")
{ {
return ShowDialogAsync(new NotificationContent( return ShowDialogAsync(new NotificationContent(
title, title,
@@ -298,8 +292,8 @@ internal sealed class NotificationService : INotificationService
CloseButtonText: closeButtonText)); CloseButtonText: closeButtonText));
} }
public Task<ContentDialogResult> ShowDialogSuccessAsync(string title, string? message = null, public Task<FAContentDialogResult> ShowDialogSuccessAsync(string title, string? message = null,
string? primaryButtonText = "确定", string? closeButtonText = "取消") string? primaryButtonText = "OK", string? closeButtonText = "Cancel")
{ {
return ShowDialogAsync(new NotificationContent( return ShowDialogAsync(new NotificationContent(
title, title,
@@ -310,8 +304,8 @@ internal sealed class NotificationService : INotificationService
CloseButtonText: closeButtonText)); CloseButtonText: closeButtonText));
} }
public Task<ContentDialogResult> ShowDialogWarningAsync(string title, string? message = null, public Task<FAContentDialogResult> ShowDialogWarningAsync(string title, string? message = null,
string? primaryButtonText = "确定", string? closeButtonText = "取消") string? primaryButtonText = "OK", string? closeButtonText = "Cancel")
{ {
return ShowDialogAsync(new NotificationContent( return ShowDialogAsync(new NotificationContent(
title, title,
@@ -322,8 +316,8 @@ internal sealed class NotificationService : INotificationService
CloseButtonText: closeButtonText)); CloseButtonText: closeButtonText));
} }
public Task<ContentDialogResult> ShowDialogErrorAsync(string title, string? message = null, public Task<FAContentDialogResult> ShowDialogErrorAsync(string title, string? message = null,
string? primaryButtonText = "确定", string? closeButtonText = "取消") string? primaryButtonText = "OK", string? closeButtonText = "Cancel")
{ {
return ShowDialogAsync(new NotificationContent( return ShowDialogAsync(new NotificationContent(
title, title,
@@ -357,7 +351,7 @@ internal sealed class NotificationWindowManager
var position = viewModel.Position; var position = viewModel.Position;
var windows = _windowsByPosition[position]; var windows = _windowsByPosition[position];
// 从设置中读取最大通知数量 // 濠电偛顕慨鏉戭潩閿曞偆鏁婇柡鍥╁Х绾剧偓銇勯弮鈧Σ鎺楀储椤掑嫭鍋i柛銉憾閸ゆ瑧鎲搁弶鎸庡枠鐎殿喚鏁婚崺鈧い鎺嶇缁剁偟鎲搁弮鍫濈劦妞ゆ帊鐒﹂惃鎴︽煟閹垮嫮绡€鐎殿噮鍋呯€靛ジ寮堕幋鐑嗕画
var maxNotifications = GetMaxNotificationsPerPosition(); var maxNotifications = GetMaxNotificationsPerPosition();
if (windows.Count >= maxNotifications) if (windows.Count >= maxNotifications)
@@ -395,14 +389,13 @@ internal sealed class NotificationWindowManager
{ {
try try
{ {
// 从全局设置服务中读取最大通知数量 // 濠电偛顕慨瀛橆殽閹间礁鐭楅煫鍥ㄦ磻濞岊亪鏌嶈閸撴盯骞忕€n喖绀堢憸蹇涘几閸岀偞鐓涢柛顐g箘瀛濇繝娈垮枤閸犳劗绮欐径鎰垫晣闁宠棄妫楀▓娲⒑閸涘﹦鎳勯柣妤侇殔閵嗘帡鎳滈棃娑氱獮閻熸粍妫冮崺鈧い鎺嶇劍閻ㄦ垿鏌i幙鍕瘈鐎殿噮鍋呯€靛ジ寮堕幋鐑嗕画
var settingsFacade = HostSettingsFacadeProvider.GetOrCreate(); var settingsFacade = HostSettingsFacadeProvider.GetOrCreate();
var snapshot = settingsFacade.Settings.LoadSnapshot<AppSettingsSnapshot>(PluginSdk.SettingsScope.App); var snapshot = settingsFacade.Settings.LoadSnapshot<AppSettingsSnapshot>(PluginSdk.SettingsScope.App);
return snapshot.NotificationMaxPerPosition > 0 ? snapshot.NotificationMaxPerPosition : 5; return snapshot.NotificationMaxPerPosition > 0 ? snapshot.NotificationMaxPerPosition : 5;
} }
catch catch
{ {
// 如果读取失败,返回默认值
return 5; return 5;
} }
} }

View File

@@ -19,7 +19,7 @@ public static class WebView2RuntimeProbe
public static WebView2RuntimeAvailability GetAvailability() public static WebView2RuntimeAvailability GetAvailability()
{ {
if (!OperatingSystem.IsWindows()) if (OperatingSystem.IsMacOS())
{ {
return new WebView2RuntimeAvailability( return new WebView2RuntimeAvailability(
IsAvailable: true, IsAvailable: true,
@@ -27,6 +27,14 @@ public static class WebView2RuntimeProbe
Message: string.Empty); Message: string.Empty);
} }
if (!OperatingSystem.IsWindows())
{
return new WebView2RuntimeAvailability(
IsAvailable: false,
Version: null,
Message: "Embedded browser is currently unavailable on this platform.");
}
try try
{ {
var version = TryGetVersionFromWebView2Api(); var version = TryGetVersionFromWebView2Api();

View File

@@ -152,7 +152,7 @@
<Setter Property="Background" Value="{DynamicResource AdaptiveNavItemSelectedBackgroundBrush}" /> <Setter Property="Background" Value="{DynamicResource AdaptiveNavItemSelectedBackgroundBrush}" />
</Style> </Style>
<Style Selector=".settings-scope ui|NavigationView, .settings-scope ui|NavigationViewItem, .settings-scope ui|SettingsExpander, .settings-scope ui|InfoBar, .settings-scope ListBoxItem"> <Style Selector=".settings-scope ui|FANavigationView, .settings-scope ui|FANavigationViewItem, .settings-scope ui|FASettingsExpander, .settings-scope ui|FAInfoBar, .settings-scope ListBoxItem">
<Setter Property="Foreground" Value="{DynamicResource AdaptiveTextPrimaryBrush}" /> <Setter Property="Foreground" Value="{DynamicResource AdaptiveTextPrimaryBrush}" />
</Style> </Style>
@@ -169,9 +169,9 @@
</Style> </Style>
<!-- <!--
半透明表面样式类 鍗婇€忔槑琛ㄩ潰鏍峰紡绫?
注意:这些样式使用纯色半透明画刷模拟玻璃效果,并非真正的 Mica/Acrylic 模糊材质。 娉ㄦ剰锛氳繖浜涙牱寮忎娇鐢ㄧ函鑹插崐閫忔槑鐢诲埛妯℃嫙鐜荤拑鏁堟灉锛屽苟闈炵湡姝g殑 Mica/Acrylic 妯$硦鏉愯川銆?
真正的 Mica/Acrylic 效果仅通过 WindowTransparencyLevel 在独立窗口上应用。 鐪熸鐨?Mica/Acrylic 鏁堟灉浠呴€氳繃 WindowTransparencyLevel 鍦ㄧ嫭绔嬬獥鍙d笂搴旂敤銆?
--> -->
<Style Selector="Border.surface-translucent-panel"> <Style Selector="Border.surface-translucent-panel">
@@ -221,7 +221,7 @@
<Setter Property="Opacity" Value="{DynamicResource AdaptiveGlassOverlayOpacity}" /> <Setter Property="Opacity" Value="{DynamicResource AdaptiveGlassOverlayOpacity}" />
</Style> </Style>
<!-- 向后兼容的旧样式类(已弃用) --> <!-- 鍚戝悗鍏煎鐨勬棫鏍峰紡绫伙紙宸插純鐢級 -->
<Style Selector="Border.glass-panel"> <Style Selector="Border.glass-panel">
<Setter Property="Background" Value="{DynamicResource AdaptiveGlassPanelBackgroundBrush}" /> <Setter Property="Background" Value="{DynamicResource AdaptiveGlassPanelBackgroundBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AdaptiveGlassPanelBorderBrush}" /> <Setter Property="BorderBrush" Value="{DynamicResource AdaptiveGlassPanelBorderBrush}" />

View File

@@ -1,7 +1,7 @@
<Styles xmlns="https://github.com/avaloniaui" <Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent"> xmlns:fi="using:FluentIcons.Avalonia">
<Styles.Resources> <Styles.Resources>
<x:Double x:Key="PaneToggleButtonWidth">40</x:Double> <x:Double x:Key="PaneToggleButtonWidth">40</x:Double>
@@ -115,7 +115,7 @@
<Setter Property="Background" Value="{DynamicResource SubtleFillColorTertiaryBrush}" /> <Setter Property="Background" Value="{DynamicResource SubtleFillColorTertiaryBrush}" />
</Style> </Style>
<Style Selector="ui|NavigationView.settings-navigation-view"> <Style Selector="ui|FANavigationView.settings-navigation-view">
<Setter Property="Transitions"> <Setter Property="Transitions">
<Transitions> <Transitions>
<DoubleTransition Property="Opacity" Duration="0:0:0.2" Easing="0.05,0.75,0.10,1.00" /> <DoubleTransition Property="Opacity" Duration="0:0:0.2" Easing="0.05,0.75,0.10,1.00" />
@@ -123,7 +123,7 @@
</Setter> </Setter>
</Style> </Style>
<Style Selector="ui|NavigationView.settings-navigation-view /template/ Border#NavigationViewBorder"> <Style Selector="ui|FANavigationView.settings-navigation-view /template/ Border#NavigationViewBorder">
<Setter Property="Transitions"> <Setter Property="Transitions">
<Transitions> <Transitions>
<BrushTransition Property="Background" Duration="0:0:0.167" Easing="0.05,0.75,0.10,1.00" /> <BrushTransition Property="Background" Duration="0:0:0.167" Easing="0.05,0.75,0.10,1.00" />
@@ -131,7 +131,7 @@
</Setter> </Setter>
</Style> </Style>
<Style Selector="ui|NavigationViewItem.settings-nav-item"> <Style Selector="ui|FANavigationViewItem.settings-nav-item">
<Setter Property="Transitions"> <Setter Property="Transitions">
<Transitions> <Transitions>
<BrushTransition Property="Background" Duration="0:0:0.083" Easing="0.05,0.75,0.10,1.00" /> <BrushTransition Property="Background" Duration="0:0:0.083" Easing="0.05,0.75,0.10,1.00" />
@@ -140,11 +140,11 @@
</Setter> </Setter>
</Style> </Style>
<Style Selector="ui|NavigationViewItem.settings-nav-item:pointerover"> <Style Selector="ui|FANavigationViewItem.settings-nav-item:pointerover">
<Setter Property="RenderTransform" Value="scale(1.01)" /> <Setter Property="RenderTransform" Value="scale(1.01)" />
</Style> </Style>
<Style Selector="ui|NavigationViewItem.settings-nav-item:pressed"> <Style Selector="ui|FANavigationViewItem.settings-nav-item:pressed">
<Setter Property="RenderTransform" Value="scale(0.99)" /> <Setter Property="RenderTransform" Value="scale(0.99)" />
</Style> </Style>

View File

@@ -1,7 +1,7 @@
<Styles xmlns="https://github.com/avaloniaui" <Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
xmlns:behaviors="using:LanMountainDesktop.Behaviors"> xmlns:behaviors="using:LanMountainDesktop.Behaviors">
<Style Selector="StackPanel.settings-page-container"> <Style Selector="StackPanel.settings-page-container">
@@ -162,59 +162,59 @@
<Setter Property="ColumnSpacing" Value="12" /> <Setter Property="ColumnSpacing" Value="12" />
</Style> </Style>
<Style Selector="ui|SettingsExpander"> <Style Selector="ui|FASettingsExpander">
<Setter Property="HorizontalAlignment" Value="Stretch" /> <Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="MinWidth" Value="0" /> <Setter Property="MinWidth" Value="0" />
</Style> </Style>
<Style Selector="ui|SettingsExpander ComboBox, ui|SettingsExpander TextBox, ui|SettingsExpander NumericUpDown"> <Style Selector="ui|FASettingsExpander ComboBox, ui|FASettingsExpander TextBox, ui|FASettingsExpander NumericUpDown">
<Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="MinWidth" Value="0" /> <Setter Property="MinWidth" Value="0" />
</Style> </Style>
<Style Selector="ui|SettingsExpanderItem ComboBox, ui|SettingsExpanderItem TextBox, ui|SettingsExpanderItem NumericUpDown"> <Style Selector="ui|FASettingsExpanderItem ComboBox, ui|FASettingsExpanderItem TextBox, ui|FASettingsExpanderItem NumericUpDown">
<Setter Property="HorizontalAlignment" Value="Stretch" /> <Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="MinWidth" Value="0" /> <Setter Property="MinWidth" Value="0" />
</Style> </Style>
<Style Selector="ui|SettingsExpander ToggleSwitch, ui|SettingsExpanderItem ToggleSwitch"> <Style Selector="ui|FASettingsExpander ToggleSwitch, ui|FASettingsExpanderItem ToggleSwitch">
<Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="HorizontalAlignment" Value="Left" />
</Style> </Style>
<Style Selector="ui|SettingsExpander.settings-expander-card"> <Style Selector="ui|FASettingsExpander.settings-expander-card">
<Setter Property="Margin" Value="0,0,0,14" /> <Setter Property="Margin" Value="0,0,0,14" />
</Style> </Style>
<Style Selector="ui|SettingsExpander.settings-expander-card /template/ ContentPresenter#FooterContentPresenter"> <Style Selector="ui|FASettingsExpander.settings-expander-card /template/ ContentPresenter#FooterContentPresenter">
<Setter Property="Margin" Value="0,6,0,2" /> <Setter Property="Margin" Value="0,6,0,2" />
</Style> </Style>
<Style Selector="ui|SettingsExpander.settings-expander-card /template/ ContentPresenter#ContentPresenter"> <Style Selector="ui|FASettingsExpander.settings-expander-card /template/ ContentPresenter#ContentPresenter">
<Setter Property="Margin" Value="0,14,0,0" /> <Setter Property="Margin" Value="0,14,0,0" />
</Style> </Style>
<Style Selector="ui|SettingsExpander.settings-expander-card ComboBox, .settings-section-card ComboBox, .settings-option-card ComboBox"> <Style Selector="ui|FASettingsExpander.settings-expander-card ComboBox, .settings-section-card ComboBox, .settings-option-card ComboBox">
<Setter Property="MinWidth" Value="220" /> <Setter Property="MinWidth" Value="220" />
<Setter Property="HorizontalAlignment" Value="Stretch" /> <Setter Property="HorizontalAlignment" Value="Stretch" />
</Style> </Style>
<Style Selector="ui|SettingsExpander.settings-expander-card TextBox, .settings-section-card TextBox, .settings-option-card TextBox"> <Style Selector="ui|FASettingsExpander.settings-expander-card TextBox, .settings-section-card TextBox, .settings-option-card TextBox">
<Setter Property="HorizontalAlignment" Value="Stretch" /> <Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="MinHeight" Value="38" /> <Setter Property="MinHeight" Value="38" />
</Style> </Style>
<Style Selector="ui|SettingsExpander.settings-expander-card NumericUpDown, .settings-section-card NumericUpDown, .settings-option-card NumericUpDown"> <Style Selector="ui|FASettingsExpander.settings-expander-card NumericUpDown, .settings-section-card NumericUpDown, .settings-option-card NumericUpDown">
<Setter Property="HorizontalAlignment" Value="Stretch" /> <Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="MinHeight" Value="38" /> <Setter Property="MinHeight" Value="38" />
</Style> </Style>
<Style Selector="ui|SettingsExpander.settings-expander-card ToggleSwitch, .settings-option-card ToggleSwitch, .settings-list-item ToggleSwitch"> <Style Selector="ui|FASettingsExpander.settings-expander-card ToggleSwitch, .settings-option-card ToggleSwitch, .settings-list-item ToggleSwitch">
<Setter Property="VerticalAlignment" Value="Center" /> <Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="OnContent" Value="{x:Null}" /> <Setter Property="OnContent" Value="{x:Null}" />
<Setter Property="OffContent" Value="{x:Null}" /> <Setter Property="OffContent" Value="{x:Null}" />
</Style> </Style>
<Style Selector=".settings-section-card Button, .settings-option-card Button, .settings-list-item Button, ui|SettingsExpander.settings-expander-card Button"> <Style Selector=".settings-section-card Button, .settings-option-card Button, .settings-list-item Button, ui|FASettingsExpander.settings-expander-card Button">
<Setter Property="MinHeight" Value="36" /> <Setter Property="MinHeight" Value="36" />
<Setter Property="Padding" Value="14,8" /> <Setter Property="Padding" Value="14,8" />
</Style> </Style>

View File

@@ -2,7 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:fa="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent" xmlns:fa="clr-namespace:FluentIcons.Avalonia;assembly=FluentIcons.Avalonia"
xmlns:mi="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:mi="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
xmlns:themes="clr-namespace:Material.Styles.Themes;assembly=Material.Styles" xmlns:themes="clr-namespace:Material.Styles.Themes;assembly=Material.Styles"
mc:Ignorable="d" mc:Ignorable="d"

View File

@@ -4,11 +4,10 @@ using Avalonia.Controls;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Styling; using Avalonia.Styling;
using AvaloniaWebView;
using LanMountainDesktop.ComponentSystem; using LanMountainDesktop.ComponentSystem;
using LanMountainDesktop.Services; using LanMountainDesktop.Services;
using WebViewCore.Events;
namespace LanMountainDesktop.Views.Components; namespace LanMountainDesktop.Views.Components;
@@ -28,7 +27,7 @@ public partial class BrowserWidget : UserControl, IDesktopComponentWidget,
private bool _isEditMode; private bool _isEditMode;
private bool _isWebViewActive = true; private bool _isWebViewActive = true;
private bool _isWebViewFaulted; private bool _isWebViewFaulted;
private WebView? _browserWebView; private NativeWebView? _browserWebView;
private readonly WebView2RuntimeAvailability _runtimeAvailability; private readonly WebView2RuntimeAvailability _runtimeAvailability;
private bool _isDisposed; private bool _isDisposed;
@@ -78,7 +77,8 @@ public partial class BrowserWidget : UserControl, IDesktopComponentWidget,
if (_browserWebView is not null) if (_browserWebView is not null)
{ {
_browserWebView.NavigationStarting -= OnBrowserWebViewNavigationStarting; _browserWebView.NavigationStarted -= OnBrowserWebViewNavigationStarting;
_browserWebView.EnvironmentRequested -= OnBrowserWebViewEnvironmentRequested;
} }
} }
@@ -294,15 +294,32 @@ public partial class BrowserWidget : UserControl, IDesktopComponentWidget,
} }
} }
private void OnBrowserWebViewNavigationStarting(object? sender, WebViewUrlLoadingEventArg e) private void OnBrowserWebViewNavigationStarting(object? sender, WebViewNavigationStartingEventArgs e)
{ {
if (e.Url is null) if (e.Request is null)
{ {
return; return;
} }
_lastKnownUri = e.Url; _lastKnownUri = e.Request;
AddressTextBox.Text = e.Url.ToString(); AddressTextBox.Text = e.Request.ToString();
}
private void OnBrowserWebViewEnvironmentRequested(object? sender, WebViewEnvironmentRequestedEventArgs e)
{
if (e is not WindowsWebView2EnvironmentRequestedEventArgs windowsArgs)
{
return;
}
try
{
windowsArgs.UserDataFolder = WebView2RuntimeProbe.ResolveUserDataFolder();
}
catch (Exception ex) when (!UiExceptionGuard.IsFatalException(ex))
{
AppLogger.Warn("WebView2", "Failed to configure the WebView2 user data folder for BrowserWidget.", ex);
}
} }
private void UpdateWebViewActiveState() private void UpdateWebViewActiveState()
@@ -358,6 +375,7 @@ public partial class BrowserWidget : UserControl, IDesktopComponentWidget,
GoButton.IsEnabled = true; GoButton.IsEnabled = true;
AddressTextBox.IsEnabled = true; AddressTextBox.IsEnabled = true;
UnavailableOverlay.IsVisible = false; UnavailableOverlay.IsVisible = false;
TryNavigate(_lastKnownUri, "ActivateWebView");
} }
private void DeactivateWebView(bool clearUrl) private void DeactivateWebView(bool clearUrl)
@@ -383,8 +401,7 @@ public partial class BrowserWidget : UserControl, IDesktopComponentWidget,
try try
{ {
_browserWebView.Reload(); return _browserWebView.Refresh();
return true;
} }
catch (Exception ex) when (!UiExceptionGuard.IsFatalException(ex)) catch (Exception ex) when (!UiExceptionGuard.IsFatalException(ex))
{ {
@@ -402,7 +419,7 @@ public partial class BrowserWidget : UserControl, IDesktopComponentWidget,
try try
{ {
_browserWebView.Url = uri; _browserWebView.Navigate(uri);
return true; return true;
} }
catch (Exception ex) when (!UiExceptionGuard.IsFatalException(ex)) catch (Exception ex) when (!UiExceptionGuard.IsFatalException(ex))
@@ -421,7 +438,7 @@ public partial class BrowserWidget : UserControl, IDesktopComponentWidget,
try try
{ {
_browserWebView.Url = null; _browserWebView.Navigate(new Uri("about:blank"));
} }
catch catch
{ {
@@ -466,12 +483,14 @@ public partial class BrowserWidget : UserControl, IDesktopComponentWidget,
return; return;
} }
_browserWebView = new WebView _browserWebView = new NativeWebView
{ {
Source = new Uri("about:blank"),
IsVisible = false, IsVisible = false,
IsHitTestVisible = false IsHitTestVisible = false
}; };
_browserWebView.NavigationStarting += OnBrowserWebViewNavigationStarting; _browserWebView.NavigationStarted += OnBrowserWebViewNavigationStarting;
_browserWebView.EnvironmentRequested += OnBrowserWebViewEnvironmentRequested;
WebViewPresenter.Children.Insert(0, _browserWebView); WebViewPresenter.Children.Insert(0, _browserWebView);
} }

View File

@@ -1,6 +1,6 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
xmlns:symbol="using:FluentIcons.Common" xmlns:symbol="using:FluentIcons.Common"
x:Class="LanMountainDesktop.Views.Components.NotificationBoxWidget"> x:Class="LanMountainDesktop.Views.Components.NotificationBoxWidget">
@@ -9,18 +9,18 @@
Background="Transparent" Background="Transparent"
ClipToBounds="True"> ClipToBounds="True">
<Grid> <Grid>
<!-- 主卡片 --> <!-- 涓诲崱鐗?-->
<Border x:Name="CardBorder" <Border x:Name="CardBorder"
Background="#FCFCFD" Background="#FCFCFD"
CornerRadius="{DynamicResource DesignCornerRadiusComponent}" CornerRadius="{DynamicResource DesignCornerRadiusComponent}"
Padding="12,10"> Padding="12,10">
<Grid RowDefinitions="Auto,*,Auto"> <Grid RowDefinitions="Auto,*,Auto">
<!-- 头部 --> <!-- 澶撮儴 -->
<Grid Grid.Row="0" ColumnDefinitions="*,Auto"> <Grid Grid.Row="0" ColumnDefinitions="*,Auto">
<StackPanel Orientation="Horizontal" Spacing="6" VerticalAlignment="Center"> <StackPanel Orientation="Horizontal" Spacing="6" VerticalAlignment="Center">
<fi:SymbolIcon x:Name="HeaderIcon" Symbol="{x:Static symbol:Symbol.MailInbox}" FontSize="16" /> <fi:SymbolIcon x:Name="HeaderIcon" Symbol="{x:Static symbol:Symbol.MailInbox}" FontSize="16" />
<TextBlock x:Name="HeaderTextBlock" <TextBlock x:Name="HeaderTextBlock"
Text="消息盒子" Text="娑堟伅鐩掑瓙"
FontSize="15" FontSize="15"
FontWeight="SemiBold" /> FontWeight="SemiBold" />
<Border x:Name="UnreadBadge" <Border x:Name="UnreadBadge"
@@ -46,24 +46,24 @@
</Button> </Button>
</Grid> </Grid>
<!-- 通知列表 --> <!-- 閫氱煡鍒楄〃 -->
<ScrollViewer Grid.Row="1" <ScrollViewer Grid.Row="1"
Margin="0,8,0,0" Margin="0,8,0,0"
VerticalScrollBarVisibility="Auto"> VerticalScrollBarVisibility="Auto">
<StackPanel x:Name="NotificationListPanel" Spacing="6" /> <StackPanel x:Name="NotificationListPanel" Spacing="6" />
</ScrollViewer> </ScrollViewer>
<!-- 空状态 --> <!-- 绌虹姸鎬?-->
<TextBlock x:Name="EmptyStateText" <TextBlock x:Name="EmptyStateText"
Grid.Row="1" Grid.Row="1"
Text="暂无通知" Text="鏆傛棤閫氱煡"
HorizontalAlignment="Center" HorizontalAlignment="Center"
VerticalAlignment="Center" VerticalAlignment="Center"
Foreground="#8B95A5" Foreground="#8B95A5"
FontSize="13" FontSize="13"
IsVisible="False" /> IsVisible="False" />
<!-- 隐私模式遮罩 --> <!-- 闅愮妯″紡閬僵 -->
<Border x:Name="PrivacyOverlay" <Border x:Name="PrivacyOverlay"
Grid.Row="1" Grid.Row="1"
Background="{DynamicResource SolidBackgroundFillColorBaseBrush}" Background="{DynamicResource SolidBackgroundFillColorBaseBrush}"
@@ -73,13 +73,13 @@
VerticalAlignment="Center" VerticalAlignment="Center"
Spacing="6"> Spacing="6">
<fi:SymbolIcon Symbol="{x:Static symbol:Symbol.EyeOff}" FontSize="24" Foreground="#8B95A5" /> <fi:SymbolIcon Symbol="{x:Static symbol:Symbol.EyeOff}" FontSize="24" Foreground="#8B95A5" />
<TextBlock Text="您有新的通知" <TextBlock Text="鎮ㄦ湁鏂扮殑閫氱煡"
Foreground="#8B95A5" Foreground="#8B95A5"
FontSize="12" /> FontSize="12" />
</StackPanel> </StackPanel>
</Border> </Border>
<!-- 底部状态 --> <!-- 搴曢儴鐘舵€?-->
<TextBlock x:Name="StatusTextBlock" <TextBlock x:Name="StatusTextBlock"
Grid.Row="2" Grid.Row="2"
FontSize="11" FontSize="11"

View File

@@ -2,13 +2,13 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
xmlns:converters="using:Avalonia.Data.Converters" xmlns:converters="using:Avalonia.Data.Converters"
x:Class="LanMountainDesktop.Views.FusedDesktopComponentLibraryControl" x:Class="LanMountainDesktop.Views.FusedDesktopComponentLibraryControl"
x:DataType="vm:ComponentLibraryWindowViewModel"> x:DataType="vm:ComponentLibraryWindowViewModel">
<UserControl.Styles> <UserControl.Styles>
<!-- 分类列表项样式 - 遵循 Fluent NavigationView 风格 --> <!-- 闂備礁鎲$敮鎺懳涘☉姘仏妞ゆ劧绠戠粈鍡樹繆閵堝懎顏ラ柍褜鍓欓崯顖炲Φ閸曨厽鍠嗛柛鏇ㄥ幖椤ュ酣鎮?- 闂傚倷绶¢崜鐔奉焽瑜旈獮?Fluent NavigationView 濠碉紕鍋涢鍛偓娑掓櫊閹?-->
<Style Selector="ListBoxItem.category-item"> <Style Selector="ListBoxItem.category-item">
<Setter Property="Padding" Value="0"/> <Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0,2"/> <Setter Property="Margin" Value="0,2"/>
@@ -30,7 +30,7 @@
<Setter Property="Background" Value="{DynamicResource SubtleFillColorTertiaryBrush}"/> <Setter Property="Background" Value="{DynamicResource SubtleFillColorTertiaryBrush}"/>
</Style> </Style>
<!-- 分类项图标和文字 --> <!-- 闂備礁鎲$敮鎺懳涘☉姘仏妞ゆ劧绲绘禍婊堟煟閻斿搫顣肩紒鍌氱墦閺屸€愁吋閸涱喗鎮欓梺纭呮腹閸楀啿顕i鍕倞鐟滃繘骞?-->
<Style Selector="ListBoxItem.category-item fi|FluentIcon.category-icon"> <Style Selector="ListBoxItem.category-item fi|FluentIcon.category-icon">
<Setter Property="Foreground" Value="{DynamicResource AdaptiveTextPrimaryBrush}"/> <Setter Property="Foreground" Value="{DynamicResource AdaptiveTextPrimaryBrush}"/>
</Style> </Style>
@@ -50,11 +50,11 @@
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="0" ColumnSpacing="0"
Margin="0"> Margin="0">
<!-- 左侧导航列 - 分类列表 + 底部"查找更多组件" --> <!-- 闁诲骸缍婂鑽ょ磽濮樿泛鐤鹃柛鎾茶閸嬫挻鎷呴崘顭戞闂佺硶鏅涢幊妯虹暦?- 闂備礁鎲$敮鎺懳涘☉姘仏妞ゆ劧绠戠粈鍡樹繆閵堝懎顏ラ柍?+ 闂佸湱鍘ч悺銊ッ洪悢鐓庣??闂備礁鎼悮顐﹀磿閸欏鐝舵慨妞诲亾鐎殿喗鎸冲鍫曞箣椤撶啿鏌ょ紓鍌氬€风粈浣衡偓姘间簻閳? -->
<Border Width="280" <Border Width="280"
Background="Transparent"> Background="Transparent">
<Grid RowDefinitions="*,Auto"> <Grid RowDefinitions="*,Auto">
<!-- 分类列表 --> <!-- 闂備礁鎲$敮鎺懳涘☉姘仏妞ゆ劧绠戠粈鍡樹繆閵堝懎顏ラ柍?-->
<ListBox x:Name="CategoryListBox" <ListBox x:Name="CategoryListBox"
Grid.Row="0" Grid.Row="0"
Background="Transparent" Background="Transparent"
@@ -81,7 +81,7 @@
</ListBox.ItemTemplate> </ListBox.ItemTemplate>
</ListBox> </ListBox>
<!-- 底部"查找更多组件" - 在左侧导航列底部 --> <!-- 闂佸湱鍘ч悺銊ッ洪悢鐓庣??闂備礁鎼悮顐﹀磿閸欏鐝舵慨妞诲亾鐎殿喗鎸冲鍫曞箣椤撶啿鏌ょ紓鍌氬€风粈浣衡偓姘间簻閳? - 闂備線娼荤拹鐔煎礉鐏炲墽鈻曢煫鍥ㄦ⒒閻熷湱鎲稿澶樻晪闂侇剙绉甸崵瀣亜韫囨挸顏╅柣蹇旂懇楠炴牜鈧稒蓱缁€瀣煕?-->
<StackPanel Grid.Row="1" <StackPanel Grid.Row="1"
Margin="12,8,8,12"> Margin="12,8,8,12">
<Border Height="1" <Border Height="1"
@@ -93,42 +93,42 @@
Click="OnFindMoreComponentsClick"> Click="OnFindMoreComponentsClick">
<StackPanel Orientation="Horizontal" Spacing="6"> <StackPanel Orientation="Horizontal" Spacing="6">
<fi:FluentIcon Icon="Globe" IconVariant="Regular" FontSize="14"/> <fi:FluentIcon Icon="Globe" IconVariant="Regular" FontSize="14"/>
<TextBlock Text="查找更多组件"/> <TextBlock Text="Find More Components"/>
</StackPanel> </StackPanel>
</Button> </Button>
</StackPanel> </StackPanel>
</Grid> </Grid>
</Border> </Border>
<!-- 右侧内容区与左侧的分隔线 --> <!-- 闂備礁鎲¢悷銉╁储閺嶎厼鐤鹃柛顐f礀缁€鍐煕濞戝崬寮鹃柛鐔锋喘閺屾盯寮介浣碘偓鍐磼濡も偓閼活垶顢欒箛娑欐櫆闁圭瀛╅悵鐑芥⒑濮瑰洤濡奸悗姘煎墴瀹曡鎯旈妸锔规寗闂佸搫鍟崐绋库枔?-->
<Border Grid.Column="1" <Border Grid.Column="1"
Width="1" Width="1"
HorizontalAlignment="Left" HorizontalAlignment="Left"
Background="{DynamicResource AdaptiveGlassPanelBorderBrush}" Background="{DynamicResource AdaptiveGlassPanelBorderBrush}"
Opacity="0.5"/> Opacity="0.5"/>
<!-- 组件预览区 (右侧) --> <!-- 缂傚倸鍊风粈浣衡偓姘间簻閳诲酣濮€閳藉懐鐭楅梺鍛婃处閸n喖顭囬弮鍫熺厱?(闂備礁鎲¢悷銉╁储閺嶎厼鐤? -->
<ScrollViewer Grid.Column="1" <ScrollViewer Grid.Column="1"
VerticalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled"> HorizontalScrollBarVisibility="Disabled">
<StackPanel Margin="16,8,12,8" <StackPanel Margin="16,8,12,8"
Spacing="0"> Spacing="0">
<!-- 有选中组件时的显示 --> <!-- 闂備礁鎼悧鍡浰囬悽绋跨劦妞ゆ巻鍋撴い锔诲櫍閹虫瑩骞嬮悩鐢碉紲闂佸憡娲︽禍婵嬵敃娴犲鐓涢柛鎰╁妼椤h櫕绻涢崼鐔风伌鐎殿喕鍗冲畷婊嗩槹濞?-->
<Panel IsVisible="{Binding SelectedComponent, Converter={x:Static converters:ObjectConverters.IsNotNull}}"> <Panel IsVisible="{Binding SelectedComponent, Converter={x:Static converters:ObjectConverters.IsNotNull}}">
<!-- 组件展示面板 - 有独立背景色,与窗口背景形成层级分界 --> <!-- 缂傚倸鍊风粈浣衡偓姘间簻閳诲酣濮€椤厽鍕冮梺鍝勬川婵増绂掑☉銏♀拻闁割偅绋戦悘顏呯節?- 闂備礁鎼悧鍡浰囨潏鈹惧亾濮樼厧骞樼紒顔规櫇閳ь剨缍嗛崢濂稿礈瑜版帗鐓涢柛婊€绀侀悘銉ヮ熆閻熷府韬柡浣哥Ф娴狅箓鎳栭埡鍐╁枦缂傚倷鐒﹂崝鏍€冮崨鑸汗婵炴垯鍨洪崵鍕倶閻愰潧浜鹃柣婵愬灣閹叉悂鎳滈鈧悘顏堟煕閵婏附鐨戝ù鐙呯畵瀹曟帒顭ㄩ崼銏犵闂備礁鎲$敮鎺懳涘☉銏犵柧?-->
<Border Classes="surface-translucent-panel" <Border Classes="surface-translucent-panel"
CornerRadius="{DynamicResource DesignCornerRadiusLg}" CornerRadius="{DynamicResource DesignCornerRadiusLg}"
Padding="20"> Padding="20">
<StackPanel Spacing="16"> <StackPanel Spacing="16">
<!-- 组件标题 --> <!-- 缂傚倸鍊风粈浣衡偓姘间簻閳诲酣濮€閵堝懎鍞ㄩ梺鎼炲労閸擄箓寮?-->
<TextBlock FontSize="28" <TextBlock FontSize="28"
FontWeight="SemiBold" FontWeight="SemiBold"
Foreground="{DynamicResource AdaptiveTextPrimaryBrush}" Foreground="{DynamicResource AdaptiveTextPrimaryBrush}"
Text="{Binding SelectedComponent.DisplayName}"/> Text="{Binding SelectedComponent.DisplayName}"/>
<!-- 固定大小的预览卡片 --> <!-- 闂備焦鎮堕崕閬嶅箹椤愶附鍋╅柣鎰靛墮缁剁偟鎲稿澶嬪剭妞ゆ帒瀚崕宥夋煕閺囥劌鐏遍柡鍡樻礋閹嘲鈻庤箛鏇烆暫閻庤娲熸禍鍫曞箖?-->
<Border CornerRadius="{DynamicResource DesignCornerRadiusSm}" <Border CornerRadius="{DynamicResource DesignCornerRadiusSm}"
Background="{DynamicResource AdaptiveSurfaceBaseBrush}" Background="{DynamicResource AdaptiveSurfaceBaseBrush}"
BorderBrush="{DynamicResource AdaptiveGlassPanelBorderBrush}" BorderBrush="{DynamicResource AdaptiveGlassPanelBorderBrush}"
@@ -137,7 +137,7 @@
Height="300" Height="300"
HorizontalAlignment="Center"> HorizontalAlignment="Center">
<Grid Margin="16"> <Grid Margin="16">
<!-- 预览图片 --> <!-- 濠碘槅鍋呭妯尖偓姘煎灦閿濈偛顓兼径濠勫€為梺鍛婃寙閸愮偓姣?-->
<Image Source="{Binding SelectedComponent.PreviewBitmap}" <Image Source="{Binding SelectedComponent.PreviewBitmap}"
Stretch="Uniform" Stretch="Uniform"
HorizontalAlignment="Center" HorizontalAlignment="Center"
@@ -145,7 +145,7 @@
RenderOptions.BitmapInterpolationMode="HighQuality" RenderOptions.BitmapInterpolationMode="HighQuality"
IsVisible="{Binding SelectedComponent.IsPreviewReady}"/> IsVisible="{Binding SelectedComponent.IsPreviewReady}"/>
<!-- 加载中状态 --> <!-- 闂備礁鎲″缁樻叏閹灐褰掑炊閵娧€鏋栧銈嗘尵婵鐟ч梻?-->
<Border IsVisible="{Binding SelectedComponent.IsPreviewPending}" <Border IsVisible="{Binding SelectedComponent.IsPreviewPending}"
Background="{DynamicResource AdaptiveSurfaceBaseBrush}"> Background="{DynamicResource AdaptiveSurfaceBaseBrush}">
<StackPanel HorizontalAlignment="Center" <StackPanel HorizontalAlignment="Center"
@@ -161,7 +161,7 @@
</StackPanel> </StackPanel>
</Border> </Border>
<!-- 失败状态 --> <!-- 濠电姰鍨洪崕鑲╁垝閸撗勫枂闁挎洖鍊归崑鎰版煠閸濄儺鏆柛?-->
<Border IsVisible="{Binding SelectedComponent.IsPreviewFailed}" <Border IsVisible="{Binding SelectedComponent.IsPreviewFailed}"
Background="{DynamicResource AdaptiveSurfaceBaseBrush}"> Background="{DynamicResource AdaptiveSurfaceBaseBrush}">
<StackPanel HorizontalAlignment="Center" <StackPanel HorizontalAlignment="Center"
@@ -188,7 +188,7 @@
</Grid> </Grid>
</Border> </Border>
<!-- "添加小组件"按钮 - 在面板内居中,使用主题强调色 --> <!-- "婵犵數鍎戠紞鈧い鏇嗗嫭鍙忛柣鎰悁閻掑﹪鐓崶銊︾闁活厼顑呴湁?闂備礁婀遍…鍫ニ囬悽绋跨?- 闂備線娼荤拹鐔煎礉閹存繍鐒藉ù鍏兼綑缁狙囨煕椤垵鏋涢柡浣哥埣閹﹢鎮欓崣澶婃闂佺厧鐏氶崹鍧楀极瀹ュ洣娌柣鎾崇岸閺嬪繘姊哄ú缁樺▏闁告柨顑囬埀顒勬涧閺堫剟鏁嶉幇顑╃喖宕崟顓犵暢闂佽崵濮撮鍛村疮閾忣偆鐝?-->
<Button HorizontalAlignment="Center" <Button HorizontalAlignment="Center"
Classes="accent" Classes="accent"
Padding="24,10" Padding="24,10"
@@ -196,14 +196,14 @@
Click="OnAddComponentClick"> Click="OnAddComponentClick">
<StackPanel Orientation="Horizontal" Spacing="8"> <StackPanel Orientation="Horizontal" Spacing="8">
<fi:FluentIcon Icon="Add" IconVariant="Regular" FontSize="16"/> <fi:FluentIcon Icon="Add" IconVariant="Regular" FontSize="16"/>
<TextBlock Text="添加小组件" FontWeight="SemiBold"/> <TextBlock Text="Add Component" FontWeight="SemiBold"/>
</StackPanel> </StackPanel>
</Button> </Button>
</StackPanel> </StackPanel>
</Border> </Border>
</Panel> </Panel>
<!-- 空状态 --> <!-- 缂傚倷绀侀惌浣糕枍閿濆棙鍙忛柟闂寸缁?-->
<Grid IsVisible="{Binding SelectedComponent, Converter={x:Static converters:ObjectConverters.IsNull}}" <Grid IsVisible="{Binding SelectedComponent, Converter={x:Static converters:ObjectConverters.IsNull}}"
HorizontalAlignment="Center" HorizontalAlignment="Center"
VerticalAlignment="Center" VerticalAlignment="Center"
@@ -218,7 +218,7 @@
<TextBlock HorizontalAlignment="Center" <TextBlock HorizontalAlignment="Center"
FontSize="16" FontSize="16"
Foreground="{DynamicResource AdaptiveTextSecondaryBrush}" Foreground="{DynamicResource AdaptiveTextSecondaryBrush}"
Text="请从左侧选择一个组件"/> Text="Select a component to view its details."/>
</StackPanel> </StackPanel>
</Grid> </Grid>
</StackPanel> </StackPanel>

View File

@@ -1,24 +1,24 @@
<Window xmlns="https://github.com/avaloniaui" <Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:LanMountainDesktop.Views" xmlns:controls="using:LanMountainDesktop.Views"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.FusedDesktopComponentLibraryWindow" x:Class="LanMountainDesktop.Views.FusedDesktopComponentLibraryWindow"
Width="860" Height="620" Width="860"
MinWidth="600" MinHeight="500" Height="620"
MinWidth="600"
MinHeight="500"
CanResize="True" CanResize="True"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
SystemDecorations="BorderOnly" WindowDecorations="BorderOnly"
ExtendClientAreaToDecorationsHint="True" ExtendClientAreaToDecorationsHint="True"
ExtendClientAreaChromeHints="NoChrome"
ExtendClientAreaTitleBarHeightHint="48" ExtendClientAreaTitleBarHeightHint="48"
Background="Transparent" Background="Transparent"
Title="添加小组件"> Title="Add Component">
<Grid x:Name="RootGrid" <Grid x:Name="RootGrid"
Classes="settings-scope" Classes="settings-scope"
Background="{DynamicResource AdaptiveSettingsWindowBackgroundBrush}" Background="{DynamicResource AdaptiveSettingsWindowBackgroundBrush}"
RowDefinitions="Auto,*"> RowDefinitions="Auto,*">
<!-- 自定义标题栏 - 与 SettingsWindow 风格一致 -->
<Border x:Name="WindowTitleBarHost" <Border x:Name="WindowTitleBarHost"
Height="48" Height="48"
Padding="12,0,12,0" Padding="12,0,12,0"
@@ -41,14 +41,14 @@
FontSize="12" FontSize="12"
FontWeight="SemiBold" FontWeight="SemiBold"
IsHitTestVisible="False" IsHitTestVisible="False"
Text="添加小组件" /> Text="Add Component" />
<TextBlock Grid.Column="2" <TextBlock Grid.Column="2"
FontSize="12" FontSize="12"
Opacity="0.6" Opacity="0.6"
IsHitTestVisible="False" IsHitTestVisible="False"
VerticalAlignment="Center" VerticalAlignment="Center"
Text="将精美组件放置在您的系统桌面上(负一屏)" /> Text="Browse available widgets and add them to the current fused desktop layout." />
<Button x:Name="CloseWindowButton" <Button x:Name="CloseWindowButton"
Grid.Column="3" Grid.Column="3"
@@ -65,7 +65,6 @@
</Grid> </Grid>
</Border> </Border>
<!-- 组件库控件 -->
<controls:FusedDesktopComponentLibraryControl x:Name="LibraryControl" <controls:FusedDesktopComponentLibraryControl x:Name="LibraryControl"
Grid.Row="1" Grid.Row="1"
Margin="12,8,16,8" /> Margin="12,8,16,8" />

View File

@@ -390,12 +390,10 @@ public partial class MainWindow
if (OperatingSystem.IsWindows()) if (OperatingSystem.IsWindows())
{ {
// Windows: 使用 SlideToShutDown 滑动关机界面
_powerService.ShowNativePowerUI(PowerAction.Shutdown); _powerService.ShowNativePowerUI(PowerAction.Shutdown);
} }
else else
{ {
// Linux: 二次确认对话框
await ShowPowerConfirmDialogAsync(L("power.shutdown_confirm_title", "Shutdown"), await ShowPowerConfirmDialogAsync(L("power.shutdown_confirm_title", "Shutdown"),
L("power.shutdown_confirm_message", "Are you sure you want to shut down this computer?"), L("power.shutdown_confirm_message", "Are you sure you want to shut down this computer?"),
() => _powerService.ShutdownAsync()); () => _powerService.ShutdownAsync());
@@ -408,8 +406,6 @@ public partial class MainWindow
_ = e; _ = e;
ClosePopupIfOpen(); ClosePopupIfOpen();
// 所有平台:统一使用二次确认对话框
// Note: SlideToShutDown.exe 只支持关机,不支持重启
await ShowPowerConfirmDialogAsync(L("power.restart_confirm_title", "Restart"), await ShowPowerConfirmDialogAsync(L("power.restart_confirm_title", "Restart"),
L("power.restart_confirm_message", "Are you sure you want to restart this computer?"), L("power.restart_confirm_message", "Are you sure you want to restart this computer?"),
() => _powerService.RestartAsync()); () => _powerService.RestartAsync());
@@ -449,7 +445,7 @@ public partial class MainWindow
{ {
try try
{ {
var dialog = new ContentDialog var dialog = new FAContentDialog
{ {
Title = title, Title = title,
Content = message, Content = message,
@@ -458,7 +454,7 @@ public partial class MainWindow
}; };
var result = await dialog.ShowAsync(this); var result = await dialog.ShowAsync(this);
if (result == ContentDialogResult.Primary) if (result == FAContentDialogResult.Primary)
{ {
await action(); await action();
} }
@@ -744,49 +740,41 @@ public partial class MainWindow
} }
/// <summary> /// <summary>
/// 检测状态栏组件是否会发生碰撞 /// 濠碘槅鍋€閸嬫挻绻涢弶鎴剳濠殿喗鎮傞獮鈧ù锝呮贡閸╁绱撴担绋款仹婵炲棎鍨藉浼搭敍濮橆厼鍓ㄦ繛鏉戝悑閼规崘銇愰崒鐐村仺闁绘柧璀﹀楣冩煙? /// </summary>
/// </summary>
private bool WouldComponentsCollide() private bool WouldComponentsCollide()
{ {
if (TopStatusBarHost is null) if (TopStatusBarHost is null)
return false; return false;
// 获取各区域当前占用的宽度
var leftWidth = GetLeftPanelOccupiedWidth(); var leftWidth = GetLeftPanelOccupiedWidth();
var centerWidth = GetCenterPanelOccupiedWidth(); var centerWidth = GetCenterPanelOccupiedWidth();
var rightWidth = GetRightPanelOccupiedWidth(); var rightWidth = GetRightPanelOccupiedWidth();
// 获取状态栏总宽度
var totalWidth = TopStatusBarHost.Bounds.Width; var totalWidth = TopStatusBarHost.Bounds.Width;
if (totalWidth <= 0) if (totalWidth <= 0)
return false; return false;
// 计算中间区域的实际位置 // 闁荤姳绶ょ槐鏇㈡偩缂佹鈻旀い鎾卞灪閿涚喖鏌涢弽褎鎯堥柣鎾寸懇閹啴宕熼銈嗘緰闂傚倸瀚幊宥囩礊閸涱垳纾? // 閻庡綊娼荤粻鎴﹀垂椤忓牆鍙?*, 婵炴垶鎼╅崢濂稿垂椤忓牆鍙?Auto, 闂佸憡鐟ラ崯鍧楀垂椤忓牆鍙?*
// 左列是 *, 中列是 Auto, 右列是 * // 婵炴垶鎼╅崣鍐ㄎ涢崸妤€绀岄柛婵嗗閸樼敻鎮橀悙鍙夊櫢闁煎灚鍨垮浼村礈瑜嬫禒? var centerLeft = (totalWidth - centerWidth) / 2;
// 中间区域居中显示
var centerLeft = (totalWidth - centerWidth) / 2;
var centerRight = centerLeft + centerWidth; var centerRight = centerLeft + centerWidth;
// 安全间距(像素) // 闁诲海鎳撻ˇ顖炲矗韫囨稒鈷掔痪鎯ь儑閻涒晠鏌ㄥ☉妯煎闁稿孩姘ㄥΣ鎰版偑閸涱垳顦?
const double safetyMargin = 20; const double safetyMargin = 20;
// 检测左侧组件是否会与中间区域碰撞 // 濠碘槅鍋€閸嬫挻绻涢弶鎴剰濞戞柨绻戠粭鐔活槾缂侇喖绉电粋鎺楁嚋閸倣锕傛煕濮樺墽绱扮紒杈╁缁嬪鎯斿┑濠傚箑闂傚倸鍊瑰娆戜焊椤栫偛鏄ラ柣鏂捐濞奸箖鏌? // 閻庡綊娼荤紓姘跺疾閸撲胶纾奸柛鏇ㄤ簼椤愪粙鏌涘▎蹇曟瀮缂佹梻鍠栭幃?= leftWidth
// 左侧组件右边界 = leftWidth // 婵炴垶鎼╅崣鍐ㄎ涢崸妤€绀岄柛婵嗗閸樼數鈧綊娼荤粻鎺旂博閻斿吋鍋?= centerLeft
// 中间区域左边界 = centerLeft
if (leftWidth + safetyMargin > centerLeft) if (leftWidth + safetyMargin > centerLeft)
{ {
return true; return true;
} }
// 检测右侧组件是否会与中间区域碰撞 // 濠碘槅鍋€閸嬫挻绻涢弶鎴剰鐟滄澘鎲$粭鐔活槾缂侇喖绉电粋鎺楁嚋閸倣锕傛煕濮樺墽绱扮紒杈╁缁嬪鎯斿┑濠傚箑闂傚倸鍊瑰娆戜焊椤栫偛鏄ラ柣鏂捐濞奸箖鏌? // 闂佸憡鐟ラ崢鏍疾閸撲胶纾奸柛鏇ㄤ簼椤愮晫鈧綊娼荤粻鎺旂博閻斿吋鍋?= totalWidth - rightWidth
// 右侧组件左边界 = totalWidth - rightWidth // 婵炴垶鎼╅崣鍐ㄎ涢崸妤€绀岄柛婵嗗閸樼敻鏌涘▎蹇曟瀮缂佹梻鍠栭幃?= centerRight
// 中间区域右边界 = centerRight
if (totalWidth - rightWidth - safetyMargin < centerRight) if (totalWidth - rightWidth - safetyMargin < centerRight)
{ {
return true; return true;
} }
// 检测中间区域是否会与左右两侧碰撞(中间区域过宽)
if (centerLeft < leftWidth + safetyMargin || if (centerLeft < leftWidth + safetyMargin ||
centerRight > totalWidth - rightWidth - safetyMargin) centerRight > totalWidth - rightWidth - safetyMargin)
{ {
@@ -797,8 +785,7 @@ public partial class MainWindow
} }
/// <summary> /// <summary>
/// 获取左侧面板占用的宽度(包括间距) /// 闂佸吋鍎抽崲鑼躲亹閸パ屽晠闁挎梹瀵у▍鐘绘⒒閸稑鐏繝銏★耿瀹曪繝鎮╅崹顐f闂佹眹鍔岀€氼剟顢欓弮鈧幆鏃堟晜閼测晝顦╅梺鍛婄墪閹冲繒鈧凹鍙冨鑽ゅ鐎n剛宕洪梺? /// </summary>
/// </summary>
private double GetLeftPanelOccupiedWidth() private double GetLeftPanelOccupiedWidth()
{ {
if (TopStatusLeftPanel is null) if (TopStatusLeftPanel is null)
@@ -817,8 +804,7 @@ public partial class MainWindow
} }
} }
// 添加间距 // 濠电儑缍€椤曆勬叏閻愮儤鈷掔痪鎯ь儑閻? if (visibleCount > 1)
if (visibleCount > 1)
{ {
width += spacing * (visibleCount - 1); width += spacing * (visibleCount - 1);
} }
@@ -827,8 +813,7 @@ public partial class MainWindow
} }
/// <summary> /// <summary>
/// 获取中间面板占用的宽度(包括间距) /// 闂佸吋鍎抽崲鑼躲亹閸ャ劎鈻旀い鎾卞灪閿涚喖姊婚崼娑樼仾婵犮垺锕㈠畷锟犳偐閸偅娈㈤梺姹囧妼鐎氼剟顢欓弮鈧幆鏃堟晜閼测晝顦╅梺鍛婄墪閹冲繒鈧凹鍙冨鑽ゅ鐎n剛宕洪梺? /// </summary>
/// </summary>
private double GetCenterPanelOccupiedWidth() private double GetCenterPanelOccupiedWidth()
{ {
if (TopStatusCenterPanel is null) if (TopStatusCenterPanel is null)
@@ -847,8 +832,7 @@ public partial class MainWindow
} }
} }
// 添加间距 // 濠电儑缍€椤曆勬叏閻愮儤鈷掔痪鎯ь儑閻? if (visibleCount > 1)
if (visibleCount > 1)
{ {
width += spacing * (visibleCount - 1); width += spacing * (visibleCount - 1);
} }
@@ -857,8 +841,7 @@ public partial class MainWindow
} }
/// <summary> /// <summary>
/// 获取右侧面板占用的宽度(包括间距) /// 闂佸吋鍎抽崲鑼躲亹閸ヮ剙鐭楅柛蹇撴噺濞呯娀姊婚崼娑樼仾婵犮垺锕㈠畷锟犳偐閸偅娈㈤梺姹囧妼鐎氼剟顢欓弮鈧幆鏃堟晜閼测晝顦╅梺鍛婄墪閹冲繒鈧凹鍙冨鑽ゅ鐎n剛宕洪梺? /// </summary>
/// </summary>
private double GetRightPanelOccupiedWidth() private double GetRightPanelOccupiedWidth()
{ {
if (TopStatusRightPanel is null) if (TopStatusRightPanel is null)
@@ -877,8 +860,7 @@ public partial class MainWindow
} }
} }
// 添加间距 // 濠电儑缍€椤曆勬叏閻愮儤鈷掔痪鎯ь儑閻? if (visibleCount > 1)
if (visibleCount > 1)
{ {
width += spacing * (visibleCount - 1); width += spacing * (visibleCount - 1);
} }
@@ -887,25 +869,19 @@ public partial class MainWindow
} }
/// <summary> /// <summary>
/// 检查是否可以在指定位置添加组件 /// 濠碘槅鍋€閸嬫捇鏌$仦璇插姕婵″弶鎮傚畷銉╂晝閳ь剝銇愰崣澶岊浄闁靛鍎查煬顒勬煙缁嬫寧鎼愰柣锝囧亾閹峰懎顓奸崶鈺傜€┑鐑囩秬椤曆勬叏閻愮數纾奸柛鏇ㄤ簼椤? /// </summary>
/// </summary>
private bool CanAddComponentAtPosition(string position) private bool CanAddComponentAtPosition(string position)
{ {
// 先临时显示组件以计算宽度
var wouldCollide = WouldComponentsCollide(); var wouldCollide = WouldComponentsCollide();
if (!wouldCollide) if (!wouldCollide)
return true; return true;
// 如果会发生碰撞,检查是否是因为目标位置导致的
// 获取当前各区域宽度
var leftWidth = GetLeftPanelOccupiedWidth(); var leftWidth = GetLeftPanelOccupiedWidth();
var centerWidth = GetCenterPanelOccupiedWidth(); var centerWidth = GetCenterPanelOccupiedWidth();
var rightWidth = GetRightPanelOccupiedWidth(); var rightWidth = GetRightPanelOccupiedWidth();
// 估算新组件的宽度(基于当前单元格大小)
var estimatedNewComponentWidth = _currentDesktopCellSize > 0 ? _currentDesktopCellSize * 2 : 120; var estimatedNewComponentWidth = _currentDesktopCellSize > 0 ? _currentDesktopCellSize * 2 : 120;
// 根据目标位置检查添加后是否会碰撞
return position switch return position switch
{ {
"Left" => CanAddToLeft(leftWidth, centerWidth, rightWidth, estimatedNewComponentWidth), "Left" => CanAddToLeft(leftWidth, centerWidth, rightWidth, estimatedNewComponentWidth),
@@ -924,7 +900,7 @@ public partial class MainWindow
if (totalWidth <= 0) if (totalWidth <= 0)
return true; return true;
var newLeftWidth = leftWidth + newWidth + TopStatusLeftPanel?.Spacing ?? 6; var newLeftWidth = leftWidth + newWidth + (TopStatusLeftPanel?.Spacing ?? 6);
var centerLeft = (totalWidth - centerWidth) / 2; var centerLeft = (totalWidth - centerWidth) / 2;
const double safetyMargin = 20; const double safetyMargin = 20;
@@ -940,7 +916,7 @@ public partial class MainWindow
if (totalWidth <= 0) if (totalWidth <= 0)
return true; return true;
var newCenterWidth = centerWidth + newWidth + TopStatusCenterPanel?.Spacing ?? 6; var newCenterWidth = centerWidth + newWidth + (TopStatusCenterPanel?.Spacing ?? 6);
var centerLeft = (totalWidth - newCenterWidth) / 2; var centerLeft = (totalWidth - newCenterWidth) / 2;
var centerRight = centerLeft + newCenterWidth; var centerRight = centerLeft + newCenterWidth;
@@ -958,7 +934,7 @@ public partial class MainWindow
if (totalWidth <= 0) if (totalWidth <= 0)
return true; return true;
var newRightWidth = rightWidth + newWidth + TopStatusRightPanel?.Spacing ?? 6; var newRightWidth = rightWidth + newWidth + (TopStatusRightPanel?.Spacing ?? 6);
var centerRight = (totalWidth + centerWidth) / 2; var centerRight = (totalWidth + centerWidth) / 2;
const double safetyMargin = 20; const double safetyMargin = 20;
@@ -970,7 +946,6 @@ public partial class MainWindow
var showClock = _topStatusComponentIds.Contains(BuiltInComponentIds.Clock); var showClock = _topStatusComponentIds.Contains(BuiltInComponentIds.Clock);
var hasVisibleTopStatusComponent = false; var hasVisibleTopStatusComponent = false;
// 先隐藏所有时钟控件
if (ClockWidgetLeft is not null) if (ClockWidgetLeft is not null)
ClockWidgetLeft.IsVisible = false; ClockWidgetLeft.IsVisible = false;
if (ClockWidgetCenter is not null) if (ClockWidgetCenter is not null)
@@ -978,7 +953,6 @@ public partial class MainWindow
if (ClockWidgetRight is not null) if (ClockWidgetRight is not null)
ClockWidgetRight.IsVisible = false; ClockWidgetRight.IsVisible = false;
// 先隐藏所有文字胶囊控件
if (TextCapsuleWidgetLeft is not null) if (TextCapsuleWidgetLeft is not null)
TextCapsuleWidgetLeft.IsVisible = false; TextCapsuleWidgetLeft.IsVisible = false;
if (TextCapsuleWidgetCenter is not null) if (TextCapsuleWidgetCenter is not null)
@@ -986,7 +960,6 @@ public partial class MainWindow
if (TextCapsuleWidgetRight is not null) if (TextCapsuleWidgetRight is not null)
TextCapsuleWidgetRight.IsVisible = false; TextCapsuleWidgetRight.IsVisible = false;
// 先隐藏所有网速控件
if (NetworkSpeedWidgetLeft is not null) if (NetworkSpeedWidgetLeft is not null)
NetworkSpeedWidgetLeft.IsVisible = false; NetworkSpeedWidgetLeft.IsVisible = false;
if (NetworkSpeedWidgetCenter is not null) if (NetworkSpeedWidgetCenter is not null)
@@ -994,7 +967,6 @@ public partial class MainWindow
if (NetworkSpeedWidgetRight is not null) if (NetworkSpeedWidgetRight is not null)
NetworkSpeedWidgetRight.IsVisible = false; NetworkSpeedWidgetRight.IsVisible = false;
// 根据位置设置显示对应的时钟控件(带碰撞检测)
if (showClock) if (showClock)
{ {
var targetPosition = _clockPosition; var targetPosition = _clockPosition;
@@ -1019,7 +991,6 @@ public partial class MainWindow
} }
else else
{ {
// 如果目标位置无法添加,尝试其他位置
var alternativePosition = FindAlternativePosition(targetPosition); var alternativePosition = FindAlternativePosition(targetPosition);
if (alternativePosition is not null) if (alternativePosition is not null)
{ {
@@ -1041,8 +1012,7 @@ public partial class MainWindow
} }
} }
// 根据位置设置显示对应的文字胶囊控件(带碰撞检测) // 闂佸搫绉烽~澶婄暤娴h濯寸€广儱娲ㄩ弸鍌炴偣娴g鈷旈柣銈呮瀵即宕滆娴犳盯鎮楅悽鍨殌缂併劍鐓¢幆鍐礋椤掍胶鈧噣鎮楀☉娆樻畽闁稿繐鐭傚畷鑸电節閸愩劋绮繛瀵稿Ь椤旀劗妲愬▎鎴炴殰闁挎梻铏庡楣冩煙閸撗冧沪妞ゃ儱鎳庨湁閻庯絽澧庣粈? if (_showTextCapsule)
if (_showTextCapsule)
{ {
var targetPosition = _textCapsulePosition; var targetPosition = _textCapsulePosition;
var canAdd = CanAddComponentAtPosition(targetPosition); var canAdd = CanAddComponentAtPosition(targetPosition);
@@ -1066,7 +1036,6 @@ public partial class MainWindow
} }
else else
{ {
// 如果目标位置无法添加,尝试其他位置
var alternativePosition = FindAlternativePosition(targetPosition); var alternativePosition = FindAlternativePosition(targetPosition);
if (alternativePosition is not null) if (alternativePosition is not null)
{ {
@@ -1088,7 +1057,6 @@ public partial class MainWindow
} }
} }
// 根据位置设置显示对应的网速控件(带碰撞检测)
if (_showNetworkSpeed) if (_showNetworkSpeed)
{ {
var targetPosition = _networkSpeedPosition; var targetPosition = _networkSpeedPosition;
@@ -1113,7 +1081,6 @@ public partial class MainWindow
} }
else else
{ {
// 如果目标位置无法添加,尝试其他位置
var alternativePosition = FindAlternativePosition(targetPosition); var alternativePosition = FindAlternativePosition(targetPosition);
if (alternativePosition is not null) if (alternativePosition is not null)
{ {
@@ -1140,7 +1107,6 @@ public partial class MainWindow
TopStatusBarHost.IsVisible = hasVisibleTopStatusComponent; TopStatusBarHost.IsVisible = hasVisibleTopStatusComponent;
} }
// 延迟检查碰撞并调整
Dispatcher.UIThread.Post(async () => Dispatcher.UIThread.Post(async () =>
{ {
await System.Threading.Tasks.Task.Delay(50); await System.Threading.Tasks.Task.Delay(50);
@@ -1149,22 +1115,18 @@ public partial class MainWindow
} }
/// <summary> /// <summary>
/// 当组件发生碰撞时,自动调整位置 /// 閻熸粎澧楅幐鍓у垝瀹ュ棛顩烽悹鍝勬惈缁叉椽鏌i姀銏犳灁妞ゎ偒鍋婇獮姗€鎮欑€涙﹩妲梺鎸庣☉閻線宕靛鍫濈闁靛鍔庡▓鍫曟煛娴h櫣绡€缂傚秴鎳愮槐? /// </summary>
/// </summary>
private void AdjustComponentsIfColliding() private void AdjustComponentsIfColliding()
{ {
if (!WouldComponentsCollide()) if (!WouldComponentsCollide())
return; return;
// 获取当前可见的组件
var leftComponents = GetVisibleLeftComponents(); var leftComponents = GetVisibleLeftComponents();
var centerComponents = GetVisibleCenterComponents(); var centerComponents = GetVisibleCenterComponents();
var rightComponents = GetVisibleRightComponents(); var rightComponents = GetVisibleRightComponents();
// 优先保留时钟,调整文字胶囊位置
if (TextCapsuleWidgetLeft?.IsVisible == true && WouldComponentsCollide()) if (TextCapsuleWidgetLeft?.IsVisible == true && WouldComponentsCollide())
{ {
// 尝试将左侧文字胶囊移到中间
if (CanAddComponentAtPosition("Center")) if (CanAddComponentAtPosition("Center"))
{ {
TextCapsuleWidgetLeft.IsVisible = false; TextCapsuleWidgetLeft.IsVisible = false;
@@ -1172,7 +1134,6 @@ public partial class MainWindow
TextCapsuleWidgetCenter.SetTransparentBackground(_textCapsuleTransparentBackground); TextCapsuleWidgetCenter.SetTransparentBackground(_textCapsuleTransparentBackground);
TextCapsuleWidgetCenter.SetText(_textCapsuleContent); TextCapsuleWidgetCenter.SetText(_textCapsuleContent);
} }
// 或者移到右侧
else if (CanAddComponentAtPosition("Right")) else if (CanAddComponentAtPosition("Right"))
{ {
TextCapsuleWidgetLeft.IsVisible = false; TextCapsuleWidgetLeft.IsVisible = false;
@@ -1180,7 +1141,6 @@ public partial class MainWindow
TextCapsuleWidgetRight.SetTransparentBackground(_textCapsuleTransparentBackground); TextCapsuleWidgetRight.SetTransparentBackground(_textCapsuleTransparentBackground);
TextCapsuleWidgetRight.SetText(_textCapsuleContent); TextCapsuleWidgetRight.SetText(_textCapsuleContent);
} }
// 如果都无法添加,则隐藏文字胶囊
else else
{ {
TextCapsuleWidgetLeft.IsVisible = false; TextCapsuleWidgetLeft.IsVisible = false;
@@ -1189,7 +1149,6 @@ public partial class MainWindow
if (TextCapsuleWidgetRight?.IsVisible == true && WouldComponentsCollide()) if (TextCapsuleWidgetRight?.IsVisible == true && WouldComponentsCollide())
{ {
// 尝试将右侧文字胶囊移到中间
if (CanAddComponentAtPosition("Center")) if (CanAddComponentAtPosition("Center"))
{ {
TextCapsuleWidgetRight.IsVisible = false; TextCapsuleWidgetRight.IsVisible = false;
@@ -1197,7 +1156,6 @@ public partial class MainWindow
TextCapsuleWidgetCenter.SetTransparentBackground(_textCapsuleTransparentBackground); TextCapsuleWidgetCenter.SetTransparentBackground(_textCapsuleTransparentBackground);
TextCapsuleWidgetCenter.SetText(_textCapsuleContent); TextCapsuleWidgetCenter.SetText(_textCapsuleContent);
} }
// 或者移到左侧
else if (CanAddComponentAtPosition("Left")) else if (CanAddComponentAtPosition("Left"))
{ {
TextCapsuleWidgetRight.IsVisible = false; TextCapsuleWidgetRight.IsVisible = false;
@@ -1205,7 +1163,6 @@ public partial class MainWindow
TextCapsuleWidgetLeft.SetTransparentBackground(_textCapsuleTransparentBackground); TextCapsuleWidgetLeft.SetTransparentBackground(_textCapsuleTransparentBackground);
TextCapsuleWidgetLeft.SetText(_textCapsuleContent); TextCapsuleWidgetLeft.SetText(_textCapsuleContent);
} }
// 如果都无法添加,则隐藏文字胶囊
else else
{ {
TextCapsuleWidgetRight.IsVisible = false; TextCapsuleWidgetRight.IsVisible = false;
@@ -1214,7 +1171,6 @@ public partial class MainWindow
if (TextCapsuleWidgetCenter?.IsVisible == true && WouldComponentsCollide()) if (TextCapsuleWidgetCenter?.IsVisible == true && WouldComponentsCollide())
{ {
// 尝试将中间文字胶囊移到左侧
if (CanAddComponentAtPosition("Left")) if (CanAddComponentAtPosition("Left"))
{ {
TextCapsuleWidgetCenter.IsVisible = false; TextCapsuleWidgetCenter.IsVisible = false;
@@ -1222,7 +1178,6 @@ public partial class MainWindow
TextCapsuleWidgetLeft.SetTransparentBackground(_textCapsuleTransparentBackground); TextCapsuleWidgetLeft.SetTransparentBackground(_textCapsuleTransparentBackground);
TextCapsuleWidgetLeft.SetText(_textCapsuleContent); TextCapsuleWidgetLeft.SetText(_textCapsuleContent);
} }
// 或者移到右侧
else if (CanAddComponentAtPosition("Right")) else if (CanAddComponentAtPosition("Right"))
{ {
TextCapsuleWidgetCenter.IsVisible = false; TextCapsuleWidgetCenter.IsVisible = false;
@@ -1230,17 +1185,14 @@ public partial class MainWindow
TextCapsuleWidgetRight.SetTransparentBackground(_textCapsuleTransparentBackground); TextCapsuleWidgetRight.SetTransparentBackground(_textCapsuleTransparentBackground);
TextCapsuleWidgetRight.SetText(_textCapsuleContent); TextCapsuleWidgetRight.SetText(_textCapsuleContent);
} }
// 如果都无法添加,则隐藏文字胶囊
else else
{ {
TextCapsuleWidgetCenter.IsVisible = false; TextCapsuleWidgetCenter.IsVisible = false;
} }
} }
// 调整网速组件位置(优先级:时钟 > 文字胶囊 > 网速)
if (NetworkSpeedWidgetLeft?.IsVisible == true && WouldComponentsCollide()) if (NetworkSpeedWidgetLeft?.IsVisible == true && WouldComponentsCollide())
{ {
// 尝试将左侧网速移到中间
if (CanAddComponentAtPosition("Center")) if (CanAddComponentAtPosition("Center"))
{ {
NetworkSpeedWidgetLeft.IsVisible = false; NetworkSpeedWidgetLeft.IsVisible = false;
@@ -1248,7 +1200,6 @@ public partial class MainWindow
NetworkSpeedWidgetCenter.SetTransparentBackground(_networkSpeedTransparentBackground); NetworkSpeedWidgetCenter.SetTransparentBackground(_networkSpeedTransparentBackground);
NetworkSpeedWidgetCenter.SetDisplayMode(_networkSpeedDisplayMode); NetworkSpeedWidgetCenter.SetDisplayMode(_networkSpeedDisplayMode);
} }
// 或者移到右侧
else if (CanAddComponentAtPosition("Right")) else if (CanAddComponentAtPosition("Right"))
{ {
NetworkSpeedWidgetLeft.IsVisible = false; NetworkSpeedWidgetLeft.IsVisible = false;
@@ -1256,7 +1207,6 @@ public partial class MainWindow
NetworkSpeedWidgetRight.SetTransparentBackground(_networkSpeedTransparentBackground); NetworkSpeedWidgetRight.SetTransparentBackground(_networkSpeedTransparentBackground);
NetworkSpeedWidgetRight.SetDisplayMode(_networkSpeedDisplayMode); NetworkSpeedWidgetRight.SetDisplayMode(_networkSpeedDisplayMode);
} }
// 如果都无法添加,则隐藏网速
else else
{ {
NetworkSpeedWidgetLeft.IsVisible = false; NetworkSpeedWidgetLeft.IsVisible = false;
@@ -1265,7 +1215,6 @@ public partial class MainWindow
if (NetworkSpeedWidgetRight?.IsVisible == true && WouldComponentsCollide()) if (NetworkSpeedWidgetRight?.IsVisible == true && WouldComponentsCollide())
{ {
// 尝试将右侧网速移到中间
if (CanAddComponentAtPosition("Center")) if (CanAddComponentAtPosition("Center"))
{ {
NetworkSpeedWidgetRight.IsVisible = false; NetworkSpeedWidgetRight.IsVisible = false;
@@ -1273,7 +1222,6 @@ public partial class MainWindow
NetworkSpeedWidgetCenter.SetTransparentBackground(_networkSpeedTransparentBackground); NetworkSpeedWidgetCenter.SetTransparentBackground(_networkSpeedTransparentBackground);
NetworkSpeedWidgetCenter.SetDisplayMode(_networkSpeedDisplayMode); NetworkSpeedWidgetCenter.SetDisplayMode(_networkSpeedDisplayMode);
} }
// 或者移到左侧
else if (CanAddComponentAtPosition("Left")) else if (CanAddComponentAtPosition("Left"))
{ {
NetworkSpeedWidgetRight.IsVisible = false; NetworkSpeedWidgetRight.IsVisible = false;
@@ -1281,7 +1229,6 @@ public partial class MainWindow
NetworkSpeedWidgetLeft.SetTransparentBackground(_networkSpeedTransparentBackground); NetworkSpeedWidgetLeft.SetTransparentBackground(_networkSpeedTransparentBackground);
NetworkSpeedWidgetLeft.SetDisplayMode(_networkSpeedDisplayMode); NetworkSpeedWidgetLeft.SetDisplayMode(_networkSpeedDisplayMode);
} }
// 如果都无法添加,则隐藏网速
else else
{ {
NetworkSpeedWidgetRight.IsVisible = false; NetworkSpeedWidgetRight.IsVisible = false;
@@ -1290,7 +1237,6 @@ public partial class MainWindow
if (NetworkSpeedWidgetCenter?.IsVisible == true && WouldComponentsCollide()) if (NetworkSpeedWidgetCenter?.IsVisible == true && WouldComponentsCollide())
{ {
// 尝试将中间网速移到左侧
if (CanAddComponentAtPosition("Left")) if (CanAddComponentAtPosition("Left"))
{ {
NetworkSpeedWidgetCenter.IsVisible = false; NetworkSpeedWidgetCenter.IsVisible = false;
@@ -1298,7 +1244,6 @@ public partial class MainWindow
NetworkSpeedWidgetLeft.SetTransparentBackground(_networkSpeedTransparentBackground); NetworkSpeedWidgetLeft.SetTransparentBackground(_networkSpeedTransparentBackground);
NetworkSpeedWidgetLeft.SetDisplayMode(_networkSpeedDisplayMode); NetworkSpeedWidgetLeft.SetDisplayMode(_networkSpeedDisplayMode);
} }
// 或者移到右侧
else if (CanAddComponentAtPosition("Right")) else if (CanAddComponentAtPosition("Right"))
{ {
NetworkSpeedWidgetCenter.IsVisible = false; NetworkSpeedWidgetCenter.IsVisible = false;
@@ -1306,7 +1251,6 @@ public partial class MainWindow
NetworkSpeedWidgetRight.SetTransparentBackground(_networkSpeedTransparentBackground); NetworkSpeedWidgetRight.SetTransparentBackground(_networkSpeedTransparentBackground);
NetworkSpeedWidgetRight.SetDisplayMode(_networkSpeedDisplayMode); NetworkSpeedWidgetRight.SetDisplayMode(_networkSpeedDisplayMode);
} }
// 如果都无法添加,则隐藏网速
else else
{ {
NetworkSpeedWidgetCenter.IsVisible = false; NetworkSpeedWidgetCenter.IsVisible = false;
@@ -1315,12 +1259,10 @@ public partial class MainWindow
} }
/// <summary> /// <summary>
/// 查找可用的替代位置 /// 闂佸搫琚崕鍙夌珶濮椻偓瀹曪綁顢涘鍕闂佹眹鍔岀€氼厼霉濞戞瑧顩烽柨婵嗗缁夊绱? /// </summary>
/// </summary>
private string? FindAlternativePosition(string originalPosition) private string? FindAlternativePosition(string originalPosition)
{ {
// 尝试所有可能的位置 // 闁诲繐绻戠换鍡涙儊椤栫偛绠ラ柍褜鍓熷鍨緞婵犲倽顔夐梺鐓庣-閺咁偄鈻撻幋鐐村鐎广儱娲ㄩ弸? var positions = new[] { "Left", "Center", "Right" };
var positions = new[] { "Left", "Center", "Right" };
foreach (var position in positions) foreach (var position in positions)
{ {
if (position != originalPosition && CanAddComponentAtPosition(position)) if (position != originalPosition && CanAddComponentAtPosition(position))
@@ -1332,8 +1274,7 @@ public partial class MainWindow
} }
/// <summary> /// <summary>
/// 获取左侧可见组件列表 /// 闂佸吋鍎抽崲鑼躲亹閸パ屽晠闁挎梹瀵у▍鐘绘煕濞嗘ê鐏ユい顐㈡缁辨帡宕熼鍜佸仺闂佸憡甯楅〃澶愬Υ? /// </summary>
/// </summary>
private List<Control> GetVisibleLeftComponents() private List<Control> GetVisibleLeftComponents()
{ {
var result = new List<Control>(); var result = new List<Control>();
@@ -1348,8 +1289,7 @@ public partial class MainWindow
} }
/// <summary> /// <summary>
/// 获取中间可见组件列表 /// 闂佸吋鍎抽崲鑼躲亹閸ャ劎鈻旀い鎾卞灪閿涚喖鏌涘▎妯虹仴妞ゎ偄妫涚槐鎺楀礋椤忓拋鍋ㄩ梺鍛婂笚椤ㄥ濡? /// </summary>
/// </summary>
private List<Control> GetVisibleCenterComponents() private List<Control> GetVisibleCenterComponents()
{ {
var result = new List<Control>(); var result = new List<Control>();
@@ -1364,8 +1304,7 @@ public partial class MainWindow
} }
/// <summary> /// <summary>
/// 获取右侧可见组件列表 /// 闂佸吋鍎抽崲鑼躲亹閸ヮ剙鐭楅柛蹇撴噺濞呯娀鏌涘▎妯虹仴妞ゎ偄妫涚槐鎺楀礋椤忓拋鍋ㄩ梺鍛婂笚椤ㄥ濡? /// </summary>
/// </summary>
private List<Control> GetVisibleRightComponents() private List<Control> GetVisibleRightComponents()
{ {
var result = new List<Control>(); var result = new List<Control>();
@@ -1833,17 +1772,17 @@ public partial class MainWindow
return; return;
} }
var dialog = new ContentDialog var dialog = new FAContentDialog
{ {
Title = L("desktop.delete_page_confirm.title", "确认删除页面"), Title = L("desktop.delete_page_confirm.title", "Delete desktop page"),
Content = L("desktop.delete_page_confirm.message", "确定要删除当前页面吗?\n\n此操作将删除当前页面上的所有组件且无法撤销。"), Content = L("desktop.delete_page_confirm.message", "This will permanently remove the current desktop page and all widgets placed on it.\n\nThis action cannot be undone."),
PrimaryButtonText = L("desktop.delete_page_confirm.close", "取消"), PrimaryButtonText = L("desktop.delete_page_confirm.close", "Cancel"),
SecondaryButtonText = L("desktop.delete_page_confirm.primary", "删除"), SecondaryButtonText = L("desktop.delete_page_confirm.primary", "Delete"),
DefaultButton = ContentDialogButton.Primary DefaultButton = FAContentDialogButton.Primary
}; };
var result = await dialog.ShowAsync(this); var result = await dialog.ShowAsync(this);
if (result == ContentDialogResult.Secondary) if (result == FAContentDialogResult.Secondary)
{ {
DeleteCurrentDesktopPage(); DeleteCurrentDesktopPage();
} }
@@ -3938,7 +3877,7 @@ public partial class MainWindow
} }
var point = e.GetPosition(ComponentLibraryWindow); var point = e.GetPosition(ComponentLibraryWindow);
if (point.Y > 40) // 閺嶅洭顣介弽蹇涚彯鎼达妇瀹虫稉?0px if (point.Y > 40) // 闂傚倷绀侀幖顐ょ矓閺夋嚚娲敇椤兘鍋撻崒娑氼浄閻庯綆浜滈崬銊╂椤愩垺澶勭紒瀣崄閵囨劙顢涢悙鑼啇闁哄鐗婇崕鎶姐€呴鍕€电痪顓炴噺閻濐亞绱?0px
{ {
return; return;
} }

View File

@@ -75,8 +75,7 @@ public partial class MainWindow
private int? _desktopPageContextSettlingTargetIndex; private int? _desktopPageContextSettlingTargetIndex;
private int _desktopPageContextSettleRevision; private int _desktopPageContextSettleRevision;
// 三指滑动/右键拖动相关 // 婵犵數鍋為崹鍫曞箰閹间絸鍥箥椤旂懓浜鹃柛顭戝亯婢规ɑ銇勯婊冨妤犵偛顑呴埞鎴﹀窗?闂傚倷绀侀幉锟犳偡閿旂晫绠惧┑鐘叉搐閺嬩焦銇勯幘鍗炵仼缂佺媭鍨堕弻鈥崇暤椤旂厧鏁俊銈呮噺閻撶喖鏌嶉崫鍕灓闁绘帡绠栭弻? private bool _isThreeFingerOrRightDragSwipeActive;
private bool _isThreeFingerOrRightDragSwipeActive;
private readonly HashSet<int> _activePointerIds = []; private readonly HashSet<int> _activePointerIds = [];
private int LauncherSurfaceIndex => Math.Max(MinDesktopPageCount, _desktopPageCount); private int LauncherSurfaceIndex => Math.Max(MinDesktopPageCount, _desktopPageCount);
@@ -264,7 +263,6 @@ public partial class MainWindow
Grid.SetColumn(LauncherPagePanel, 1); Grid.SetColumn(LauncherPagePanel, 1);
Grid.SetRow(LauncherPagePanel, 0); Grid.SetRow(LauncherPagePanel, 0);
// 为启动台添加安全边距以确保圆角不被裁剪
var launcherMargin = Math.Clamp(gridMetrics.CellSize * 0.15, 6, 16); var launcherMargin = Math.Clamp(gridMetrics.CellSize * 0.15, 6, 16);
LauncherPagePanel.Margin = new Thickness(launcherMargin); LauncherPagePanel.Margin = new Thickness(launcherMargin);
LauncherPagePanel.Width = Math.Max(1, pageWidth - launcherMargin * 2); LauncherPagePanel.Width = Math.Max(1, pageWidth - launcherMargin * 2);
@@ -272,7 +270,7 @@ public partial class MainWindow
LauncherPagePanel.MaxWidth = pageWidth - launcherMargin * 2; LauncherPagePanel.MaxWidth = pageWidth - launcherMargin * 2;
LauncherPagePanel.MaxHeight = pageHeight - launcherMargin * 2; LauncherPagePanel.MaxHeight = pageHeight - launcherMargin * 2;
// 更新启动台图标布局 // 闂傚倷绀侀幖顐⒚洪妶澶嬪仱闁靛ň鏅涢拑鐔封攽閻樺弶鎼愰悷娆欓檮閵囧嫰寮介妸銊ヮ棟閻炴氨鍠栧娲川婵犲嫭鍣┑鐘灪閿氶棁澶嬫叏濡炶浜鹃悗娈垮枙缁瑥鐣烽幆閭︽Ь濡炪倕绻戦幐鎶藉箖濮椻偓閹瑩鍩℃担宄邦棜
UpdateLauncherTileLayout(); UpdateLauncherTileLayout();
_desktopSurfacePageWidth = pageWidth; _desktopSurfacePageWidth = pageWidth;
@@ -287,39 +285,29 @@ public partial class MainWindow
return; return;
} }
// 获取启动台面板的实际可用宽度减去Padding
var availableWidth = Math.Max(1, LauncherPagePanel.Bounds.Width - 36); // 18px padding on each side var availableWidth = Math.Max(1, LauncherPagePanel.Bounds.Width - 36); // 18px padding on each side
var availableHeight = Math.Max(1, LauncherPagePanel.Bounds.Height - 100); // 预留标题空间 var availableHeight = Math.Max(1, LauncherPagePanel.Bounds.Height - 100); // 婵犵妲呴崑鍛熆濡皷鍋撳鐓庢珝鐎殿喗濞婇崺鈧い鎺戝閻撴稓鈧箍鍎遍幊蹇涘窗濡眹浜滈柨婵嗘处濞呮洜绱掗鍊熷閻撱倖銇勮箛鎾村珔缂?
if (availableWidth <= 1 || availableHeight <= 1) if (availableWidth <= 1 || availableHeight <= 1)
{ {
// 如果尺寸还未计算,使用默认值 // 婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掆偓缂嶅﹪骞冨Ο璇茬窞閻忕偠鍋愰崜銊╂⒑閸涘﹦绠撻悗姘卞厴瀹曠敻鎮㈤悡搴i獓闂佸啿鎼导鎺楀箣濠垫捁鈧寧銇勯幘璺盒e┑顖氥偢閺屻劌鈽夊Ο渚紑闂佸搫妫崜鐔煎蓟閵娿儮妲堟俊顖欒濞堫厽绻濋悽闈涗粶婵炲樊鍙冮獮鍐╃鐎n€晠鏌嶉崫鍕殭缂佹绻濋弻锝夋偐闁秵顎栭梺绋匡攻濞茬喖宕洪埀? availableWidth = 600;
availableWidth = 600;
availableHeight = 400; availableHeight = 400;
} }
// 计算最佳图标尺寸 // 闂備浇宕垫慨宕囨閵堝洦顫曢柡鍥ュ灪閸嬧晛鈹戦悩瀹犲閻庢艾顦甸弻宥堫檨闁告挻宀搁獮蹇涘川閺夋垹顦ㄩ梺鍛婄懃椤﹂亶銆呴銏♀拺闁告繂瀚瓭濠电偛鐪伴崐婵嗩嚕娴兼潙纾兼繝褎鍎虫禍? // 闂傚倷鑳堕崕鐢稿疾閳哄懎绐楁俊銈呮噺閸嬪鏌ㄥ┑鍡╂Ч闁哄拋鍓氶幈銊ヮ潨閸℃绠诲┑鈥崇湴閸旀垿骞冪捄琛℃婵☆垳绮幏鍗炩攽閳藉棗鐏犳い锕佷含閸?-8婵犵數鍋為崹鍫曞箹閳哄倻顩叉繝濠傚幘閻熼偊娼ㄩ柍褜鍓欓锝嗙鐎亞鍊炴俊鐐差儏濞寸兘藝椤曗偓濮婃椽宕崟顓夈儲銇勯銏╂Ц闁伙絽鐏氶幏鍛姜閻楀牆濯伴梻濠庡亜濞诧箓骞愭ィ鍐炬晩閹兼番鍔嶉崐鐢电棯椤撶偞鍣烘い銉ヮ樀閹鎮烽幍顕嗙礊闂佺懓顨庨崑濠傜暦濮椻偓閸╋繝宕掑☉鍗炴櫔
// 目标每行显示4-8个图标根据屏幕宽度调整
const int minColumns = 4; const int minColumns = 4;
const int maxColumns = 8; const int maxColumns = 8;
const double targetAspectRatio = 1.2; // 图标宽高比 const double targetAspectRatio = 1.2; // 闂傚倷鐒﹂幃鍫曞磿閹惰棄纾婚柟鍓х帛閸嬪鏌ㄥ┑鍡樼闁稿鎹囬弻鍛槈濮樿京鍘梻浣虹帛缁诲秹宕伴弽顒夋毎?
// 计算每列可以显示的图标数量
var optimalColumnCount = Math.Clamp((int)Math.Floor(availableWidth / 120), minColumns, maxColumns); var optimalColumnCount = Math.Clamp((int)Math.Floor(availableWidth / 120), minColumns, maxColumns);
// 根据列数计算图标尺寸
var tileWidth = Math.Floor(availableWidth / optimalColumnCount) - 12; // 12px spacing var tileWidth = Math.Floor(availableWidth / optimalColumnCount) - 12; // 12px spacing
var tileHeight = Math.Min(tileWidth / targetAspectRatio, availableHeight / 4); // 至少显示4行 var tileHeight = Math.Min(tileWidth / targetAspectRatio, availableHeight / 4); // 闂傚倷鑳堕崢褔宕查弻銉ョ柈闁秆勵殕閸庡秵銇勯弽顐粶闁告瑥锕弻娑㈠箻濡炵偓顦风紒?闂?
// 缂傚倷鑳堕搹搴ㄥ矗鎼淬劌绐楅柡鍥╁У瀹曞弶鎱ㄥΟ鎸庣【閻庢艾顦甸弻宥堫檨闁告挻绋掔粋宥咁潰瀹€鈧悿鈧梺瑙勫劤閻°劑锝為崨瀛樼厽? tileWidth = Math.Max(tileWidth, 100);
// 确保最小尺寸
tileWidth = Math.Max(tileWidth, 100);
tileHeight = Math.Max(tileHeight, 80); tileHeight = Math.Max(tileHeight, 80);
// 更新WrapPanel的Item尺寸 // 闂傚倷绀侀幖顐⒚洪妶澶嬪仱闁靛ň鏅涢拑鐔封攽閸屻倖杈渁pPanel闂傚倷鐒﹂惇褰掑礉瀹€鍕惞婵帞妫渕闂備浇顕х换鎰崲閹版澘绠规い鎰跺瘜閺? LauncherRootTilePanel.Width = availableWidth;
LauncherRootTilePanel.Width = availableWidth;
// 更新所有子元素的尺寸 // 闂傚倷绀侀幖顐⒚洪妶澶嬪仱闁靛ň鏅涢拑鐔封攽閻樺弶鎼愮紒鐘劦閺屽秷顧侀柛鎾跺枎椤曪綁宕归銏㈢獮婵犵數濮寸€氼參骞夐妶澶嬧拺缂佸娉曠粻浼存煕閻旂顥嬬紒顔肩墕閻f繈宕熼鈧崜顓㈡⒑閸涘﹥澶勯柛瀣噹鍗遍柍褜鍓熼弻? foreach (var child in LauncherRootTilePanel.Children)
foreach (var child in LauncherRootTilePanel.Children)
{ {
if (child is Button button) if (child is Button button)
{ {
@@ -487,7 +475,7 @@ public partial class MainWindow
return; return;
} }
// 如果在组件编辑模式下点击空白区域,取消选中(组件或启动台图标) // 婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掆偓缂嶅﹪骞冨Ο璇茬窞闁归偊鍓氬畵宥夋⒑闂堟丹娑㈠川椤栨粌甯掓繝鐢靛仜椤曨厽鎱ㄧ€涙ɑ娅犻幖杈剧稻椤洘銇勮箛鎾村櫤缂傚秴娲弻鐔衡偓鐢告櫜鏉╃懓霉閿濆懎顥忛柛銈嗘礋閻擃偊宕惰閹癸綁鏌i悢鍛婂磳闁哄矉缍侀獮鍥敊閽樺鐣梻浣规偠閸娿倝宕板鍗炲灊婵鍩栭幆鐐烘偡濞嗗繐顏村ù鐘讳憾濮婃椽宕ㄦ繝鍕吂闂佸湱鈷堥崑濠囧箖閳ユ枼鏋庨柟鎯х摠濞呮牠鏌h箛鏇炰哗婵☆偄瀚濠囧箰鎼达絿顔曢梺鐟扮摠缁诲嫭鏅堕敃鍌涚厓鐟滄粓宕滃▎鎾嶅洭顢氶埀顒勫箠濞嗘挸绠i柨鏃囧Г濞呮牠姊洪崜鎻掍簴闁搞劌顭烽幆宀€鈧綆鈧垹缍婇幃鈺呭传閸曨厼甯块梻浣规偠閸斿﹪宕濋幋婵堟殾闁靛鏅╅弫宥嗘叏濮楀棗鍔俊銈呮噺閻撴洘绻涢崱妯哄缂佽泛寮剁换娑氣偓娑欙公閼拌法鈧鍠曠划娆忕暦閼告妲归幖杈剧秵濡?
if (_isComponentLibraryOpen && if (_isComponentLibraryOpen &&
(_selectedDesktopComponentHost is not null || _selectedLauncherTileButton is not null)) (_selectedDesktopComponentHost is not null || _selectedLauncherTileButton is not null))
{ {
@@ -504,7 +492,6 @@ public partial class MainWindow
return; return;
} }
// 检查三指滑动功能是否启用
var appSnapshot = _settingsFacade.Settings.LoadSnapshot<AppSettingsSnapshot>(SettingsScope.App); var appSnapshot = _settingsFacade.Settings.LoadSnapshot<AppSettingsSnapshot>(SettingsScope.App);
var isThreeFingerSwipeEnabled = appSnapshot.EnableThreeFingerSwipe; var isThreeFingerSwipeEnabled = appSnapshot.EnableThreeFingerSwipe;
@@ -513,23 +500,20 @@ public partial class MainWindow
var isRightButtonPressed = currentPoint.Properties.IsRightButtonPressed; var isRightButtonPressed = currentPoint.Properties.IsRightButtonPressed;
var isLeftButtonPressed = currentPoint.Properties.IsLeftButtonPressed; var isLeftButtonPressed = currentPoint.Properties.IsLeftButtonPressed;
// 处理三指滑动/右键拖动模式 // 婵犵數濮伴崹鐓庘枖濞戞埃鍋撳鐓庢珝妤犵偛鍟换婵嬪礃椤忎焦鐏冨┑鐘灱濞夋盯顢栭崨瀛樺剨閻熸瑥瀚弧鈧繝鐢靛Т閸燁偊鎮橀妷銉㈡斀?闂傚倷绀侀幉锟犳偡閿旂晫绠惧┑鐘叉搐閺嬩焦銇勯幘鍗炵仼缂佺媭鍨堕弻鈥崇暤椤旂厧鏁俊銈勬缁诲棙銇勯弽銊d粶闁稿鎸搁悾鐑藉炊閳哄﹥鏁?
if (isThreeFingerSwipeEnabled) if (isThreeFingerSwipeEnabled)
{ {
// 跟踪活跃指针
if (isLeftButtonPressed || isRightButtonPressed) if (isLeftButtonPressed || isRightButtonPressed)
{ {
_activePointerIds.Add(pointerId); _activePointerIds.Add(pointerId);
} }
// 判断是否是三指滑动或右键拖动
var isThreeFinger = _activePointerIds.Count >= 3; var isThreeFinger = _activePointerIds.Count >= 3;
var isRightDrag = isRightButtonPressed; var isRightDrag = isRightButtonPressed;
if (isThreeFinger || isRightDrag) if (isThreeFinger || isRightDrag)
{ {
// 三指/右键拖动模式:跳过所有组件交互检查,直接开始滑动 // 婵犵數鍋為崹鍫曞箰閹间絸鍥箥椤旂懓浜?闂傚倷绀侀幉锟犳偡閿旂晫绠惧┑鐘叉搐閺嬩焦銇勯幘鍗炵仼缂佺媭鍨堕弻鈥崇暤椤旂厧鏁俊銈勬缁诲棙銇勯弽銊d粶闁稿鎸搁悾鐑藉炊閳哄﹥鏁ら梻鍌欑劍鐎笛呯矙閹烘挾鈹嶆繛宸簼閸婂鏌ㄩ弮鍥撳ù婧垮€濋弻娑㈠Ψ閿濆懎顬堝銈忕稻閻擄繝寮婚敓鐘查唶婵犲灚鍔栨缂傚倷绶¢崰鏍矓閻㈢數鐭夐柟鐑橆殔鐎氬鏌涢…鎴濅簻闁衡偓椤撶喓绠鹃悗娑欘焽閻鎮介娑辨疁閽樼喖鏌涘☉娆愮稇闁藉啰鍠栭弻鏇熷緞濡櫣浠紓浣插亾濠㈣埖鍔栭悡鐔兼煃鏉炴媽鍏岄柟鐣屽█閹粙顢涘☉娆戠▏濡炪倖娲╃紞渚€宕洪埀顒併亜閹哄秶鍔嶉柛娆忕箻閹鏁愭惔鈥茬敖闂佽鐏氶崝鎴﹀蓟? ClearDesktopPageContextSettle(refreshContext: false);
ClearDesktopPageContextSettle(refreshContext: false);
_isThreeFingerOrRightDragSwipeActive = true; _isThreeFingerOrRightDragSwipeActive = true;
_isDesktopSwipeActive = true; _isDesktopSwipeActive = true;
_isDesktopSwipeDirectionLocked = false; _isDesktopSwipeDirectionLocked = false;
@@ -540,14 +524,12 @@ public partial class MainWindow
_desktopSwipeLastTimestamp = Stopwatch.GetTimestamp(); _desktopSwipeLastTimestamp = Stopwatch.GetTimestamp();
_desktopSwipeBaseOffset = -_currentDesktopSurfaceIndex * _desktopSurfacePageWidth; _desktopSwipeBaseOffset = -_currentDesktopSurfaceIndex * _desktopSurfacePageWidth;
// 标记事件已处理,防止组件响应 // 闂傚倷绀侀幖顐ょ矓閺夋嚚娲煛閸滀焦鏅╅梺鎼炲劘閸斿酣銆呴弻銉﹀€甸柨婵嗗€瑰▍鍡樸亜閹邦喗娅曢柍褜鍓涢幊鎾诲箟闄囬妵鎰板礃椤斻垹娲崺锟犲川椤旈棿鍝楅梻浣虹《濡插懘宕㈤崜褏鐭嗗鑸靛姈閳锋帡鏌涢幇鈺佸缂佺嫏鍕╀簻闁圭儤鎸鹃妴鎺旂磼鏉堛劌娴€规洜鍠栭、鏃堝椽娴i晲缂撻梻鍌欑閹诧紕鎹㈤崒婊呯煋閻庡灚鐡曟慨? e.Handled = true;
e.Handled = true;
return; return;
} }
} }
// 原有单指滑动逻辑 // 闂傚倷绀侀幉锟犫€﹂崶顒€绐楅柟閭﹀墾閼板灝銆掑锝呬壕閻庤娲╃换婵嗩嚕閹绢喗鍋勫瀣閳诲本绻濋悽闈浶㈤柨鏇樺劦瀹曞綊宕归锝呭伎闂佸啿鎼幊蹇涙倿婵犳碍鐓涢柛鏇ㄥ亞缁犳娊鎮? if (IsInteractivePointerSource(e.Source))
if (IsInteractivePointerSource(e.Source))
{ {
return; return;
} }
@@ -811,7 +793,6 @@ public partial class MainWindow
private void OnDesktopPagesPointerReleased(object? sender, PointerReleasedEventArgs e) private void OnDesktopPagesPointerReleased(object? sender, PointerReleasedEventArgs e)
{ {
// 清理活跃指针
var pointerId = e.Pointer?.Id ?? 0; var pointerId = e.Pointer?.Id ?? 0;
_activePointerIds.Remove(pointerId); _activePointerIds.Remove(pointerId);
@@ -823,7 +804,6 @@ public partial class MainWindow
private void OnDesktopPagesPointerCaptureLost(object? sender, PointerCaptureLostEventArgs e) private void OnDesktopPagesPointerCaptureLost(object? sender, PointerCaptureLostEventArgs e)
{ {
// 清理活跃指针
var pointerId = e.Pointer?.Id ?? 0; var pointerId = e.Pointer?.Id ?? 0;
_activePointerIds.Remove(pointerId); _activePointerIds.Remove(pointerId);
@@ -898,13 +878,12 @@ public partial class MainWindow
var hasDistanceIntent = absDeltaX >= distanceThreshold && absDeltaX > absDeltaY * 1.05; var hasDistanceIntent = absDeltaX >= distanceThreshold && absDeltaX > absDeltaY * 1.05;
var hasVelocityIntent = Math.Abs(_desktopSwipeVelocityX) >= velocityThreshold; var hasVelocityIntent = Math.Abs(_desktopSwipeVelocityX) >= velocityThreshold;
// 检查:三指/右键拖动 && 在第一页 && 向右滑动 // 濠电姷顣藉Σ鍛村磻閳ь剟鏌涚€n偅宕岄柡宀嬬磿娴狅妇鎷犻幓鎺懶ョ紓鍌欐祰娴滎剚鏅跺Δ鍐煓濠㈣泛顑呯欢鐐烘倵閿濆簼绨芥俊?闂傚倷绀侀幉锟犳偡閿旂晫绠惧┑鐘叉搐閺嬩焦銇勯幘鍗炵仼缂佺媭鍨堕弻鈥崇暤椤旂厧鏁?&& 闂傚倷绶氬鑽ゆ嫻閻旂厧绀夐幖鎼厛閺佸嫰鏌涢妷锝呭闁崇粯妫冮弻宥堫檨闁告挻宀告俊?&& 闂傚倷绀侀幉锛勫枈瀹ュ鍨傚ù锝呭暔娴滃湱绱掔€n偒鍎ラ柣鎾卞劦閺岀喓鈧稒顭囩粻鎾舵偖?
if (wasThreeFingerOrRightDrag && if (wasThreeFingerOrRightDrag &&
_currentDesktopSurfaceIndex == 0 && _currentDesktopSurfaceIndex == 0 &&
deltaX > 0 && // 向右滑动 deltaX > 0 && // 闂傚倷绀侀幉锛勫枈瀹ュ鍨傚ù锝呭暔娴滃湱绱掔€n偒鍎ラ柣鎾卞劦閺岀喓鈧稒顭囩粻鎾舵偖?
(hasDistanceIntent || hasVelocityIntent)) (hasDistanceIntent || hasVelocityIntent))
{ {
// 最小化到 Windows 桌面
if (Application.Current is App app) if (Application.Current is App app)
{ {
app.HideMainWindowToTray(this, "ThreeFingerOrRightDragSwipe"); app.HideMainWindowToTray(this, "ThreeFingerOrRightDragSwipe");
@@ -998,8 +977,7 @@ public partial class MainWindow
string.Empty)); string.Empty));
} }
// 在图标渲染完成后,应用布局计算 // 闂傚倷绶氬鑽ゆ嫻閻旂厧绀夐悘鐐电叓閻熼偊娼ㄩ柍褜鍓欓锝嗙鐎n亞鍊為梺闈涱煬閻撳牆煤椤掑嫭鈷戦柛婵嗗濠€浼存煙閸涘﹥鍊愰柟顕€绠栭、妤呭礋椤愩値鍚呴梻浣哥秺閸嬪﹪宕滃璺虹9闁汇垹鎲¢悡銉︾箾閹寸儐鐒鹃悗姘缁辨帡濡搁敂鎯у绩闂佽鍠曠划娆愪繆閹间礁唯鐟滄粍瀵煎畝鍕厽闊洦娲栨禍褰掓煕鐎n偅宕岄柟顔款潐缁楃喐绻濋崟顓ㄧ吹闂? Dispatcher.UIThread.Post(() => UpdateLauncherTileLayout(), DispatcherPriority.Background);
Dispatcher.UIThread.Post(() => UpdateLauncherTileLayout(), DispatcherPriority.Background);
} }
private Button CreateLauncherFolderTile(StartMenuFolderNode folder) private Button CreateLauncherFolderTile(StartMenuFolderNode folder)
@@ -1063,8 +1041,7 @@ public partial class MainWindow
BorderThickness = new Thickness(0), BorderThickness = new Thickness(0),
Margin = new Thickness(0, 0, 12, 12), Margin = new Thickness(0, 0, 12, 12),
CornerRadius = new CornerRadius(20), CornerRadius = new CornerRadius(20),
Child = panel Child = panel,
// 不设置固定 Width 和 Height由 UpdateLauncherTileLayout 动态设置
}; };
} }
@@ -1145,11 +1122,8 @@ public partial class MainWindow
BorderBrush = Brushes.Transparent, BorderBrush = Brushes.Transparent,
CornerRadius = new CornerRadius(20), CornerRadius = new CornerRadius(20),
Padding = new Thickness(10), Padding = new Thickness(10),
Content = content Content = content,
// 不设置固定 Width 和 Height由 UpdateLauncherTileLayout 动态设置
}; };
// 根据设置决定是否显示背景
if (_showLauncherTileBackground) if (_showLauncherTileBackground)
{ {
button.Classes.Add("glass-panel"); button.Classes.Add("glass-panel");
@@ -1415,7 +1389,7 @@ public partial class MainWindow
: fileName; : fileName;
} }
private SettingsExpanderItem CreateLauncherHiddenItemRow(LauncherHiddenItemView hiddenItem) private FASettingsExpanderItem CreateLauncherHiddenItemRow(LauncherHiddenItemView hiddenItem)
{ {
var typeText = hiddenItem.Kind == LauncherEntryKind.Folder var typeText = hiddenItem.Kind == LauncherEntryKind.Folder
? L("settings.launcher.hidden_type_folder", "Folder") ? L("settings.launcher.hidden_type_folder", "Folder")
@@ -1430,7 +1404,7 @@ public partial class MainWindow
BorderThickness = new Thickness(0), BorderThickness = new Thickness(0),
Tag = new LauncherHiddenItemToken(hiddenItem.Kind, hiddenItem.Key) Tag = new LauncherHiddenItemToken(hiddenItem.Kind, hiddenItem.Key)
}; };
restoreButton.Content = new FluentIcons.Avalonia.Fluent.SymbolIcon restoreButton.Content = new FluentIcons.Avalonia.SymbolIcon
{ {
Symbol = FluentIcons.Common.Symbol.Eye, Symbol = FluentIcons.Common.Symbol.Eye,
IconVariant = FluentIcons.Common.IconVariant.Regular, IconVariant = FluentIcons.Common.IconVariant.Regular,
@@ -1441,7 +1415,7 @@ public partial class MainWindow
ToolTip.SetTip(restoreButton, L("settings.launcher.restore_button", "Unhide")); ToolTip.SetTip(restoreButton, L("settings.launcher.restore_button", "Unhide"));
restoreButton.Click += OnRestoreLauncherHiddenItemClick; restoreButton.Click += OnRestoreLauncherHiddenItemClick;
return new SettingsExpanderItem return new FASettingsExpanderItem
{ {
Content = hiddenItem.DisplayName, Content = hiddenItem.DisplayName,
Description = typeText, Description = typeText,
@@ -1451,23 +1425,17 @@ public partial class MainWindow
}; };
} }
private IconSource CreateLauncherHiddenItemIconSource(LauncherHiddenItemView hiddenItem) private FAIconSource? CreateLauncherHiddenItemIconSource(LauncherHiddenItemView hiddenItem)
{ {
if (hiddenItem.IconBitmap is not null) if (hiddenItem.IconBitmap is not null)
{ {
return new ImageIconSource return new FAImageIconSource
{ {
Source = hiddenItem.IconBitmap Source = hiddenItem.IconBitmap
}; };
} }
return new FluentIcons.Avalonia.Fluent.SymbolIconSource return null;
{
Symbol = hiddenItem.Kind == LauncherEntryKind.Folder
? FluentIcons.Common.Symbol.Folder
: FluentIcons.Common.Symbol.Apps,
IconVariant = FluentIcons.Common.IconVariant.Regular
};
} }
private void OnRestoreLauncherHiddenItemClick(object? sender, RoutedEventArgs e) private void OnRestoreLauncherHiddenItemClick(object? sender, RoutedEventArgs e)
@@ -1696,7 +1664,7 @@ public partial class MainWindow
Content = content Content = content
}; };
// 根据设置决定是否显示背景 // 闂傚倷绀侀幖顐ょ矓閻戞枻缍栧璺猴功閺嗐倕霉閿濆洤鍔嬪┑顖氥偢閺屾盯骞樺Δ鈧幊蹇涙倵椤撱垺鈷戦柛娑橈工婵洭鏌涢悢閿嬪仴闁诡喚鍋撻妶锝夊礃閵娿儱鎸ゆ俊鐐€栭悧妤冨枈瀹ュ纾垮┑鐘叉处閻撴盯鏌涢弴銊ヤ簻闁抽攱妫冮弻鏇㈠炊閵娿儱鎽甸梺纭呮珪椤ㄥ牊绂掗敃鍌涘€锋い鎺戝€哥拋?
if (_showLauncherTileBackground) if (_showLauncherTileBackground)
{ {
button.Classes.Add("glass-panel"); button.Classes.Add("glass-panel");
@@ -1775,7 +1743,7 @@ public partial class MainWindow
Content = content Content = content
}; };
// 根据设置决定是否显示背景 // 闂傚倷绀侀幖顐ょ矓閻戞枻缍栧璺猴功閺嗐倕霉閿濆洤鍔嬪┑顖氥偢閺屾盯骞樺Δ鈧幊蹇涙倵椤撱垺鈷戦柛娑橈工婵洭鏌涢悢閿嬪仴闁诡喚鍋撻妶锝夊礃閵娿儱鎸ゆ俊鐐€栭悧妤冨枈瀹ュ纾垮┑鐘叉处閻撴盯鏌涢弴銊ヤ簻闁抽攱妫冮弻鏇㈠炊閵娿儱鎽甸梺纭呮珪椤ㄥ牊绂掗敃鍌涘€锋い鎺戝€哥拋?
if (_showLauncherTileBackground) if (_showLauncherTileBackground)
{ {
button.Classes.Add("glass-panel"); button.Classes.Add("glass-panel");

View File

@@ -26,7 +26,7 @@ public partial class MainWindow
private TextBlock? CurrentRenderBackendValueTextBlock => this.FindControl<TextBlock>("CurrentRenderBackendValueTextBlock"); private TextBlock? CurrentRenderBackendValueTextBlock => this.FindControl<TextBlock>("CurrentRenderBackendValueTextBlock");
private TextBlock? CurrentRenderBackendImplementationTextBlock => this.FindControl<TextBlock>("CurrentRenderBackendImplementationTextBlock"); private TextBlock? CurrentRenderBackendImplementationTextBlock => this.FindControl<TextBlock>("CurrentRenderBackendImplementationTextBlock");
private ComboBox? TimeZoneComboBox => this.FindControl<ComboBox>("TimeZoneComboBox"); private ComboBox? TimeZoneComboBox => this.FindControl<ComboBox>("TimeZoneComboBox");
private SettingsExpander? LauncherHiddenItemsSettingsExpander => this.FindControl<SettingsExpander>("LauncherHiddenItemsSettingsExpander"); private FASettingsExpander? LauncherHiddenItemsSettingsExpander => this.FindControl<FASettingsExpander>("LauncherHiddenItemsSettingsExpander");
private TextBlock? LauncherHiddenItemsEmptyTextBlock => this.FindControl<TextBlock>("LauncherHiddenItemsEmptyTextBlock"); private TextBlock? LauncherHiddenItemsEmptyTextBlock => this.FindControl<TextBlock>("LauncherHiddenItemsEmptyTextBlock");
private void OnSettingsChanged(object? sender, SettingsChangedEvent e) private void OnSettingsChanged(object? sender, SettingsChangedEvent e)
@@ -38,13 +38,12 @@ public partial class MainWindow
return; return;
} }
// 组件实例范围的设置变更不应触发整个桌面重新加载(比如翻页保存图片索引) // 缁勪欢瀹炰緥鑼冨洿鐨勮缃彉鏇翠笉搴旇Е鍙戞暣涓闈㈤噸鏂板姞杞斤紙姣斿缈婚〉淇濆瓨鍥剧墖绱㈠紩锛? if (e.Scope == SettingsScope.ComponentInstance)
if (e.Scope == SettingsScope.ComponentInstance)
{ {
return; return;
} }
// 启动台设置变化时,重新渲染启动台图标 // 鍚姩鍙拌缃彉鍖栨椂锛岄噸鏂版覆鏌撳惎鍔ㄥ彴鍥炬爣
if (e.Scope == SettingsScope.Launcher && e.ChangedKeys is { Count: > 0 }) if (e.Scope == SettingsScope.Launcher && e.ChangedKeys is { Count: > 0 })
{ {
var changedKeys = e.ChangedKeys.ToArray(); var changedKeys = e.ChangedKeys.ToArray();

View File

@@ -38,14 +38,14 @@ public partial class MainWindow
try try
{ {
var dialog = new ContentDialog var dialog = new FAContentDialog
{ {
Title = L("single_instance.notice.title", "应用已经运行"), Title = L("single_instance.notice.title", "Already running"),
Content = L( Content = L(
"single_instance.notice.description", "single_instance.notice.description",
"应用已经运行,无需多次点击打开。"), "LanMountainDesktop is already running. The existing window will stay active, so no new instance was started."),
PrimaryButtonText = L("single_instance.notice.button", "确定"), PrimaryButtonText = L("single_instance.notice.button", "OK"),
DefaultButton = ContentDialogButton.Primary DefaultButton = FAContentDialogButton.Primary
}; };
await dialog.ShowAsync(this); await dialog.ShowAsync(this);

View File

@@ -3,7 +3,7 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia" xmlns:fi="using:FluentIcons.Avalonia"
xmlns:ic="using:FluentIcons.Avalonia.Fluent" xmlns:ic="using:FluentIcons.Avalonia"
xmlns:mi="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:mi="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
xmlns:comp="using:LanMountainDesktop.Views.Components" xmlns:comp="using:LanMountainDesktop.Views.Components"
@@ -236,7 +236,7 @@
</Grid> </Grid>
</Border> </Border>
<!-- 状态栏阴影层 - macOS 风格的完整阴影带 --> <!-- 鐘舵€佹爮闃村奖灞?- macOS 椋庢牸鐨勫畬鏁撮槾褰卞甫 -->
<Border x:Name="StatusBarOverlay" <Border x:Name="StatusBarOverlay"
Grid.Row="0" Grid.Row="0"
Grid.Column="0" Grid.Column="0"
@@ -265,7 +265,7 @@
Padding="4" Padding="4"
ZIndex="2"> ZIndex="2">
<Grid ColumnDefinitions="*,Auto,*"> <Grid ColumnDefinitions="*,Auto,*">
<!-- 左侧状态栏组件 --> <!-- 宸︿晶鐘舵€佹爮缁勪欢 -->
<StackPanel x:Name="TopStatusLeftPanel" <StackPanel x:Name="TopStatusLeftPanel"
Grid.Column="0" Grid.Column="0"
Orientation="Horizontal" Orientation="Horizontal"
@@ -281,7 +281,7 @@
IsVisible="False" IsVisible="False"
Margin="0" /> Margin="0" />
</StackPanel> </StackPanel>
<!-- 中间状态栏组件 --> <!-- 涓棿鐘舵€佹爮缁勪欢 -->
<StackPanel x:Name="TopStatusCenterPanel" <StackPanel x:Name="TopStatusCenterPanel"
Grid.Column="1" Grid.Column="1"
Orientation="Horizontal" Orientation="Horizontal"
@@ -297,7 +297,7 @@
IsVisible="False" IsVisible="False"
Margin="0" /> Margin="0" />
</StackPanel> </StackPanel>
<!-- 右侧状态栏组件 --> <!-- 鍙充晶鐘舵€佹爮缁勪欢 -->
<StackPanel x:Name="TopStatusRightPanel" <StackPanel x:Name="TopStatusRightPanel"
Grid.Column="2" Grid.Column="2"
Orientation="Horizontal" Orientation="Horizontal"

View File

@@ -9,7 +9,6 @@ using Avalonia.Styling;
using Avalonia.Threading; using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using FluentIcons.Avalonia; using FluentIcons.Avalonia;
using FluentIcons.Avalonia.Fluent;
using LanMountainDesktop.Services; using LanMountainDesktop.Services;
namespace LanMountainDesktop.Views; namespace LanMountainDesktop.Views;

View File

@@ -3,17 +3,25 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:controls="using:LanMountainDesktop.Controls" xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.AboutSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.AboutSettingsPage"
x:DataType="vm:AboutSettingsPageViewModel"> x:DataType="vm:AboutSettingsPageViewModel">
<UserControl.Resources> <UserControl.Resources>
<ResourceDictionary> <ResourceDictionary>
<ResourceDictionary.ThemeDictionaries> <ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Default"> <ResourceDictionary x:Key="Default">
<ImageBrush x:Key="AboutBannerBrush" Source="/Assets/about_banner_light.png" Stretch="Uniform" AlignmentX="Center" AlignmentY="Center" /> <ImageBrush x:Key="AboutBannerBrush"
Source="/Assets/about_banner_light.png"
Stretch="Uniform"
AlignmentX="Center"
AlignmentY="Center" />
</ResourceDictionary> </ResourceDictionary>
<ResourceDictionary x:Key="Dark"> <ResourceDictionary x:Key="Dark">
<ImageBrush x:Key="AboutBannerBrush" Source="/Assets/about_banner_dark.png" Stretch="Uniform" AlignmentX="Center" AlignmentY="Center" /> <ImageBrush x:Key="AboutBannerBrush"
Source="/Assets/about_banner_dark.png"
Stretch="Uniform"
AlignmentX="Center"
AlignmentY="Center" />
</ResourceDictionary> </ResourceDictionary>
</ResourceDictionary.ThemeDictionaries> </ResourceDictionary.ThemeDictionaries>
</ResourceDictionary> </ResourceDictionary>
@@ -36,7 +44,7 @@
<Setter Property="HorizontalAlignment" Value="Stretch" /> <Setter Property="HorizontalAlignment" Value="Stretch" />
</Style> </Style>
<Style Selector="ui|InfoBar.about-static-info"> <Style Selector="ui|FAInfoBar.about-static-info">
<Setter Property="IsOpen" Value="True" /> <Setter Property="IsOpen" Value="True" />
<Setter Property="IsClosable" Value="False" /> <Setter Property="IsClosable" Value="False" />
<Setter Property="Severity" Value="Informational" /> <Setter Property="Severity" Value="Informational" />
@@ -57,30 +65,29 @@
<TextBlock Classes="settings-subsection-title" <TextBlock Classes="settings-subsection-title"
Text="{Binding AppInfoHeader}" /> Text="{Binding AppInfoHeader}" />
<ui:InfoBar Classes="about-static-info" <ui:FAInfoBar Classes="about-static-info"
Title="{Binding VersionLabel}" Title="{Binding VersionLabel}"
Message="{Binding VersionText}"> Message="{Binding VersionText}">
<ui:InfoBar.IconSource> <ui:FAInfoBar.IconSource>
<fi:SymbolIconSource Symbol="Info" /> <fi:SymbolIconSource Symbol="Info" />
</ui:InfoBar.IconSource> </ui:FAInfoBar.IconSource>
</ui:InfoBar> </ui:FAInfoBar>
<ui:InfoBar Classes="about-static-info" <ui:FAInfoBar Classes="about-static-info"
Title="{Binding CodenameLabel}" Title="{Binding CodenameLabel}"
Message="{Binding CodenameText}"> Message="{Binding CodenameText}">
<ui:InfoBar.IconSource> <ui:FAInfoBar.IconSource>
<fi:SymbolIconSource Symbol="Bookmark" /> <fi:SymbolIconSource Symbol="Bookmark" />
</ui:InfoBar.IconSource> </ui:FAInfoBar.IconSource>
</ui:InfoBar> </ui:FAInfoBar>
<!-- 版权声明 - 放在渲染显示前面 --> <ui:FASettingsExpander Header="Project resources"
<ui:SettingsExpander Header="版权声明"
IsExpanded="True"> IsExpanded="True">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Document" /> <fi:SymbolIconSource Symbol="Document" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem.Footer> <ui:FASettingsExpanderItem.Footer>
<WrapPanel> <WrapPanel>
<WrapPanel.Styles> <WrapPanel.Styles>
<Style Selector="HyperlinkButton"> <Style Selector="HyperlinkButton">
@@ -89,18 +96,18 @@
</Style> </Style>
</WrapPanel.Styles> </WrapPanel.Styles>
<HyperlinkButton NavigateUri="https://github.com/wwiinnddyy/LanMountainDesktop"> <HyperlinkButton NavigateUri="https://github.com/wwiinnddyy/LanMountainDesktop">
<TextBlock Text="GitHub 仓库" /> <TextBlock Text="GitHub Repository" />
</HyperlinkButton> </HyperlinkButton>
<HyperlinkButton NavigateUri="https://github.com/wwiinnddyy/LanMountainDesktop/issues"> <HyperlinkButton NavigateUri="https://github.com/wwiinnddyy/LanMountainDesktop/issues">
<TextBlock Text="问题反馈" /> <TextBlock Text="Issue Tracker" />
</HyperlinkButton> </HyperlinkButton>
</WrapPanel> </WrapPanel>
</ui:SettingsExpanderItem.Footer> </ui:FASettingsExpanderItem.Footer>
<TextBlock> <TextBlock>
<Run Text="Copyright (c) 2024-" /><Run Text="2025" /> Lincube <Run Text="Copyright (c) 2024-" /><Run Text="2025" /> Lincube
</TextBlock> </TextBlock>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</UserControl> </UserControl>

View File

@@ -74,6 +74,9 @@ public partial class AboutSettingsPage : SettingsPageBase
private void OnAboutHeroCardPointerPressed(object? sender, PointerPressedEventArgs e) private void OnAboutHeroCardPointerPressed(object? sender, PointerPressedEventArgs e)
{ {
_ = sender;
_ = e;
var now = DateTime.UtcNow; var now = DateTime.UtcNow;
var elapsed = now - _lastHeroCardClickTime; var elapsed = now - _lastHeroCardClickTime;
@@ -111,25 +114,23 @@ public partial class AboutSettingsPage : SettingsPageBase
} }
else if (remaining <= 2) else if (remaining <= 2)
{ {
Debug.WriteLine($"[AboutSettingsPage] 再点击 {remaining} 次即可启用开发者模式。"); Debug.WriteLine($"[AboutSettingsPage] {remaining} tap(s) remaining before developer mode unlocks.");
} }
} }
private async void PromptEnableDevMode(ISettingsFacadeService settingsFacade) private async void PromptEnableDevMode(ISettingsFacadeService settingsFacade)
{ {
var dialog = new ContentDialog var dialog = new FAContentDialog
{ {
Title = "启用开发者模式", Title = "Enable developer mode",
Content = "开发者模式提供了插件调试、热重载等高级功能,仅供开发和调试用途。\n\n" + Content = "Developer mode exposes experimental settings, diagnostics, and local plugin debugging options.\n\nUse it only when you are actively testing or troubleshooting the desktop host.",
"请注意:开发者不对以非开发用途使用此功能造成的任何后果负责,也不接受以非开发用途使用时产生的 Bug 反馈。\n\n" + PrimaryButtonText = "Enable",
"确定要启用开发者模式吗?", CloseButtonText = "Not now",
PrimaryButtonText = "启用", DefaultButton = FAContentDialogButton.Close
CloseButtonText = "取消",
DefaultButton = ContentDialogButton.Close
}; };
var result = await dialog.ShowAsync(); var result = await dialog.ShowAsync();
if (result != ContentDialogResult.Primary) if (result != FAContentDialogResult.Primary)
{ {
return; return;
} }

View File

@@ -3,7 +3,7 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:controls="using:LanMountainDesktop.Controls" xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.AppearanceSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.AppearanceSettingsPage"
x:DataType="vm:AppearanceSettingsPageViewModel"> x:DataType="vm:AppearanceSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
@@ -13,12 +13,12 @@
Text="{Binding ThemeHeader}" Text="{Binding ThemeHeader}"
Margin="0,0,0,4" /> Margin="0,0,0,4" />
<ui:SettingsExpander Header="{Binding ThemeModeLabel}" <ui:FASettingsExpander Header="{Binding ThemeModeLabel}"
Description="{Binding ThemeModeDescription}"> Description="{Binding ThemeModeDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="WeatherMoon" /> <fi:SymbolIconSource Symbol="WeatherMoon" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="200" <ComboBox Width="200"
ItemsSource="{Binding ThemeModeOptions}" ItemsSource="{Binding ThemeModeOptions}"
SelectedItem="{Binding SelectedThemeMode}"> SelectedItem="{Binding SelectedThemeMode}">
@@ -28,24 +28,24 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="{Binding UseSystemChromeLabel}"> <ui:FASettingsExpander Header="{Binding UseSystemChromeLabel}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Window" /> <fi:SymbolIconSource Symbol="Window" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding UseSystemChrome}" /> <ToggleSwitch IsChecked="{Binding UseSystemChrome}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="{Binding ThemeColorModeLabel}" <ui:FASettingsExpander Header="{Binding ThemeColorModeLabel}"
Description="{Binding ThemeColorSourceDescription}"> Description="{Binding ThemeColorSourceDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="PaintBrush" /> <fi:SymbolIconSource Symbol="PaintBrush" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="240" <ComboBox Width="240"
ItemsSource="{Binding ThemeColorModes}" ItemsSource="{Binding ThemeColorModes}"
SelectedItem="{Binding SelectedThemeColorMode}"> SelectedItem="{Binding SelectedThemeColorMode}">
@@ -55,15 +55,15 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="{Binding SystemMaterialLabel}" <ui:FASettingsExpander Header="{Binding SystemMaterialLabel}"
Description="{Binding SystemMaterialDescription}"> Description="{Binding SystemMaterialDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="WindowDevTools" /> <fi:SymbolIconSource Symbol="WindowDevTools" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="220" <ComboBox Width="220"
ItemsSource="{Binding SystemMaterialModes}" ItemsSource="{Binding SystemMaterialModes}"
SelectedItem="{Binding SelectedSystemMaterialMode}"> SelectedItem="{Binding SelectedSystemMaterialMode}">
@@ -73,15 +73,15 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="{Binding ThemeColorLabel}" <ui:FASettingsExpander Header="{Binding ThemeColorLabel}"
Description="{Binding ThemeColorSourceDescription}"> Description="{Binding ThemeColorSourceDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Color" /> <fi:SymbolIconSource Symbol="Color" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<StackPanel Spacing="12"> <StackPanel Spacing="12">
<StackPanel Orientation="Horizontal" <StackPanel Orientation="Horizontal"
Spacing="12" Spacing="12"
@@ -257,8 +257,8 @@
</Button> </Button>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</UserControl> </UserControl>

View File

@@ -3,7 +3,7 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:controls="using:LanMountainDesktop.Controls" xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.ComponentsSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.ComponentsSettingsPage"
x:DataType="vm:ComponentsSettingsPageViewModel"> x:DataType="vm:ComponentsSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
@@ -12,12 +12,12 @@
Text="{Binding ComponentsHeader}" Text="{Binding ComponentsHeader}"
Margin="0,0,0,4" /> Margin="0,0,0,4" />
<ui:SettingsExpander Header="{Binding ComponentsHeader}" <ui:FASettingsExpander Header="{Binding ComponentsHeader}"
IsExpanded="True"> IsExpanded="True">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Apps" /> <fi:SymbolIconSource Symbol="Apps" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="Auto,*,Auto" ColumnSpacing="16">
<TextBlock Text="{Binding ShortSideCellsLabel}" <TextBlock Text="{Binding ShortSideCellsLabel}"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
@@ -33,8 +33,8 @@
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Right" /> HorizontalAlignment="Right" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="Auto,*,Auto" ColumnSpacing="16">
<TextBlock Text="{Binding EdgeInsetPercentLabel}" <TextBlock Text="{Binding EdgeInsetPercentLabel}"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
@@ -50,8 +50,8 @@
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Right" /> HorizontalAlignment="Right" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*"> <Grid ColumnDefinitions="Auto,*">
<TextBlock Text="{Binding SpacingPresetLabel}" <TextBlock Text="{Binding SpacingPresetLabel}"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
@@ -66,19 +66,19 @@
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<controls:IconText Icon="ShapeOrganic" <controls:IconText Icon="ShapeOrganic"
Text="{Binding ComponentRadiusHeader}" Text="{Binding ComponentRadiusHeader}"
Margin="0,12,0,4" /> Margin="0,12,0,4" />
<ui:SettingsExpander Header="{Binding CornerRadiusStyleLabel}" <ui:FASettingsExpander Header="{Binding CornerRadiusStyleLabel}"
Description="{Binding CornerRadiusStyleDescription}"> Description="{Binding CornerRadiusStyleDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="ShapeOrganic" /> <fi:SymbolIconSource Symbol="ShapeOrganic" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<StackPanel Orientation="Horizontal" Spacing="8"> <StackPanel Orientation="Horizontal" Spacing="8">
<ComboBox Width="200" <ComboBox Width="200"
ItemsSource="{Binding CornerRadiusStyleOptions}" ItemsSource="{Binding CornerRadiusStyleOptions}"
@@ -93,8 +93,8 @@
<fi:SymbolIcon Symbol="QuestionCircle" /> <fi:SymbolIcon Symbol="QuestionCircle" />
</Button> </Button>
</StackPanel> </StackPanel>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</UserControl> </UserControl>

View File

@@ -2,83 +2,91 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.DevSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.DevSettingsPage"
x:DataType="vm:DevSettingsPageViewModel"> x:DataType="vm:DevSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Classes="settings-page-container settings-page-animated"> <StackPanel Classes="settings-page-container settings-page-animated">
<ui:FAInfoBar IsOpen="True"
<ui:InfoBar IsOpen="True"
IsClosable="False" IsClosable="False"
Severity="Warning" Severity="Warning"
Title="开发者模式" Title="Preview and developer features"
Message="开发者模式仅供开发和调试用途。开发者不对以非开发用途使用此功能造成的任何后果负责。" Message="These options are intended for debugging, diagnostics, and local plugin development."
Margin="0,0,0,16" /> Margin="0,0,0,16">
<ui:FAInfoBar.IconSource>
<fi:SymbolIconSource Symbol="Info" />
</ui:FAInfoBar.IconSource>
</ui:FAInfoBar>
<ui:SettingsExpander Header="启用开发者模式" <ui:FASettingsExpander Header="Developer mode"
Description="启用后可使用插件调试、开发者插件路径等高级功能"> Description="Enable developer-focused startup helpers and diagnostics.">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="DeveloperBoard" /> <fi:SymbolIconSource Symbol="DeveloperBoard" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding IsDevModeEnabled}" /> <ToggleSwitch IsChecked="{Binding IsDevModeEnabled}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="启用三指滑动" <ui:FASettingsExpander Header="Three-finger desktop swipe"
Description="使用三根手指或鼠标右键拖动自由滑动页面,在第一页向右滑动可回到 Windows 桌面(实验性功能)"> Description="Enable desktop page switching gestures when the current platform supports them.">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Gesture" /> <fi:SymbolIconSource Symbol="Gesture" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding EnableThreeFingerSwipe}" /> <ToggleSwitch IsChecked="{Binding EnableThreeFingerSwipe}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="启用融合桌面" <ui:FASettingsExpander Header="Fused desktop experience"
Description="允许将组件放置在 Windows 系统桌面上(实验性功能,重启后生效)"> Description="Enable the fused desktop shell and its related experimental entry points.">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Apps" /> <fi:SymbolIconSource Symbol="Apps" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding EnableFusedDesktop}" /> <ToggleSwitch IsChecked="{Binding EnableFusedDesktop}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<Separator Classes="settings-separator" /> <Separator Classes="settings-separator" />
<ui:SettingsExpander Header="开发者插件路径" <ui:FASettingsExpander Header="Development plugin path"
Description="指定开发中的插件目录路径,无需打包即可直接加载。多个路径用分号分隔。"> Description="Load a local plugin output directory for iterative debugging without packaging.">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="FolderLink" /> <fi:SymbolIconSource Symbol="FolderLink" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<TextBox Text="{Binding DevPluginPath}" <TextBox Text="{Binding DevPluginPath}"
Watermark="C:\path\to\plugin\bin\Debug\net10.0" Watermark="C:\path\to\plugin\bin\Debug\net10.0"
Width="360" Width="360"
MinWidth="200" /> MinWidth="200" />
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<Separator Classes="settings-separator" /> <Separator Classes="settings-separator" />
<ui:SettingsExpander Header="命令行参数" <ui:FASettingsExpander Header="Developer startup arguments"
Description="也可以通过命令行参数或环境变量指定开发者插件路径"> Description="Use these launch arguments or environment variables to start the app in development scenarios.">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="WindowConsole" /> <fi:SymbolIconSource Symbol="WindowConsole" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<StackPanel Margin="0,8,0,0" Spacing="8"> <StackPanel Margin="0,8,0,0"
<TextBlock Text="命令行参数:" FontWeight="SemiBold" /> Spacing="8">
<TextBlock Text="Command-line arguments:"
FontWeight="SemiBold" />
<Border Background="{DynamicResource ControlFillColorDefaultBrush}" <Border Background="{DynamicResource ControlFillColorDefaultBrush}"
CornerRadius="8" CornerRadius="8"
Padding="12,8"> Padding="12,8">
<TextBlock FontFamily="Cascadia Code, Consolas, monospace" <TextBlock FontFamily="Cascadia Code, Consolas, monospace"
FontSize="12" FontSize="12"
Text="--dev-plugin &lt;path&gt; -dp &lt;path&gt;" Text="--dev-plugin &lt;path&gt; or -dp &lt;path&gt;"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
</Border> </Border>
<TextBlock Text="环境变量:" FontWeight="SemiBold" Margin="0,8,0,0" />
<TextBlock Text="Environment variables:"
FontWeight="SemiBold"
Margin="0,8,0,0" />
<Border Background="{DynamicResource ControlFillColorDefaultBrush}" <Border Background="{DynamicResource ControlFillColorDefaultBrush}"
CornerRadius="8" CornerRadius="8"
Padding="12,8"> Padding="12,8">
@@ -87,23 +95,25 @@
Text="LMD_DEV_PLUGIN=&lt;path&gt;" Text="LMD_DEV_PLUGIN=&lt;path&gt;"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
</Border> </Border>
<TextBlock Text="其他参数:" FontWeight="SemiBold" Margin="0,8,0,0" />
<TextBlock Text="Other arguments:"
FontWeight="SemiBold"
Margin="0,8,0,0" />
<Border Background="{DynamicResource ControlFillColorDefaultBrush}" <Border Background="{DynamicResource ControlFillColorDefaultBrush}"
CornerRadius="8" CornerRadius="8"
Padding="12,8"> Padding="12,8">
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock FontFamily="Cascadia Code, Consolas, monospace" <TextBlock FontFamily="Cascadia Code, Consolas, monospace"
FontSize="12" FontSize="12"
Text="--dev-mode / -dev 启用开发者模式" /> Text="--dev-mode / -dev Enable developer mode startup helpers." />
<TextBlock FontFamily="Cascadia Code, Consolas, monospace" <TextBlock FontFamily="Cascadia Code, Consolas, monospace"
FontSize="12" FontSize="12"
Text="--hot-reload / -hr 启用热重载(预留)" /> Text="--hot-reload / -hr Enable hot reload for development builds." />
</StackPanel> </StackPanel>
</Border> </Border>
</StackPanel> </StackPanel>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</UserControl> </UserControl>

View File

@@ -6,7 +6,7 @@ namespace LanMountainDesktop.Views.SettingsPages;
[SettingsPageInfo( [SettingsPageInfo(
"dev", "dev",
"开发者", "Developer",
SettingsPageCategory.Dev, SettingsPageCategory.Dev,
IconKey = "DeveloperBoard", IconKey = "DeveloperBoard",
SortOrder = 0, SortOrder = 0,

View File

@@ -3,21 +3,20 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:controls="using:LanMountainDesktop.Controls" xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.GeneralSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.GeneralSettingsPage"
x:DataType="vm:GeneralSettingsPageViewModel"> x:DataType="vm:GeneralSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Classes="settings-page-container settings-page-animated"> <StackPanel Classes="settings-page-container settings-page-animated">
<controls:IconText Icon="Globe" <controls:IconText Icon="Globe"
Text="{Binding BasicHeader}" Text="{Binding BasicHeader}"
Margin="0,0,0,4" /> Margin="0,0,0,4" />
<ui:SettingsExpander Header="{Binding LanguageHeader}"> <ui:FASettingsExpander Header="{Binding LanguageHeader}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Settings" /> <fi:SymbolIconSource Symbol="Settings" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="220" <ComboBox Width="220"
ItemsSource="{Binding Languages}" ItemsSource="{Binding Languages}"
SelectedItem="{Binding SelectedLanguage}"> SelectedItem="{Binding SelectedLanguage}">
@@ -27,15 +26,15 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="{Binding TimeZoneHeader}" <ui:FASettingsExpander Header="{Binding TimeZoneHeader}"
Description="{Binding TimeZoneDescription}"> Description="{Binding TimeZoneDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Clock" /> <fi:SymbolIconSource Symbol="Clock" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="240" <ComboBox Width="240"
ItemsSource="{Binding TimeZones}" ItemsSource="{Binding TimeZones}"
SelectedItem="{Binding SelectedTimeZone}"> SelectedItem="{Binding SelectedTimeZone}">
@@ -45,14 +44,14 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="{Binding PreviewHeader}"> <ui:FASettingsExpander Header="{Binding PreviewHeader}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Calendar" /> <fi:SymbolIconSource Symbol="Calendar" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="16" ColumnSpacing="16"
RowDefinitions="Auto,Auto" RowDefinitions="Auto,Auto"
@@ -70,8 +69,8 @@
Opacity="0.82" Opacity="0.82"
Text="{Binding PreviewDateText}" /> Text="{Binding PreviewDateText}" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<Separator Classes="settings-separator" /> <Separator Classes="settings-separator" />
@@ -79,13 +78,13 @@
Text="{Binding RuntimeHeader}" Text="{Binding RuntimeHeader}"
Margin="0,0,0,4" /> Margin="0,0,0,4" />
<ui:SettingsExpander Header="{Binding RenderModeHeader}" <ui:FASettingsExpander Header="{Binding RenderModeHeader}"
Description="{Binding RuntimeDescription}" Description="{Binding RuntimeDescription}"
IsExpanded="True"> IsExpanded="True">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="DeveloperBoard" /> <fi:SymbolIconSource Symbol="DeveloperBoard" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="220" <ComboBox Width="220"
ItemsSource="{Binding RenderModes}" ItemsSource="{Binding RenderModes}"
SelectedItem="{Binding SelectedRenderMode}"> SelectedItem="{Binding SelectedRenderMode}">
@@ -95,48 +94,47 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<TextBlock Text="{Binding RenderModeRestartMessage}" <TextBlock Text="{Binding RenderModeRestartMessage}"
Opacity="0.7" Opacity="0.7"
FontSize="12" FontSize="12"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="淡入淡出效果" <ui:FASettingsExpander Header="Fade startup transition"
Description="{Binding FadeTransitionDescription}" Description="{Binding FadeTransitionDescription}"
IsVisible="{Binding IsSlideTransitionAvailable}"> IsVisible="{Binding IsSlideTransitionAvailable}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="ArrowUpload" /> <fi:SymbolIconSource Symbol="Window" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding EnableFadeTransition}" <ToggleSwitch IsChecked="{Binding EnableFadeTransition}"
IsEnabled="{Binding IsFadeTransitionToggleEnabled}" /> IsEnabled="{Binding IsFadeTransitionToggleEnabled}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="启动滑入滑出效果" <ui:FASettingsExpander Header="Slide startup transition"
Description="启用后,启动和恢复时从屏幕右侧边缘滑入或滑出,仅 Windows 可用。" Description="Use a slide-in startup transition on supported Windows builds. This option disables the fade transition."
IsVisible="{Binding IsSlideTransitionAvailable}"> IsVisible="{Binding IsSlideTransitionAvailable}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="ArrowRight" /> <fi:SymbolIconSource Symbol="Gesture" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding EnableSlideTransition}" /> <ToggleSwitch IsChecked="{Binding EnableSlideTransition}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="桌面主窗口在任务栏显示图标" <ui:FASettingsExpander Header="Show in taskbar"
Description="仅控制桌面主窗口在系统任务栏中的图标显示,不影响设置窗口。"> Description="Keep the main window visible in the taskbar while the desktop host is running.">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Window" /> <fi:SymbolIconSource Symbol="Window" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding ShowInTaskbar}" /> <ToggleSwitch IsChecked="{Binding ShowInTaskbar}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</UserControl> </UserControl>

View File

@@ -3,7 +3,7 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:controls="using:LanMountainDesktop.Controls" xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
xmlns:symbol="using:FluentIcons.Common" xmlns:symbol="using:FluentIcons.Common"
x:Class="LanMountainDesktop.Views.SettingsPages.LauncherSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.LauncherSettingsPage"
x:DataType="vm:LauncherSettingsPageViewModel"> x:DataType="vm:LauncherSettingsPageViewModel">
@@ -56,14 +56,14 @@
Text="{Binding AppearanceHeader}" Text="{Binding AppearanceHeader}"
Margin="0,0,0,4" /> Margin="0,0,0,4" />
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding AppearanceHeader}" Header="{Binding AppearanceHeader}"
Description="{Binding AppearanceDescription}" Description="{Binding AppearanceDescription}"
IsExpanded="True"> IsExpanded="True">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="{x:Static symbol:Symbol.Apps}" /> <fi:SymbolIconSource Symbol="{x:Static symbol:Symbol.Apps}" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="*,Auto"> <Grid ColumnDefinitions="*,Auto">
<StackPanel Spacing="2"> <StackPanel Spacing="2">
<TextBlock Text="{Binding ShowTileBackgroundHeader}" /> <TextBlock Text="{Binding ShowTileBackgroundHeader}" />
@@ -73,21 +73,21 @@
<ToggleSwitch Grid.Column="1" <ToggleSwitch Grid.Column="1"
IsChecked="{Binding ShowTileBackground}" /> IsChecked="{Binding ShowTileBackground}" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<controls:IconText Icon="Apps" <controls:IconText Icon="Apps"
Text="{Binding HiddenHeader}" Text="{Binding HiddenHeader}"
Margin="0,24,0,4" /> Margin="0,24,0,4" />
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding HiddenHeader}" Header="{Binding HiddenHeader}"
Description="{Binding HiddenDescription}" Description="{Binding HiddenDescription}"
IsExpanded="True"> IsExpanded="True">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Apps" /> <fi:SymbolIconSource Symbol="Apps" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<TextBlock Classes="settings-item-description" <TextBlock Classes="settings-item-description"
IsVisible="{Binding IsHiddenItemsEmpty}" IsVisible="{Binding IsHiddenItemsEmpty}"
@@ -99,24 +99,24 @@
IsVisible="{Binding HasHiddenItems}"> IsVisible="{Binding HasHiddenItems}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:LauncherHiddenItemViewModel"> <DataTemplate x:DataType="vm:LauncherHiddenItemViewModel">
<ui:SettingsExpanderItem Content="{Binding DisplayName}" <ui:FASettingsExpanderItem Content="{Binding DisplayName}"
Description="{Binding TypeLabel}" Description="{Binding TypeLabel}"
IsClickEnabled="False"> IsClickEnabled="False">
<ui:SettingsExpanderItem.IconSource> <ui:FASettingsExpanderItem.IconSource>
<fi:SymbolIconSource Symbol="{Binding IconSymbol}" /> <fi:SymbolIconSource Symbol="{Binding IconSymbol}" />
</ui:SettingsExpanderItem.IconSource> </ui:FASettingsExpanderItem.IconSource>
<ui:SettingsExpanderItem.Footer> <ui:FASettingsExpanderItem.Footer>
<Button Command="{Binding RestoreCommand}" <Button Command="{Binding RestoreCommand}"
Content="{Binding RestoreButtonText}" Content="{Binding RestoreButtonText}"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
</ui:SettingsExpanderItem.Footer> </ui:FASettingsExpanderItem.Footer>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>
</StackPanel> </StackPanel>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</UserControl> </UserControl>

View File

@@ -3,7 +3,7 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:controls="using:LanMountainDesktop.Controls" xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.NotificationSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.NotificationSettingsPage"
x:DataType="vm:NotificationSettingsPageViewModel"> x:DataType="vm:NotificationSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
@@ -13,15 +13,15 @@
Text="{Binding NotificationHeader}" Text="{Binding NotificationHeader}"
Margin="0,0,0,4" /> Margin="0,0,0,4" />
<ui:SettingsExpander Header="{Binding EnableNotificationHeader}" <ui:FASettingsExpander Header="{Binding EnableNotificationHeader}"
Description="{Binding EnableNotificationDescription}"> Description="{Binding EnableNotificationDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Alert" /> <fi:SymbolIconSource Symbol="Alert" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding IsNotificationEnabled}" /> <ToggleSwitch IsChecked="{Binding IsNotificationEnabled}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<Separator Classes="settings-separator" /> <Separator Classes="settings-separator" />
@@ -29,39 +29,39 @@
Text="{Binding BehaviorHeader}" Text="{Binding BehaviorHeader}"
Margin="0,0,0,4" /> Margin="0,0,0,4" />
<ui:SettingsExpander Header="{Binding HoverPauseHeader}" <ui:FASettingsExpander Header="{Binding HoverPauseHeader}"
Description="{Binding HoverPauseDescription}"> Description="{Binding HoverPauseDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="CursorHover" /> <fi:SymbolIconSource Symbol="CursorHover" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding IsHoverPauseEnabled}" /> <ToggleSwitch IsChecked="{Binding IsHoverPauseEnabled}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="{Binding ClickCloseHeader}" <ui:FASettingsExpander Header="{Binding ClickCloseHeader}"
Description="{Binding ClickCloseDescription}"> Description="{Binding ClickCloseDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="CursorClick" /> <fi:SymbolIconSource Symbol="CursorClick" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding IsClickCloseEnabled}" /> <ToggleSwitch IsChecked="{Binding IsClickCloseEnabled}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="{Binding MaxNotificationsHeader}" <ui:FASettingsExpander Header="{Binding MaxNotificationsHeader}"
Description="{Binding MaxNotificationsDescription}"> Description="{Binding MaxNotificationsDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="NumberSymbol" /> <fi:SymbolIconSource Symbol="NumberSymbol" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ui:NumberBox Value="{Binding MaxNotificationsPerPosition}" <ui:NumberBox Value="{Binding MaxNotificationsPerPosition}"
Minimum="1" Minimum="1"
Maximum="10" Maximum="10"
Width="100" Width="100"
SpinButtonPlacementMode="Inline" /> SpinButtonPlacementMode="Inline" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<Separator Classes="settings-separator" /> <Separator Classes="settings-separator" />
@@ -69,12 +69,12 @@
Text="{Binding TestHeader}" Text="{Binding TestHeader}"
Margin="0,0,0,4" /> Margin="0,0,0,4" />
<ui:SettingsExpander Header="{Binding TestNotificationHeader}" <ui:FASettingsExpander Header="{Binding TestNotificationHeader}"
Description="{Binding TestNotificationDescription}"> Description="{Binding TestNotificationDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Beaker" /> <fi:SymbolIconSource Symbol="Beaker" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<StackPanel Orientation="Horizontal" Spacing="8"> <StackPanel Orientation="Horizontal" Spacing="8">
<ComboBox Width="120" <ComboBox Width="120"
ItemsSource="{Binding TestPositions}" ItemsSource="{Binding TestPositions}"
@@ -104,8 +104,8 @@
<fi:SymbolIcon Symbol="Send" FontSize="16" /> <fi:SymbolIcon Symbol="Send" FontSize="16" />
</Button> </Button>
</StackPanel> </StackPanel>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>

View File

@@ -3,7 +3,7 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia" xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia"
xmlns:helpers="using:LanMountainDesktop.Helpers" xmlns:helpers="using:LanMountainDesktop.Helpers"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.PluginCatalogDetailDrawer" x:Class="LanMountainDesktop.Views.SettingsPages.PluginCatalogDetailDrawer"
x:DataType="vm:PluginCatalogDetailViewModel"> x:DataType="vm:PluginCatalogDetailViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">

View File

@@ -2,18 +2,18 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.PluginCatalogSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.PluginCatalogSettingsPage"
x:Name="Root" x:Name="Root"
x:DataType="vm:PluginCatalogSettingsPageViewModel"> x:DataType="vm:PluginCatalogSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Classes="settings-page-container settings-page-animated"> <StackPanel Classes="settings-page-container settings-page-animated">
<ui:SettingsExpander Header="{Binding RefreshButtonText}" <ui:FASettingsExpander Header="{Binding RefreshButtonText}"
Description="{Binding StatusMessage}"> Description="{Binding StatusMessage}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="ShoppingBag" /> <fi:SymbolIconSource Symbol="ShoppingBag" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<Grid ColumnDefinitions="*,Auto" <Grid ColumnDefinitions="*,Auto"
ColumnSpacing="12"> ColumnSpacing="12">
<TextBox x:Name="SearchTextBox" <TextBox x:Name="SearchTextBox"
@@ -25,8 +25,8 @@
Command="{Binding RefreshCommand}" Command="{Binding RefreshCommand}"
Content="{Binding RefreshButtonText}" /> Content="{Binding RefreshButtonText}" />
</Grid> </Grid>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<TextBlock Classes="settings-item-description" <TextBlock Classes="settings-item-description"
IsVisible="{Binding ShowEmptyState}" IsVisible="{Binding ShowEmptyState}"

View File

@@ -3,22 +3,22 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:controls="using:LanMountainDesktop.Controls" xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.PluginsSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.PluginsSettingsPage"
x:Name="Root" x:Name="Root"
x:DataType="vm:PluginsSettingsPageViewModel"> x:DataType="vm:PluginsSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Classes="settings-page-container settings-page-animated"> <StackPanel Classes="settings-page-container settings-page-animated">
<ui:SettingsExpander Header="{Binding RefreshButtonText}" <ui:FASettingsExpander Header="{Binding RefreshButtonText}"
Description="{Binding StatusMessage}"> Description="{Binding StatusMessage}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="ArrowSync" /> <fi:SymbolIconSource Symbol="ArrowSync" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<Button Command="{Binding RefreshCommand}" <Button Command="{Binding RefreshCommand}"
Content="{Binding RefreshButtonText}" /> Content="{Binding RefreshButtonText}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<Separator Classes="settings-separator" /> <Separator Classes="settings-separator" />
@@ -29,17 +29,17 @@
<ItemsControl ItemsSource="{Binding InstalledPlugins}"> <ItemsControl ItemsSource="{Binding InstalledPlugins}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:InstalledPluginItemViewModel"> <DataTemplate x:DataType="vm:InstalledPluginItemViewModel">
<ui:SettingsExpander> <ui:FASettingsExpander>
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="PuzzleCube" /> <fi:SymbolIconSource Symbol="PuzzleCube" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Header> <ui:FASettingsExpander.Header>
<StackPanel> <StackPanel>
<TextBlock FontWeight="SemiBold" Text="{Binding Name}" /> <TextBlock FontWeight="SemiBold" Text="{Binding Name}" />
<TextBlock Opacity="0.76" FontSize="12" Text="{Binding Description}" /> <TextBlock Opacity="0.76" FontSize="12" Text="{Binding Description}" />
</StackPanel> </StackPanel>
</ui:SettingsExpander.Header> </ui:FASettingsExpander.Header>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<StackPanel Orientation="Horizontal" Spacing="8"> <StackPanel Orientation="Horizontal" Spacing="8">
<ToggleSwitch IsChecked="{Binding IsEnabled}" <ToggleSwitch IsChecked="{Binding IsEnabled}"
Command="{Binding #Root.DataContext.TogglePluginCommand}" Command="{Binding #Root.DataContext.TogglePluginCommand}"
@@ -48,8 +48,8 @@
CommandParameter="{Binding}" CommandParameter="{Binding}"
Content="{Binding #Root.DataContext.DeleteButtonText}" /> Content="{Binding #Root.DataContext.DeleteButtonText}" />
</StackPanel> </StackPanel>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>

View File

@@ -3,7 +3,7 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia" xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia"
xmlns:helpers="using:LanMountainDesktop.Helpers" xmlns:helpers="using:LanMountainDesktop.Helpers"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.PrivacyPolicyDrawer" x:Class="LanMountainDesktop.Views.SettingsPages.PrivacyPolicyDrawer"
x:DataType="vm:PrivacyPolicyViewModel"> x:DataType="vm:PrivacyPolicyViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">

View File

@@ -3,7 +3,7 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:controls="using:LanMountainDesktop.Controls" xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.PrivacySettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.PrivacySettingsPage"
x:DataType="vm:PrivacySettingsPageViewModel"> x:DataType="vm:PrivacySettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
@@ -12,25 +12,25 @@
Text="{Binding PrivacyHeader}" Text="{Binding PrivacyHeader}"
Margin="0,0,0,4" /> Margin="0,0,0,4" />
<ui:SettingsExpander Header="{Binding CrashUploadHeader}" <ui:FASettingsExpander Header="{Binding CrashUploadHeader}"
Description="{Binding CrashUploadDescription}"> Description="{Binding CrashUploadDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="ShieldDismiss" /> <fi:SymbolIconSource Symbol="ShieldDismiss" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding UploadAnonymousCrashData}" /> <ToggleSwitch IsChecked="{Binding UploadAnonymousCrashData}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="{Binding UsageUploadHeader}" <ui:FASettingsExpander Header="{Binding UsageUploadHeader}"
Description="{Binding UsageUploadDescription}"> Description="{Binding UsageUploadDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Info" /> <fi:SymbolIconSource Symbol="Info" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding UploadAnonymousUsageData}" /> <ToggleSwitch IsChecked="{Binding UploadAnonymousUsageData}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<Border Background="{DynamicResource CardBackgroundFillColorDefaultBrush}" <Border Background="{DynamicResource CardBackgroundFillColorDefaultBrush}"
CornerRadius="8" CornerRadius="8"

View File

@@ -3,7 +3,7 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:controls="using:LanMountainDesktop.Controls" xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.StatusBarSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.StatusBarSettingsPage"
x:DataType="vm:StatusBarSettingsPageViewModel"> x:DataType="vm:StatusBarSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
@@ -12,15 +12,15 @@
Text="{Binding ComponentsHeader}" Text="{Binding ComponentsHeader}"
Margin="0,0,0,4" /> Margin="0,0,0,4" />
<ui:SettingsExpander Header="{Binding ClockHeader}" <ui:FASettingsExpander Header="{Binding ClockHeader}"
Description="{Binding ClockDescription}"> Description="{Binding ClockDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Clock" /> <fi:SymbolIconSource Symbol="Clock" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding ShowClock}" /> <ToggleSwitch IsChecked="{Binding ShowClock}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding ClockFormatLabel}" <TextBlock Text="{Binding ClockFormatLabel}"
@@ -37,8 +37,8 @@
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="*,Auto" <Grid ColumnDefinitions="*,Auto"
ColumnSpacing="16"> ColumnSpacing="16">
<StackPanel Spacing="2"> <StackPanel Spacing="2">
@@ -51,8 +51,8 @@
IsChecked="{Binding ClockTransparentBackground}" IsChecked="{Binding ClockTransparentBackground}"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding ClockPositionLabel}" <TextBlock Text="{Binding ClockPositionLabel}"
@@ -69,8 +69,8 @@
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding ClockFontSizeLabel}" <TextBlock Text="{Binding ClockFontSizeLabel}"
@@ -87,18 +87,18 @@
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="{Binding TextCapsuleHeader}" <ui:FASettingsExpander Header="{Binding TextCapsuleHeader}"
Description="{Binding TextCapsuleDescription}"> Description="{Binding TextCapsuleDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="TextQuote" /> <fi:SymbolIconSource Symbol="TextQuote" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding ShowTextCapsule}" /> <ToggleSwitch IsChecked="{Binding ShowTextCapsule}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding TextCapsuleContentLabel}" <TextBlock Text="{Binding TextCapsuleContentLabel}"
@@ -112,8 +112,8 @@
Text="{Binding TextCapsuleContent}" Text="{Binding TextCapsuleContent}"
Watermark="Enter Markdown text..." /> Watermark="Enter Markdown text..." />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding TextCapsulePositionLabel}" <TextBlock Text="{Binding TextCapsulePositionLabel}"
@@ -130,8 +130,8 @@
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="*,Auto" <Grid ColumnDefinitions="*,Auto"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding TextCapsuleTransparentBackgroundLabel}" <TextBlock Text="{Binding TextCapsuleTransparentBackgroundLabel}"
@@ -141,18 +141,18 @@
IsEnabled="{Binding ShowTextCapsule}" IsEnabled="{Binding ShowTextCapsule}"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Header="{Binding NetworkSpeedHeader}" <ui:FASettingsExpander Header="{Binding NetworkSpeedHeader}"
Description="{Binding NetworkSpeedDescription}"> Description="{Binding NetworkSpeedDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="ArrowBidirectionalUpDown" /> <fi:SymbolIconSource Symbol="ArrowBidirectionalUpDown" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding ShowNetworkSpeed}" /> <ToggleSwitch IsChecked="{Binding ShowNetworkSpeed}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding NetworkSpeedPositionLabel}" <TextBlock Text="{Binding NetworkSpeedPositionLabel}"
@@ -169,8 +169,8 @@
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding NetworkSpeedDisplayModeLabel}" <TextBlock Text="{Binding NetworkSpeedDisplayModeLabel}"
@@ -187,8 +187,8 @@
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="*,Auto" <Grid ColumnDefinitions="*,Auto"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding NetworkSpeedTransparentBackgroundLabel}" <TextBlock Text="{Binding NetworkSpeedTransparentBackgroundLabel}"
@@ -198,8 +198,8 @@
IsEnabled="{Binding ShowNetworkSpeed}" IsEnabled="{Binding ShowNetworkSpeed}"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="*,Auto" <Grid ColumnDefinitions="*,Auto"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding ShowNetworkTypeIconLabel}" <TextBlock Text="{Binding ShowNetworkTypeIconLabel}"
@@ -209,8 +209,8 @@
IsEnabled="{Binding ShowNetworkSpeed}" IsEnabled="{Binding ShowNetworkSpeed}"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding NetworkSpeedFontSizeLabel}" <TextBlock Text="{Binding NetworkSpeedFontSizeLabel}"
@@ -227,8 +227,8 @@
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<Separator Classes="settings-separator" /> <Separator Classes="settings-separator" />
@@ -236,12 +236,12 @@
Text="{Binding SpacingHeader}" Text="{Binding SpacingHeader}"
Margin="0,0,0,4" /> Margin="0,0,0,4" />
<ui:SettingsExpander Header="{Binding SpacingHeader}" <ui:FASettingsExpander Header="{Binding SpacingHeader}"
Description="{Binding SpacingDescription}"> Description="{Binding SpacingDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Apps" /> <fi:SymbolIconSource Symbol="Apps" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="180" <ComboBox Width="180"
ItemsSource="{Binding SpacingModes}" ItemsSource="{Binding SpacingModes}"
SelectedItem="{Binding SelectedSpacingMode}"> SelectedItem="{Binding SelectedSpacingMode}">
@@ -251,8 +251,8 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
<ui:SettingsExpanderItem IsVisible="{Binding IsCustomSpacingVisible}"> <ui:FASettingsExpanderItem IsVisible="{Binding IsCustomSpacingVisible}">
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding CustomSpacingLabel}" <TextBlock Text="{Binding CustomSpacingLabel}"
@@ -266,8 +266,8 @@
SpinButtonPlacementMode="Inline" SpinButtonPlacementMode="Inline"
Value="{Binding CustomSpacingPercent}" /> Value="{Binding CustomSpacingPercent}" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<Separator Classes="settings-separator" /> <Separator Classes="settings-separator" />
@@ -275,15 +275,15 @@
Text="{Binding StatusBarShadowHeader}" Text="{Binding StatusBarShadowHeader}"
Margin="0,0,0,4" /> Margin="0,0,0,4" />
<ui:SettingsExpander Header="{Binding StatusBarShadowHeader}" <ui:FASettingsExpander Header="{Binding StatusBarShadowHeader}"
Description="{Binding StatusBarShadowDescription}"> Description="{Binding StatusBarShadowDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Square" /> <fi:SymbolIconSource Symbol="Square" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding StatusBarShadowEnabled}" /> <ToggleSwitch IsChecked="{Binding StatusBarShadowEnabled}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding StatusBarShadowColorLabel}" <TextBlock Text="{Binding StatusBarShadowColorLabel}"
@@ -302,8 +302,8 @@
</Button.Flyout> </Button.Flyout>
</Button> </Button>
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="Auto,*" <Grid ColumnDefinitions="Auto,*"
ColumnSpacing="16"> ColumnSpacing="16">
<TextBlock Text="{Binding StatusBarShadowOpacityLabel}" <TextBlock Text="{Binding StatusBarShadowOpacityLabel}"
@@ -315,8 +315,8 @@
IsEnabled="{Binding StatusBarShadowEnabled}" IsEnabled="{Binding StatusBarShadowEnabled}"
Value="{Binding StatusBarShadowOpacity}" /> Value="{Binding StatusBarShadowOpacity}" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</UserControl> </UserControl>

View File

@@ -2,35 +2,35 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.StudySettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.StudySettingsPage"
x:DataType="vm:StudySettingsPageViewModel"> x:DataType="vm:StudySettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Classes="settings-page-container settings-page-animated"> <StackPanel Classes="settings-page-container settings-page-animated">
<!-- 总开关 --> <!-- 閹绱戦崗?-->
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding MasterSwitchHeader}" Header="{Binding MasterSwitchHeader}"
Description="{Binding MasterSwitchDescription}"> Description="{Binding MasterSwitchDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="DataHistogram" /> <fi:SymbolIconSource Symbol="DataHistogram" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding StudyEnabled}" /> <ToggleSwitch IsChecked="{Binding StudyEnabled}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<!-- 噪音监测设置 --> <!-- 閸n亪鐓堕惄鎴炵ゴ鐠佸墽鐤?-->
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding NoiseMonitoringHeader}" Header="{Binding NoiseMonitoringHeader}"
Description="{Binding NoiseMonitoringDescription}" Description="{Binding NoiseMonitoringDescription}"
IsEnabled="{Binding StudyEnabled}"> IsEnabled="{Binding StudyEnabled}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Mic" /> <fi:SymbolIconSource Symbol="Mic" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<!-- 采集频率 --> <!-- 闁插洭娉︽0鎴犲芳 -->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
@@ -52,10 +52,10 @@
TickFrequency="20" TickFrequency="20"
IsSnapToTickEnabled="True" /> IsSnapToTickEnabled="True" />
</StackPanel> </StackPanel>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<!-- 噪音敏感度 --> <!-- 閸n亪鐓堕弫蹇斿妳鎼?-->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
@@ -77,27 +77,27 @@
TickFrequency="5" TickFrequency="5"
IsSnapToTickEnabled="True" /> IsSnapToTickEnabled="True" />
</StackPanel> </StackPanel>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<!-- 评分阈值显示 --> <!-- 鐠囧嫬鍨庨梼鍫濃偓鍏兼▔缁€?-->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<TextBlock Classes="settings-item-description" <TextBlock Classes="settings-item-description"
Text="{Binding CurrentThresholdText}" Text="{Binding CurrentThresholdText}"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<!-- 专注计时设置 --> <!-- 娑撴挻鏁炵拋鈩冩鐠佸墽鐤?-->
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding FocusTimerHeader}" Header="{Binding FocusTimerHeader}"
Description="{Binding FocusTimerDescription}" Description="{Binding FocusTimerDescription}"
IsEnabled="{Binding StudyEnabled}"> IsEnabled="{Binding StudyEnabled}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Timer" /> <fi:SymbolIconSource Symbol="Timer" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<!-- 专注时长 --> <!-- 娑撴挻鏁為弮鍫曟毐 -->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
@@ -119,10 +119,10 @@
TickFrequency="5" TickFrequency="5"
IsSnapToTickEnabled="True" /> IsSnapToTickEnabled="True" />
</StackPanel> </StackPanel>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<!-- 休息时长 --> <!-- 娴兼垶浼呴弮鍫曟毐 -->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
@@ -144,10 +144,10 @@
TickFrequency="5" TickFrequency="5"
IsSnapToTickEnabled="True" /> IsSnapToTickEnabled="True" />
</StackPanel> </StackPanel>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<!-- 长休息时长 --> <!-- 闂€澶哥搐閹垱妞傞梹?-->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
@@ -169,10 +169,10 @@
TickFrequency="5" TickFrequency="5"
IsSnapToTickEnabled="True" /> IsSnapToTickEnabled="True" />
</StackPanel> </StackPanel>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<!-- 长休息间隔 --> <!-- 闂€澶哥搐閹垶妫块梾?-->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
@@ -194,10 +194,10 @@
TickFrequency="1" TickFrequency="1"
IsSnapToTickEnabled="True" /> IsSnapToTickEnabled="True" />
</StackPanel> </StackPanel>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<!-- 自动开始休息 --> <!-- 閼奉亜濮╁鈧慨瀣╃搐閹?-->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
<TextBlock Classes="settings-item-label" <TextBlock Classes="settings-item-label"
@@ -208,10 +208,10 @@
<ToggleSwitch Grid.Column="1" <ToggleSwitch Grid.Column="1"
IsChecked="{Binding AutoStartBreak}" /> IsChecked="{Binding AutoStartBreak}" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<!-- 自动开始专注 --> <!-- 閼奉亜濮╁鈧慨瀣╃瑩濞?-->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
<TextBlock Classes="settings-item-label" <TextBlock Classes="settings-item-label"
@@ -222,20 +222,20 @@
<ToggleSwitch Grid.Column="1" <ToggleSwitch Grid.Column="1"
IsChecked="{Binding AutoStartFocus}" /> IsChecked="{Binding AutoStartFocus}" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<!-- 提醒设置 --> <!-- 閹绘劙鍟嬬拋鍓х枂 -->
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding AlertHeader}" Header="{Binding AlertHeader}"
Description="{Binding AlertDescription}" Description="{Binding AlertDescription}"
IsEnabled="{Binding StudyEnabled}"> IsEnabled="{Binding StudyEnabled}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Alert" /> <fi:SymbolIconSource Symbol="Alert" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<!-- 噪音打断提醒 --> <!-- 閸n亪鐓堕幍鎾存焽閹绘劙鍟?-->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
<TextBlock Classes="settings-item-label" <TextBlock Classes="settings-item-label"
@@ -246,10 +246,10 @@
<ToggleSwitch Grid.Column="1" <ToggleSwitch Grid.Column="1"
IsChecked="{Binding NoiseAlertEnabled}" /> IsChecked="{Binding NoiseAlertEnabled}" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<!-- 每分钟最大容忍打断次数 --> <!-- 濮e繐鍨庨柦鐔告付婢堆冾啇韫囧秵澧﹂弬顓燁偧閺?-->
<ui:SettingsExpanderItem IsVisible="{Binding NoiseAlertEnabled}"> <ui:FASettingsExpanderItem IsVisible="{Binding NoiseAlertEnabled}">
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
<TextBlock Classes="settings-item-label" <TextBlock Classes="settings-item-label"
@@ -264,20 +264,20 @@
Increment="1" Increment="1"
Value="{Binding MaxInterruptsPerMinute}" /> Value="{Binding MaxInterruptsPerMinute}" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<!-- 显示设置 --> <!-- 閺勫墽銇氱拋鍓х枂 -->
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding DisplayHeader}" Header="{Binding DisplayHeader}"
Description="{Binding DisplayDescription}" Description="{Binding DisplayDescription}"
IsEnabled="{Binding StudyEnabled}"> IsEnabled="{Binding StudyEnabled}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Eye" /> <fi:SymbolIconSource Symbol="Eye" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<!-- 显示实时分贝 --> <!-- 閺勫墽銇氱€圭偞妞傞崚鍡氱 -->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
<TextBlock Classes="settings-item-label" <TextBlock Classes="settings-item-label"
@@ -288,10 +288,10 @@
<ToggleSwitch Grid.Column="1" <ToggleSwitch Grid.Column="1"
IsChecked="{Binding ShowRealtimeDb}" /> IsChecked="{Binding ShowRealtimeDb}" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<!-- 基准显示分贝 --> <!-- 閸╁搫鍣弰鍓с仛閸掑棜绀?-->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
@@ -313,10 +313,10 @@
TickFrequency="5" TickFrequency="5"
IsSnapToTickEnabled="True" /> IsSnapToTickEnabled="True" />
</StackPanel> </StackPanel>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<!-- 平均时间窗 --> <!-- 楠炲啿娼庨弮鍫曟?缁?-->
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="16"> <Grid ColumnDefinitions="*,Auto" ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
@@ -338,8 +338,8 @@
TickFrequency="1" TickFrequency="1"
IsSnapToTickEnabled="True" /> IsSnapToTickEnabled="True" />
</StackPanel> </StackPanel>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<TextBlock Classes="settings-item-description" <TextBlock Classes="settings-item-description"
Margin="0,8,0,0" Margin="0,8,0,0"

View File

@@ -3,7 +3,7 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:controls="using:LanMountainDesktop.Controls" xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.UpdateSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.UpdateSettingsPage"
x:DataType="vm:UpdateSettingsPageViewModel"> x:DataType="vm:UpdateSettingsPageViewModel">
<UserControl.Styles> <UserControl.Styles>
@@ -163,13 +163,13 @@
Margin="0,0,0,18" Margin="0,0,0,18"
Text="{Binding PreferencesDescription}" /> Text="{Binding PreferencesDescription}" />
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding UpdateChannelLabel}" Header="{Binding UpdateChannelLabel}"
Description="{Binding SelectedUpdateChannelDescription}"> Description="{Binding SelectedUpdateChannelDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="BranchFork" /> <fi:SymbolIconSource Symbol="BranchFork" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="220" <ComboBox Width="220"
ItemsSource="{Binding UpdateChannelOptions}" ItemsSource="{Binding UpdateChannelOptions}"
SelectedItem="{Binding SelectedUpdateChannelOption}"> SelectedItem="{Binding SelectedUpdateChannelOption}">
@@ -179,24 +179,24 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
<ui:SettingsExpanderItem Content="{Binding ForceCheckUpdateLabel}" <ui:FASettingsExpanderItem Content="{Binding ForceCheckUpdateLabel}"
Description="{Binding ForceCheckUpdateDescription}" Description="{Binding ForceCheckUpdateDescription}"
IsClickEnabled="True" IsClickEnabled="True"
Command="{Binding ForceCheckUpdateCommand}"> Command="{Binding ForceCheckUpdateCommand}">
<ui:SettingsExpanderItem.IconSource> <ui:FASettingsExpanderItem.IconSource>
<fi:SymbolIconSource Symbol="ArrowSync" /> <fi:SymbolIconSource Symbol="ArrowSync" />
</ui:SettingsExpanderItem.IconSource> </ui:FASettingsExpanderItem.IconSource>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding UpdateSourceLabel}" Header="{Binding UpdateSourceLabel}"
Description="{Binding SelectedUpdateSourceDescription}"> Description="{Binding SelectedUpdateSourceDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="GlobeArrowForward" /> <fi:SymbolIconSource Symbol="GlobeArrowForward" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="220" <ComboBox Width="220"
ItemsSource="{Binding UpdateSourceOptions}" ItemsSource="{Binding UpdateSourceOptions}"
SelectedItem="{Binding SelectedUpdateSourceOption}"> SelectedItem="{Binding SelectedUpdateSourceOption}">
@@ -206,16 +206,16 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding UpdateModeLabel}" Header="{Binding UpdateModeLabel}"
Description="{Binding SelectedUpdateModeDescription}"> Description="{Binding SelectedUpdateModeDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Options" /> <fi:SymbolIconSource Symbol="Options" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="260" <ComboBox Width="260"
ItemsSource="{Binding UpdateModeOptions}" ItemsSource="{Binding UpdateModeOptions}"
SelectedItem="{Binding SelectedUpdateModeOption}"> SelectedItem="{Binding SelectedUpdateModeOption}">
@@ -225,23 +225,23 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding DownloadThreadsLabel}" Header="{Binding DownloadThreadsLabel}"
Description="{Binding DownloadThreadsDescription}"> Description="{Binding DownloadThreadsDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="ArrowDownload" /> <fi:SymbolIconSource Symbol="ArrowDownload" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ui:NumberBox Width="160" <ui:NumberBox Width="160"
Minimum="1" Minimum="1"
Maximum="128" Maximum="128"
SpinButtonPlacementMode="Inline" SpinButtonPlacementMode="Inline"
Value="{Binding DownloadThreadsSliderValue}" /> Value="{Binding DownloadThreadsSliderValue}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
</StackPanel> </StackPanel>

View File

@@ -3,33 +3,34 @@
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:controls="using:LanMountainDesktop.Controls" xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.WallpaperSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.WallpaperSettingsPage"
x:DataType="vm:WallpaperSettingsPageViewModel"> x:DataType="vm:WallpaperSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Classes="settings-page-container settings-page-animated"> <StackPanel Classes="settings-page-container settings-page-animated">
<Grid ColumnDefinitions="*,*"
<!-- 预览与颜色选择区域 --> ColumnSpacing="32"
<Grid ColumnDefinitions="*,*" ColumnSpacing="32" Margin="0,0,0,32"> Margin="0,0,0,32">
<!-- 左侧:模拟屏幕预览 (占一半宽度) --> <Border Grid.Column="0"
<Border Grid.Column="0" VerticalAlignment="Top"> VerticalAlignment="Top">
<Viewbox Stretch="Uniform"> <Viewbox Stretch="Uniform">
<Border Width="1600" Height="900" <Border Width="1600"
Height="900"
Background="#080808" Background="#080808"
BorderBrush="#1A1A1A" BorderBrush="#1A1A1A"
BorderThickness="24" BorderThickness="24"
CornerRadius="48" CornerRadius="48"
BoxShadow="0 12 32 #50000000"> BoxShadow="0 12 32 #50000000">
<Panel Background="{DynamicResource AdaptiveSurfaceBaseBrush}" Margin="2"> <Panel Background="{DynamicResource AdaptiveSurfaceBaseBrush}"
<!-- 图片预览 --> Margin="2">
<Border Background="#FFF6F7F9" <Border Background="#FFF6F7F9"
IsVisible="{Binding IsImage}"> IsVisible="{Binding IsImage}">
<Border Background="{Binding PreviewBrush}" /> <Border Background="{Binding PreviewBrush}" />
</Border> </Border>
<!-- 纯色预览 -->
<Border Background="{Binding SelectedColor}" <Border Background="{Binding SelectedColor}"
IsVisible="{Binding IsSolidColor}" /> IsVisible="{Binding IsSolidColor}" />
<!-- 系统壁纸预览 -->
<Border Background="#FFF6F7F9" <Border Background="#FFF6F7F9"
IsVisible="{Binding IsSystemWallpaper}"> IsVisible="{Binding IsSystemWallpaper}">
<Border Background="{Binding PreviewBrush}" /> <Border Background="{Binding PreviewBrush}" />
@@ -39,100 +40,139 @@
</Viewbox> </Viewbox>
</Border> </Border>
<!-- 右侧:颜色选择网格 --> <StackPanel Grid.Column="1"
<StackPanel Grid.Column="1" VerticalAlignment="Center" Spacing="12" IsVisible="{Binding IsSolidColor}"> VerticalAlignment="Center"
Spacing="12"
IsVisible="{Binding IsSolidColor}">
<TextBlock Text="{Binding WallpaperColorLabel}" <TextBlock Text="{Binding WallpaperColorLabel}"
FontSize="14" FontSize="14"
FontWeight="SemiBold" FontWeight="SemiBold"
Opacity="0.8" /> Opacity="0.8" />
<UniformGrid Columns="4" Rows="3"> <UniformGrid Columns="4"
<!-- 预设颜色 1-11 --> Rows="3">
<Button Width="48" Height="48" Margin="4" Padding="0" <Button Width="48"
Height="48"
Margin="4"
Padding="0"
Background="#D8A7B1" Background="#D8A7B1"
BorderThickness="0" BorderThickness="0"
CornerRadius="6" CornerRadius="6"
Command="{Binding SelectColorCommand}" Command="{Binding SelectColorCommand}"
CommandParameter="#D8A7B1" CommandParameter="#D8A7B1"
ToolTip.Tip="#D8A7B1" /> ToolTip.Tip="#D8A7B1" />
<Button Width="48" Height="48" Margin="4" Padding="0" <Button Width="48"
Height="48"
Margin="4"
Padding="0"
Background="#B6C9BB" Background="#B6C9BB"
BorderThickness="0" BorderThickness="0"
CornerRadius="6" CornerRadius="6"
Command="{Binding SelectColorCommand}" Command="{Binding SelectColorCommand}"
CommandParameter="#B6C9BB" CommandParameter="#B6C9BB"
ToolTip.Tip="#B6C9BB" /> ToolTip.Tip="#B6C9BB" />
<Button Width="48" Height="48" Margin="4" Padding="0" <Button Width="48"
Height="48"
Margin="4"
Padding="0"
Background="#A2B5BB" Background="#A2B5BB"
BorderThickness="0" BorderThickness="0"
CornerRadius="6" CornerRadius="6"
Command="{Binding SelectColorCommand}" Command="{Binding SelectColorCommand}"
CommandParameter="#A2B5BB" CommandParameter="#A2B5BB"
ToolTip.Tip="#A2B5BB" /> ToolTip.Tip="#A2B5BB" />
<Button Width="48" Height="48" Margin="4" Padding="0" <Button Width="48"
Height="48"
Margin="4"
Padding="0"
Background="#E6E2D3" Background="#E6E2D3"
BorderThickness="0" BorderThickness="0"
CornerRadius="6" CornerRadius="6"
Command="{Binding SelectColorCommand}" Command="{Binding SelectColorCommand}"
CommandParameter="#E6E2D3" CommandParameter="#E6E2D3"
ToolTip.Tip="#E6E2D3" /> ToolTip.Tip="#E6E2D3" />
<Button Width="48" Height="48" Margin="4" Padding="0" <Button Width="48"
Height="48"
Margin="4"
Padding="0"
Background="#B5A397" Background="#B5A397"
BorderThickness="0" BorderThickness="0"
CornerRadius="6" CornerRadius="6"
Command="{Binding SelectColorCommand}" Command="{Binding SelectColorCommand}"
CommandParameter="#B5A397" CommandParameter="#B5A397"
ToolTip.Tip="#B5A397" /> ToolTip.Tip="#B5A397" />
<Button Width="48" Height="48" Margin="4" Padding="0" <Button Width="48"
Height="48"
Margin="4"
Padding="0"
Background="#C5C1C0" Background="#C5C1C0"
BorderThickness="0" BorderThickness="0"
CornerRadius="6" CornerRadius="6"
Command="{Binding SelectColorCommand}" Command="{Binding SelectColorCommand}"
CommandParameter="#C5C1C0" CommandParameter="#C5C1C0"
ToolTip.Tip="#C5C1C0" /> ToolTip.Tip="#C5C1C0" />
<Button Width="48" Height="48" Margin="4" Padding="0" <Button Width="48"
Height="48"
Margin="4"
Padding="0"
Background="#D4BE8D" Background="#D4BE8D"
BorderThickness="0" BorderThickness="0"
CornerRadius="6" CornerRadius="6"
Command="{Binding SelectColorCommand}" Command="{Binding SelectColorCommand}"
CommandParameter="#D4BE8D" CommandParameter="#D4BE8D"
ToolTip.Tip="#D4BE8D" /> ToolTip.Tip="#D4BE8D" />
<Button Width="48" Height="48" Margin="4" Padding="0" <Button Width="48"
Height="48"
Margin="4"
Padding="0"
Background="#C08261" Background="#C08261"
BorderThickness="0" BorderThickness="0"
CornerRadius="6" CornerRadius="6"
Command="{Binding SelectColorCommand}" Command="{Binding SelectColorCommand}"
CommandParameter="#C08261" CommandParameter="#C08261"
ToolTip.Tip="#C08261" /> ToolTip.Tip="#C08261" />
<Button Width="48" Height="48" Margin="4" Padding="0" <Button Width="48"
Height="48"
Margin="4"
Padding="0"
Background="#8E9775" Background="#8E9775"
BorderThickness="0" BorderThickness="0"
CornerRadius="6" CornerRadius="6"
Command="{Binding SelectColorCommand}" Command="{Binding SelectColorCommand}"
CommandParameter="#8E9775" CommandParameter="#8E9775"
ToolTip.Tip="#8E9775" /> ToolTip.Tip="#8E9775" />
<Button Width="48" Height="48" Margin="4" Padding="0" <Button Width="48"
Height="48"
Margin="4"
Padding="0"
Background="#9FBAD3" Background="#9FBAD3"
BorderThickness="0" BorderThickness="0"
CornerRadius="6" CornerRadius="6"
Command="{Binding SelectColorCommand}" Command="{Binding SelectColorCommand}"
CommandParameter="#9FBAD3" CommandParameter="#9FBAD3"
ToolTip.Tip="#9FBAD3" /> ToolTip.Tip="#9FBAD3" />
<Button Width="48" Height="48" Margin="4" Padding="0" <Button Width="48"
Height="48"
Margin="4"
Padding="0"
Background="#E5BAA2" Background="#E5BAA2"
BorderThickness="0" BorderThickness="0"
CornerRadius="6" CornerRadius="6"
Command="{Binding SelectColorCommand}" Command="{Binding SelectColorCommand}"
CommandParameter="#E5BAA2" CommandParameter="#E5BAA2"
ToolTip.Tip="#E5BAA2" /> ToolTip.Tip="#E5BAA2" />
<!-- 第12个位置自定义颜色选择器 -->
<Button Width="48" Height="48" Margin="4" Padding="0" <Button Width="48"
Height="48"
Margin="4"
Padding="0"
Background="{Binding CustomColorBrush}" Background="{Binding CustomColorBrush}"
BorderThickness="0" BorderThickness="0"
CornerRadius="6" CornerRadius="6"
ToolTip.Tip="自定义颜色"> ToolTip.Tip="Custom color">
<Button.Flyout> <Button.Flyout>
<Flyout Placement="BottomEdgeAlignedLeft"> <Flyout Placement="BottomEdgeAlignedLeft">
<StackPanel Width="260" Spacing="12"> <StackPanel Width="260"
Spacing="12">
<ColorPicker Color="{Binding CustomColor}" /> <ColorPicker Color="{Binding CustomColor}" />
</StackPanel> </StackPanel>
</Flyout> </Flyout>
@@ -141,8 +181,10 @@
</UniformGrid> </UniformGrid>
</StackPanel> </StackPanel>
<!-- 右侧:系统壁纸状态 --> <StackPanel Grid.Column="1"
<StackPanel Grid.Column="1" VerticalAlignment="Center" Spacing="12" IsVisible="{Binding IsSystemWallpaper}"> VerticalAlignment="Center"
Spacing="12"
IsVisible="{Binding IsSystemWallpaper}">
<TextBlock Text="{Binding SystemWallpaperLabel}" <TextBlock Text="{Binding SystemWallpaperLabel}"
FontSize="14" FontSize="14"
FontWeight="SemiBold" FontWeight="SemiBold"
@@ -155,19 +197,18 @@
</StackPanel> </StackPanel>
</Grid> </Grid>
<Separator Classes="settings-separator" Margin="0,0,0,24" /> <Separator Classes="settings-separator"
Margin="0,0,0,24" />
<!-- 基本设置项 -->
<controls:IconText Icon="Image" <controls:IconText Icon="Image"
Text="{Binding WallpaperHeader}" Text="{Binding WallpaperHeader}"
Margin="0,0,0,8" /> Margin="0,0,0,8" />
<!-- 壁纸类型 --> <ui:FASettingsExpander Header="{Binding WallpaperTypeLabel}">
<ui:SettingsExpander Header="{Binding WallpaperTypeLabel}"> <ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Layer" /> <fi:SymbolIconSource Symbol="Layer" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="200" <ComboBox Width="200"
ItemsSource="{Binding WallpaperTypes}" ItemsSource="{Binding WallpaperTypes}"
SelectedItem="{Binding SelectedWallpaperType}"> SelectedItem="{Binding SelectedWallpaperType}">
@@ -177,18 +218,18 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<!-- 图片文件选择 --> <ui:FASettingsExpander Header="{Binding WallpaperPathLabel}"
<ui:SettingsExpander Header="{Binding WallpaperPathLabel}"
IsVisible="{Binding IsImage}" IsVisible="{Binding IsImage}"
Margin="0,4,0,0"> Margin="0,4,0,0">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="FolderOpen" /> <fi:SymbolIconSource Symbol="FolderOpen" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<StackPanel Orientation="Horizontal" Spacing="8"> <StackPanel Orientation="Horizontal"
Spacing="8">
<TextBox IsReadOnly="True" <TextBox IsReadOnly="True"
Width="300" Width="300"
Text="{Binding WallpaperPath}" Text="{Binding WallpaperPath}"
@@ -198,18 +239,18 @@
Content="{Binding ImportWallpaperButtonText}" Content="{Binding ImportWallpaperButtonText}"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
</StackPanel> </StackPanel>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<!-- 系统壁纸刷新设置 --> <ui:FASettingsExpander Header="{Binding RefreshIntervalLabel}"
<ui:SettingsExpander Header="{Binding RefreshIntervalLabel}"
IsVisible="{Binding IsSystemWallpaper}" IsVisible="{Binding IsSystemWallpaper}"
Margin="0,4,0,0"> Margin="0,4,0,0">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Clock" /> <fi:SymbolIconSource Symbol="Clock" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<StackPanel Orientation="Horizontal" Spacing="8"> <StackPanel Orientation="Horizontal"
Spacing="8">
<ComboBox Width="140" <ComboBox Width="140"
ItemsSource="{Binding RefreshIntervals}" ItemsSource="{Binding RefreshIntervals}"
SelectedItem="{Binding SelectedRefreshInterval}"> SelectedItem="{Binding SelectedRefreshInterval}">
@@ -224,21 +265,21 @@
ToolTip.Tip="{Binding RefreshButtonTooltip}" ToolTip.Tip="{Binding RefreshButtonTooltip}"
VerticalAlignment="Center" VerticalAlignment="Center"
Padding="12,8"> Padding="12,8">
<fi:SymbolIcon Symbol="ArrowSync" IconVariant="Regular" /> <fi:SymbolIcon Symbol="ArrowSync"
IconVariant="Regular" />
</Button> </Button>
</StackPanel> </StackPanel>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<!-- 填充方式(图片和系统壁纸都显示) --> <ui:FASettingsExpander Header="{Binding WallpaperPlacementLabel}"
<ui:SettingsExpander Header="{Binding WallpaperPlacementLabel}"
Description="{Binding WallpaperPlacementDescription}" Description="{Binding WallpaperPlacementDescription}"
IsVisible="{Binding IsImageOrVideo}" IsVisible="{Binding IsImage}"
Margin="0,4,0,0"> Margin="0,4,0,0">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Maximize" /> <fi:SymbolIconSource Symbol="Maximize" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="200" <ComboBox Width="200"
ItemsSource="{Binding WallpaperPlacements}" ItemsSource="{Binding WallpaperPlacements}"
SelectedItem="{Binding SelectedWallpaperPlacement}"> SelectedItem="{Binding SelectedWallpaperPlacement}">
@@ -248,18 +289,17 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<!-- 系统壁纸填充方式 --> <ui:FASettingsExpander Header="{Binding WallpaperPlacementLabel}"
<ui:SettingsExpander Header="{Binding WallpaperPlacementLabel}"
Description="{Binding WallpaperPlacementDescription}" Description="{Binding WallpaperPlacementDescription}"
IsVisible="{Binding IsSystemWallpaper}" IsVisible="{Binding IsSystemWallpaper}"
Margin="0,4,0,0"> Margin="0,4,0,0">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Maximize" /> <fi:SymbolIconSource Symbol="Maximize" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="200" <ComboBox Width="200"
ItemsSource="{Binding WallpaperPlacements}" ItemsSource="{Binding WallpaperPlacements}"
SelectedItem="{Binding SelectedWallpaperPlacement}"> SelectedItem="{Binding SelectedWallpaperPlacement}">
@@ -269,9 +309,8 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</UserControl> </UserControl>

View File

@@ -4,7 +4,7 @@
xmlns:models="using:LanMountainDesktop.Models" xmlns:models="using:LanMountainDesktop.Models"
xmlns:controls="using:LanMountainDesktop.Controls" xmlns:controls="using:LanMountainDesktop.Controls"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsPages.WeatherSettingsPage" x:Class="LanMountainDesktop.Views.SettingsPages.WeatherSettingsPage"
x:DataType="vm:WeatherSettingsPageViewModel"> x:DataType="vm:WeatherSettingsPageViewModel">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
@@ -56,13 +56,13 @@
</Grid> </Grid>
</Border> </Border>
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding LocationSourceHeader}" Header="{Binding LocationSourceHeader}"
Description="{Binding LocationSourceDescription}"> Description="{Binding LocationSourceDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="WeatherMoon" /> <fi:SymbolIconSource Symbol="WeatherMoon" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ComboBox Width="220" <ComboBox Width="220"
ItemsSource="{Binding LocationModes}" ItemsSource="{Binding LocationModes}"
SelectedItem="{Binding SelectedLocationMode}"> SelectedItem="{Binding SelectedLocationMode}">
@@ -72,27 +72,27 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<TextBlock Classes="settings-item-description" <TextBlock Classes="settings-item-description"
Text="{Binding CurrentLocationSummary}" Text="{Binding CurrentLocationSummary}"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding CitySearchHeader}" Header="{Binding CitySearchHeader}"
Description="{Binding CitySearchDescription}" Description="{Binding CitySearchDescription}"
IsVisible="{Binding IsCitySearchMode}"> IsVisible="{Binding IsCitySearchMode}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Search" /> <fi:SymbolIconSource Symbol="Search" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<Button Classes="settings-accent-button" <Button Classes="settings-accent-button"
Command="{Binding ApplyCitySelectionCommand}" Command="{Binding ApplyCitySelectionCommand}"
Content="{Binding ApplyCityButtonText}" /> Content="{Binding ApplyCityButtonText}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<StackPanel Spacing="14"> <StackPanel Spacing="14">
<Grid ColumnDefinitions="*,Auto" <Grid ColumnDefinitions="*,Auto"
ColumnSpacing="12"> ColumnSpacing="12">
@@ -140,22 +140,22 @@
</ListBox.ItemTemplate> </ListBox.ItemTemplate>
</ListBox> </ListBox>
</StackPanel> </StackPanel>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding CoordinatesHeader}" Header="{Binding CoordinatesHeader}"
Description="{Binding CoordinatesDescription}" Description="{Binding CoordinatesDescription}"
IsVisible="{Binding IsCoordinatesMode}"> IsVisible="{Binding IsCoordinatesMode}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Location" /> <fi:SymbolIconSource Symbol="Location" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<Button Classes="settings-accent-button" <Button Classes="settings-accent-button"
Command="{Binding ApplyCoordinatesCommand}" Command="{Binding ApplyCoordinatesCommand}"
Content="{Binding ApplyCoordinatesButtonText}" /> Content="{Binding ApplyCoordinatesButtonText}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="*,*" <Grid ColumnDefinitions="*,*"
Classes="settings-inline-pair"> Classes="settings-inline-pair">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
@@ -179,36 +179,36 @@
Value="{Binding Longitude}" /> Value="{Binding Longitude}" />
</StackPanel> </StackPanel>
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<TextBox x:Name="LocationKeyTextBox" <TextBox x:Name="LocationKeyTextBox"
Text="{Binding LocationKey}" Text="{Binding LocationKey}"
Watermark="{Binding LocationKeyPlaceholder}" Watermark="{Binding LocationKeyPlaceholder}"
Focusable="True" Focusable="True"
IsTabStop="True" /> IsTabStop="True" />
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<TextBox x:Name="LocationNameTextBox" <TextBox x:Name="LocationNameTextBox"
Text="{Binding LocationName}" Text="{Binding LocationName}"
Watermark="{Binding LocationNamePlaceholder}" Watermark="{Binding LocationNamePlaceholder}"
Focusable="True" Focusable="True"
IsTabStop="True" /> IsTabStop="True" />
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding LocationServicesHeader}" Header="{Binding LocationServicesHeader}"
Description="{Binding LocationServicesDescription}"> Description="{Binding LocationServicesDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Location" /> <fi:SymbolIconSource Symbol="Location" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<Button Classes="settings-accent-button" <Button Classes="settings-accent-button"
Command="{Binding UseCurrentLocationCommand}" Command="{Binding UseCurrentLocationCommand}"
Content="{Binding UseCurrentLocationButtonText}" Content="{Binding UseCurrentLocationButtonText}"
IsVisible="{Binding IsLocationSupported}" /> IsVisible="{Binding IsLocationSupported}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<Grid ColumnDefinitions="*,Auto" <Grid ColumnDefinitions="*,Auto"
ColumnSpacing="16"> ColumnSpacing="16">
<StackPanel Classes="settings-item"> <StackPanel Classes="settings-item">
@@ -222,23 +222,23 @@
IsChecked="{Binding AutoRefreshLocation}" IsChecked="{Binding AutoRefreshLocation}"
IsEnabled="{Binding IsLocationSupported}" /> IsEnabled="{Binding IsLocationSupported}" />
</Grid> </Grid>
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
<ui:SettingsExpanderItem IsVisible="{Binding IsRefreshingLocation}"> <ui:FASettingsExpanderItem IsVisible="{Binding IsRefreshingLocation}">
<ui:ProgressRing IsIndeterminate="True" <ui:ProgressRing IsIndeterminate="True"
IsVisible="{Binding IsRefreshingLocation}" IsVisible="{Binding IsRefreshingLocation}"
Width="28" Width="28"
Height="28" Height="28"
HorizontalAlignment="Left" /> HorizontalAlignment="Left" />
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding AlertFilterHeader}" Header="{Binding AlertFilterHeader}"
Description="{Binding AlertFilterDescription}"> Description="{Binding AlertFilterDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="Warning" /> <fi:SymbolIconSource Symbol="Warning" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<TextBox x:Name="ExcludedAlertsTextBox" <TextBox x:Name="ExcludedAlertsTextBox"
Width="360" Width="360"
MinHeight="120" MinHeight="120"
@@ -247,24 +247,24 @@
Text="{Binding ExcludedAlerts}" Text="{Binding ExcludedAlerts}"
Focusable="True" Focusable="True"
IsTabStop="True" /> IsTabStop="True" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
</ui:SettingsExpander> </ui:FASettingsExpander>
<ui:SettingsExpander Classes="settings-expander-card" <ui:FASettingsExpander Classes="settings-expander-card"
Header="{Binding RequestHeader}" Header="{Binding RequestHeader}"
Description="{Binding RequestDescription}"> Description="{Binding RequestDescription}">
<ui:SettingsExpander.IconSource> <ui:FASettingsExpander.IconSource>
<fi:SymbolIconSource Symbol="ShieldDismiss" /> <fi:SymbolIconSource Symbol="ShieldDismiss" />
</ui:SettingsExpander.IconSource> </ui:FASettingsExpander.IconSource>
<ui:SettingsExpander.Footer> <ui:FASettingsExpander.Footer>
<ToggleSwitch IsChecked="{Binding NoTlsRequests}" /> <ToggleSwitch IsChecked="{Binding NoTlsRequests}" />
</ui:SettingsExpander.Footer> </ui:FASettingsExpander.Footer>
<ui:SettingsExpanderItem> <ui:FASettingsExpanderItem>
<TextBlock Classes="settings-item-description" <TextBlock Classes="settings-item-description"
Text="{Binding NoTlsToggleText}" Text="{Binding NoTlsToggleText}"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
</ui:SettingsExpanderItem> </ui:FASettingsExpanderItem>
</ui:SettingsExpander> </ui:FASettingsExpander>
<TextBlock Classes="settings-item-description" <TextBlock Classes="settings-item-description"
Margin="0,8,0,0" Margin="0,8,0,0"

View File

@@ -2,7 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:LanMountainDesktop.ViewModels" xmlns:vm="using:LanMountainDesktop.ViewModels"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:fi="using:FluentIcons.Avalonia.Fluent" xmlns:fi="using:FluentIcons.Avalonia"
x:Class="LanMountainDesktop.Views.SettingsWindow" x:Class="LanMountainDesktop.Views.SettingsWindow"
x:DataType="vm:SettingsWindowViewModel" x:DataType="vm:SettingsWindowViewModel"
Width="1120" Width="1120"
@@ -112,7 +112,7 @@
</Grid> </Grid>
</Border> </Border>
<ui:NavigationView x:Name="RootNavigationView" <ui:FANavigationView x:Name="RootNavigationView"
Grid.Row="1" Grid.Row="1"
Margin="0,8,0,0" Margin="0,8,0,0"
Background="Transparent" Background="Transparent"
@@ -122,10 +122,10 @@
IsPaneToggleButtonVisible="False" IsPaneToggleButtonVisible="False"
IsBackButtonVisible="False" IsBackButtonVisible="False"
SelectionChanged="OnNavigationSelectionChanged"> SelectionChanged="OnNavigationSelectionChanged">
<ui:NavigationView.Resources> <ui:FANavigationView.Resources>
<SolidColorBrush x:Key="NavigationViewContentBackground" Color="Transparent" /> <SolidColorBrush x:Key="NavigationViewContentBackground" Color="Transparent" />
<SolidColorBrush x:Key="NavigationViewContentGridBorderBrush" Color="Transparent" /> <SolidColorBrush x:Key="NavigationViewContentGridBorderBrush" Color="Transparent" />
</ui:NavigationView.Resources> </ui:FANavigationView.Resources>
<Grid x:Name="SettingsContentGrid" <Grid x:Name="SettingsContentGrid"
ColumnDefinitions="*,Auto" ColumnDefinitions="*,Auto"
@@ -142,7 +142,7 @@
Text="{Binding CurrentPageTitle}" /> Text="{Binding CurrentPageTitle}" />
</Grid> </Grid>
<ui:Frame x:Name="ContentFrame" <ui:FAFrame x:Name="ContentFrame"
Grid.Row="1" /> Grid.Row="1" />
</Grid> </Grid>
@@ -180,6 +180,6 @@
</Grid> </Grid>
</Border> </Border>
</Grid> </Grid>
</ui:NavigationView> </ui:FANavigationView>
</Grid> </Grid>
</Window> </Window>

View File

@@ -205,14 +205,14 @@ public partial class SettingsWindow : Window, ISettingsPageHostContext
{ {
if (previousCategory is not null && previousCategory != page.Category) if (previousCategory is not null && previousCategory != page.Category)
{ {
RootNavigationView.MenuItems.Add(new NavigationViewItemSeparator()); RootNavigationView.MenuItems.Add(new FANavigationViewItemSeparator());
} }
RootNavigationView.MenuItems.Add(new NavigationViewItem RootNavigationView.MenuItems.Add(new FANavigationViewItem
{ {
Content = page.Title, Content = page.Title,
Tag = page.PageId, Tag = page.PageId,
IconSource = new FluentIcons.Avalonia.Fluent.SymbolIconSource IconSource = new FluentIcons.Avalonia.SymbolIconSource
{ {
Symbol = MapIcon(page.IconKey), Symbol = MapIcon(page.IconKey),
IconVariant = FluentIcons.Common.IconVariant.Regular IconVariant = FluentIcons.Common.IconVariant.Regular
@@ -223,9 +223,9 @@ public partial class SettingsWindow : Window, ISettingsPageHostContext
} }
} }
private void OnNavigationSelectionChanged(object? sender, NavigationViewSelectionChangedEventArgs e) private void OnNavigationSelectionChanged(object? sender, FANavigationViewSelectionChangedEventArgs e)
{ {
var selectedItem = e.SelectedItemContainer ?? e.SelectedItem as NavigationViewItem; var selectedItem = e.SelectedItemContainer ?? e.SelectedItem as FANavigationViewItem;
NavigateTo(selectedItem?.Tag as string); NavigateTo(selectedItem?.Tag as string);
} }
@@ -301,7 +301,7 @@ public partial class SettingsWindow : Window, ISettingsPageHostContext
return; return;
} }
foreach (var item in RootNavigationView.MenuItems.OfType<NavigationViewItem>()) foreach (var item in RootNavigationView.MenuItems.OfType<FANavigationViewItem>())
{ {
if (string.Equals(item.Tag as string, pageId, StringComparison.OrdinalIgnoreCase)) if (string.Equals(item.Tag as string, pageId, StringComparison.OrdinalIgnoreCase))
{ {
@@ -374,17 +374,17 @@ public partial class SettingsWindow : Window, ISettingsPageHostContext
try try
{ {
var dialog = new ContentDialog var dialog = new FAContentDialog
{ {
Title = ViewModel.RestartDialogTitle, Title = ViewModel.RestartDialogTitle,
Content = ViewModel.RestartMessage, Content = ViewModel.RestartMessage,
PrimaryButtonText = ViewModel.RestartDialogPrimaryText, PrimaryButtonText = ViewModel.RestartDialogPrimaryText,
CloseButtonText = ViewModel.RestartDialogCloseText, CloseButtonText = ViewModel.RestartDialogCloseText,
DefaultButton = ContentDialogButton.Primary DefaultButton = FAContentDialogButton.Primary
}; };
var result = await dialog.ShowAsync(this); var result = await dialog.ShowAsync(this);
if (result == ContentDialogResult.Primary) if (result == FAContentDialogResult.Primary)
{ {
_hostApplicationLifecycle.TryRestart(new HostApplicationLifecycleRequest( _hostApplicationLifecycle.TryRestart(new HostApplicationLifecycleRequest(
Source: "SettingsWindow", Source: "SettingsWindow",
@@ -486,7 +486,7 @@ public partial class SettingsWindow : Window, ISettingsPageHostContext
{ {
_ = TryApplyResponsiveLayout(); _ = TryApplyResponsiveLayout();
// 小窗口时隐藏抽屉面板 // 灏忕獥鍙f椂闅愯棌鎶藉眽闈㈡澘
} }
private void OnClosed(object? sender, EventArgs e) private void OnClosed(object? sender, EventArgs e)
@@ -537,9 +537,9 @@ public partial class SettingsWindow : Window, ISettingsPageHostContext
{ {
_ = sender; _ = sender;
if (e.Property == NavigationView.IsPaneOpenProperty || if (e.Property == FANavigationView.IsPaneOpenProperty ||
e.Property == NavigationView.OpenPaneLengthProperty || e.Property == FANavigationView.OpenPaneLengthProperty ||
e.Property == NavigationView.PaneDisplayModeProperty) e.Property == FANavigationView.PaneDisplayModeProperty)
{ {
UpdatePaneToggleIcon(); UpdatePaneToggleIcon();
RequestResponsiveLayoutRefresh(); RequestResponsiveLayoutRefresh();

View File

@@ -695,7 +695,7 @@ public sealed class PluginRuntimeService : IDisposable
if (assemblyName.StartsWith("Avalonia", StringComparison.OrdinalIgnoreCase) || if (assemblyName.StartsWith("Avalonia", StringComparison.OrdinalIgnoreCase) ||
string.Equals(assemblyName, "FluentAvaloniaUI", StringComparison.OrdinalIgnoreCase) || string.Equals(assemblyName, "FluentAvaloniaUI", StringComparison.OrdinalIgnoreCase) ||
string.Equals(assemblyName, "FluentIcons.Avalonia", StringComparison.OrdinalIgnoreCase) || string.Equals(assemblyName, "FluentIcons.Avalonia", StringComparison.OrdinalIgnoreCase) ||
string.Equals(assemblyName, "FluentIcons.Avalonia.Fluent", StringComparison.OrdinalIgnoreCase) || string.Equals(assemblyName, "Material.Avalonia", StringComparison.OrdinalIgnoreCase) ||
string.Equals(assemblyName, "Material.Icons.Avalonia", StringComparison.OrdinalIgnoreCase) || string.Equals(assemblyName, "Material.Icons.Avalonia", StringComparison.OrdinalIgnoreCase) ||
string.Equals(assemblyName, "MicroCom.Runtime", StringComparison.OrdinalIgnoreCase)) string.Equals(assemblyName, "MicroCom.Runtime", StringComparison.OrdinalIgnoreCase))
{ {