Compare commits

...

2 Commits

Author SHA1 Message Date
lincube
ce5acf5bd7 fix.修复了快捷方式组件无法正常透明的问题。 2026-04-13 16:26:23 +08:00
lincube
b933f3badf changed.调整了开发者选项 2026-04-13 13:14:58 +08:00
6 changed files with 87 additions and 27 deletions

View File

@@ -4,7 +4,10 @@
### 新增 (Added) ### 新增 (Added)
- - **开发者调试工具**: 新增开发者调试工具,优化插件开发体验
- 提供便捷的调试功能,帮助开发者快速定位和解决问题
- 支持插件运行时状态监控和日志查看
- 提升插件开发效率和调试体验
### 变更 (Changed) ### 变更 (Changed)

View File

@@ -72,6 +72,7 @@ internal sealed class SettingsWindowService : ISettingsWindowService
_localizationService = new(); _localizationService = new();
_settingsFacade.Settings.Changed += OnSettingsChanged; _settingsFacade.Settings.Changed += OnSettingsChanged;
_appearanceThemeService.Changed += OnAppearanceThemeChanged; _appearanceThemeService.Changed += OnAppearanceThemeChanged;
AppSettingsService.SettingsSaved += OnAppSettingsSaved;
} }
private string L(string key) private string L(string key)
@@ -279,6 +280,7 @@ internal sealed class SettingsWindowService : ISettingsWindowService
var changedKeys = e.ChangedKeys?.ToArray(); var changedKeys = e.ChangedKeys?.ToArray();
var refreshAll = changedKeys is null || changedKeys.Length == 0; var refreshAll = changedKeys is null || changedKeys.Length == 0;
var languageChanged = refreshAll || changedKeys.Contains(nameof(AppSettingsSnapshot.LanguageCode), StringComparer.OrdinalIgnoreCase); var languageChanged = refreshAll || changedKeys.Contains(nameof(AppSettingsSnapshot.LanguageCode), StringComparer.OrdinalIgnoreCase);
var devModeChanged = refreshAll || changedKeys.Contains(nameof(AppSettingsSnapshot.IsDevModeEnabled), StringComparer.OrdinalIgnoreCase);
var liveAppearance = _appearanceThemeService.GetCurrent(); var liveAppearance = _appearanceThemeService.GetCurrent();
var themeChanged = var themeChanged =
refreshAll || refreshAll ||
@@ -291,14 +293,13 @@ internal sealed class SettingsWindowService : ISettingsWindowService
changedKeys.Contains(nameof(AppSettingsSnapshot.WallpaperColor), StringComparer.OrdinalIgnoreCase))) || changedKeys.Contains(nameof(AppSettingsSnapshot.WallpaperColor), StringComparer.OrdinalIgnoreCase))) ||
changedKeys.Contains(nameof(AppSettingsSnapshot.UseSystemChrome), StringComparer.OrdinalIgnoreCase); changedKeys.Contains(nameof(AppSettingsSnapshot.UseSystemChrome), StringComparer.OrdinalIgnoreCase);
if (languageChanged) if (languageChanged || devModeChanged)
{ {
var regionState = _settingsFacade.Region.Get(); var regionState = _settingsFacade.Region.Get();
// 清除本地化缓存,强制重新加载语言文件
_localizationService.ClearCache(); _localizationService.ClearCache();
_viewModel.RefreshLanguage(regionState.LanguageCode); _viewModel.RefreshLanguage(regionState.LanguageCode);
_pageRegistry.Rebuild(); _pageRegistry.Rebuild();
_window.ReloadPages(_viewModel.CurrentPageId); _window.ReloadPages(devModeChanged ? "dev" : _viewModel.CurrentPageId);
_window.RefreshShellText(); _window.RefreshShellText();
} }
@@ -311,6 +312,31 @@ internal sealed class SettingsWindowService : ISettingsWindowService
}, DispatcherPriority.Background); }, DispatcherPriority.Background);
} }
private void OnAppSettingsSaved(string instanceId)
{
Dispatcher.UIThread.Post(() =>
{
if (_window is null || _viewModel is null)
{
return;
}
var snapshot = _settingsFacade.Settings.LoadSnapshot<AppSettingsSnapshot>(SettingsScope.App);
var devPageVisible = _pageRegistry.GetPages().Any(p => p.PageId == "dev");
if (snapshot.IsDevModeEnabled && !devPageVisible)
{
_pageRegistry.Rebuild();
_window.ReloadPages("dev");
}
else if (!snapshot.IsDevModeEnabled && devPageVisible)
{
_pageRegistry.Rebuild();
_window.ReloadPages(null);
}
}, DispatcherPriority.Background);
}
private void ApplyTheme(SettingsWindow window) private void ApplyTheme(SettingsWindow window)
{ {
var appearanceSnapshot = _appearanceThemeService.GetCurrent(); var appearanceSnapshot = _appearanceThemeService.GetCurrent();

View File

@@ -8,9 +8,6 @@
x:Class="LanMountainDesktop.Views.Components.ShortcutWidget"> x:Class="LanMountainDesktop.Views.Components.ShortcutWidget">
<Border x:Name="RootBorder" <Border x:Name="RootBorder"
Background="{DynamicResource AdaptiveSurfaceRaisedBrush}"
BorderBrush="{DynamicResource AdaptiveButtonBorderBrush}"
BorderThickness="1"
CornerRadius="{DynamicResource DesignCornerRadiusComponent}" CornerRadius="{DynamicResource DesignCornerRadiusComponent}"
ClipToBounds="True"> ClipToBounds="True">
<Grid RowDefinitions="*,Auto" <Grid RowDefinitions="*,Auto"

View File

@@ -25,6 +25,7 @@ public partial class ShortcutWidget : UserControl, IDesktopComponentWidget, ICom
private bool _showBackground = true; private bool _showBackground = true;
private double _currentCellSize = 48; private double _currentCellSize = 48;
private bool _isDisposed; private bool _isDisposed;
private bool _chromeApplied;
private const double TapMovementThreshold = 10; private const double TapMovementThreshold = 10;
private const long TapTimeThresholdMs = 500; private const long TapTimeThresholdMs = 500;
@@ -40,9 +41,32 @@ public partial class ShortcutWidget : UserControl, IDesktopComponentWidget, ICom
{ {
InitializeComponent(); InitializeComponent();
DoubleTapped += OnDoubleTapped; DoubleTapped += OnDoubleTapped;
Loaded += OnLoaded;
UpdateDisplay(); UpdateDisplay();
} }
private void OnLoaded(object? sender, RoutedEventArgs e)
{
// ApplyChrome() may have been called before the control was attached to the visual tree,
// causing FindResource() to fail. Re-apply now that resources are available.
if (!_chromeApplied)
{
ApplyChrome();
}
// Subscribe to theme changes so the background follows theme updates.
var themeService = HostAppearanceThemeProvider.GetOrCreate();
themeService.Changed += OnAppearanceThemeChanged;
}
private void OnAppearanceThemeChanged(object? sender, AppearanceThemeSnapshot e)
{
if (_isDisposed || _showBackground)
{
ApplyChrome();
}
}
public void SetComponentPlacementContext(string componentId, string? placementId) public void SetComponentPlacementContext(string componentId, string? placementId)
{ {
_componentId = string.IsNullOrWhiteSpace(componentId) _componentId = string.IsNullOrWhiteSpace(componentId)
@@ -258,13 +282,25 @@ public partial class ShortcutWidget : UserControl, IDesktopComponentWidget, ICom
RootBorder.Background = Brushes.Transparent; RootBorder.Background = Brushes.Transparent;
RootBorder.BorderBrush = Brushes.Transparent; RootBorder.BorderBrush = Brushes.Transparent;
RootBorder.BorderThickness = new Thickness(0); RootBorder.BorderThickness = new Thickness(0);
_chromeApplied = true;
return; return;
} }
// 恢复默认的实心背景样式 // FindResource requires the control to be attached to the visual tree.
RootBorder.Background = this.FindResource("AdaptiveSurfaceRaisedBrush") as IBrush ?? Brushes.Transparent; // If it returns null, _chromeApplied stays false so OnLoaded will retry.
RootBorder.BorderBrush = this.FindResource("AdaptiveButtonBorderBrush") as IBrush ?? Brushes.Transparent; var background = this.FindResource("AdaptiveSurfaceRaisedBrush") as IBrush;
var borderBrush = this.FindResource("AdaptiveButtonBorderBrush") as IBrush;
if (background is null || borderBrush is null)
{
_chromeApplied = false;
return;
}
RootBorder.Background = background;
RootBorder.BorderBrush = borderBrush;
RootBorder.BorderThickness = new Thickness(1); RootBorder.BorderThickness = new Thickness(1);
_chromeApplied = true;
} }
protected override void OnPointerPressed(PointerPressedEventArgs e) protected override void OnPointerPressed(PointerPressedEventArgs e)
@@ -391,6 +427,10 @@ public partial class ShortcutWidget : UserControl, IDesktopComponentWidget, ICom
} }
_isDisposed = true; _isDisposed = true;
var themeService = HostAppearanceThemeProvider.GetOrCreate();
themeService.Changed -= OnAppearanceThemeChanged;
_gestureStates.Clear(); _gestureStates.Clear();
} }
} }

View File

@@ -3,13 +3,14 @@ using System.Diagnostics;
using Avalonia; using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Interactivity; using Avalonia.VisualTree;
using FluentAvalonia.UI.Controls; using FluentAvalonia.UI.Controls;
using LanMountainDesktop.Models; using LanMountainDesktop.Models;
using LanMountainDesktop.PluginSdk; using LanMountainDesktop.PluginSdk;
using LanMountainDesktop.Services; using LanMountainDesktop.Services;
using LanMountainDesktop.Services.Settings; using LanMountainDesktop.Services.Settings;
using LanMountainDesktop.ViewModels; using LanMountainDesktop.ViewModels;
using LanMountainDesktop.Views;
namespace LanMountainDesktop.Views.SettingsPages; namespace LanMountainDesktop.Views.SettingsPages;
@@ -95,7 +96,7 @@ public partial class AboutSettingsPage : SettingsPageBase
if (_heroCardClickCount >= 3) if (_heroCardClickCount >= 3)
{ {
_heroCardClickCount = 0; _heroCardClickCount = 0;
_ = ShowMessageAsync("开发者模式", "开发者模式已启用,无需重复操作。"); Debug.WriteLine("[AboutSettingsPage] Developer mode is already enabled.");
} }
return; return;
@@ -142,22 +143,9 @@ public partial class AboutSettingsPage : SettingsPageBase
AppLogger.Info("DevMode", "Developer mode enabled via About page activation."); AppLogger.Info("DevMode", "Developer mode enabled via About page activation.");
_ = ShowMessageAsync("开发者模式", "已启用开发者模式。重新打开设置窗口即可看到开发者选项。"); if (this.FindAncestorOfType<SettingsWindow>() is { } settingsWindow)
if (HostContext is not null)
{ {
HostContext.RequestRestart("开发者模式已更改"); settingsWindow.RebuildAndNavigateToDevPage();
} }
} }
private static async Task ShowMessageAsync(string title, string message)
{
var dialog = new ContentDialog
{
Title = title,
Content = message,
CloseButtonText = "确定"
};
await dialog.ShowAsync();
}
} }

View File

@@ -97,6 +97,12 @@ public partial class SettingsWindow : Window, ISettingsPageHostContext
NavigateTo(pageId ?? ViewModel.Pages.FirstOrDefault()?.PageId); NavigateTo(pageId ?? ViewModel.Pages.FirstOrDefault()?.PageId);
} }
public void RebuildAndNavigateToDevPage()
{
_pageRegistry.Rebuild();
ReloadPages("dev");
}
public void OpenDrawer(Control content, string? title = null) public void OpenDrawer(Control content, string? title = null)
{ {
if (DrawerContentHost is null) if (DrawerContentHost is null)