diff --git a/Ink Canvas/Windows/SettingsViews/Pages/AboutPage.xaml b/Ink Canvas/Windows/SettingsViews/Pages/AboutPage.xaml index a8894441..76ba4356 100644 --- a/Ink Canvas/Windows/SettingsViews/Pages/AboutPage.xaml +++ b/Ink Canvas/Windows/SettingsViews/Pages/AboutPage.xaml @@ -65,7 +65,7 @@ + IsExpanded="True"> @@ -92,29 +92,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/Ink Canvas/Windows/SettingsViews/Pages/AboutPage.xaml.cs b/Ink Canvas/Windows/SettingsViews/Pages/AboutPage.xaml.cs index 3e7d2850..1efa6da5 100644 --- a/Ink Canvas/Windows/SettingsViews/Pages/AboutPage.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/Pages/AboutPage.xaml.cs @@ -1,12 +1,9 @@ using Ink_Canvas.Helpers; -using Ink_Canvas.Windows.SettingsViews.Helpers; using System; using System.Collections.ObjectModel; using System.Diagnostics; -using System.IO; using System.Reflection; using System.Windows; -using System.Windows.Controls; using System.Windows.Threading; namespace Ink_Canvas.Windows.SettingsViews.Pages @@ -20,9 +17,6 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages public partial class AboutPage : iNKORE.UI.WPF.Modern.Controls.Page { - private bool _isLoaded = false; - private bool _isChangingTelemetryInternally; - private bool _isChangingTelemetryPrivacyInternally; private DispatcherTimer _usageRefreshTimer; private long _savedTotalSeconds; private DateTime _sessionStartTime; @@ -69,7 +63,6 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages private void AboutPage_Loaded(object sender, RoutedEventArgs e) { LoadSettings(); - _isLoaded = true; if (_usageRefreshTimer == null) { @@ -101,43 +94,15 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages private void LoadSettings() { - _isLoaded = false; - try { AppVersionTextBlock.Text = Assembly.GetExecutingAssembly().GetName().Version.ToString(); - - var settings = SettingsManager.Settings; - if (settings?.Startup != null) - { - int idx = 0; - switch (settings.Startup.TelemetryUploadLevel) - { - case TelemetryUploadLevel.None: - idx = 0; - break; - case TelemetryUploadLevel.Basic: - idx = 1; - break; - case TelemetryUploadLevel.Extended: - idx = 2; - break; - default: - idx = 0; - break; - } - ComboBoxTelemetryUploadLevel.SelectedIndex = idx; - CheckBoxTelemetryPrivacyAccepted.IsChecked = settings.Startup.HasAcceptedTelemetryPrivacy; - } - RefreshDeviceInfo(); } catch (Exception ex) { Debug.WriteLine($"加载关于页面设置时出错: {ex.Message}"); } - - _isLoaded = true; } private void RefreshDeviceInfo_Click(object sender, RoutedEventArgs e) @@ -206,219 +171,5 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages TotalUsageTextBlock.Text = "获取失败"; } } - - private void ComboBoxTelemetryUploadLevel_SelectionChanged(object sender, RoutedEventArgs e) - { - if (!_isLoaded) return; - if (_isChangingTelemetryInternally) return; - var oldLevel = SettingsManager.Settings.Startup.TelemetryUploadLevel; - var item = ComboBoxTelemetryUploadLevel?.SelectedItem as ComboBoxItem; - if (item == null) return; - - var tag = item.Tag?.ToString() ?? "0"; - var newLevel = TelemetryUploadLevel.None; - switch (tag) - { - case "1": - newLevel = TelemetryUploadLevel.Basic; - break; - case "2": - newLevel = TelemetryUploadLevel.Extended; - break; - default: - newLevel = TelemetryUploadLevel.None; - break; - } - - if (newLevel == TelemetryUploadLevel.None && - oldLevel != TelemetryUploadLevel.None && - SettingsManager.Settings.Startup.UpdateChannel != UpdateChannel.Release) - { - var result = MessageBox.Show( - "关闭匿名使用数据上传后,将无法继续使用预览/测试通道,系统会自动切换回正式通道(Release)。\n\n是否确认关闭?", - "确认关闭遥测", - MessageBoxButton.YesNo, - MessageBoxImage.Warning); - - if (result != MessageBoxResult.Yes) - { - _isChangingTelemetryInternally = true; - try - { - int idx = 0; - switch (oldLevel) - { - case TelemetryUploadLevel.Basic: - idx = 1; - break; - case TelemetryUploadLevel.Extended: - idx = 2; - break; - default: - idx = 0; - break; - } - ComboBoxTelemetryUploadLevel.SelectedIndex = idx; - } - finally - { - _isChangingTelemetryInternally = false; - } - return; - } - - SettingsManager.Settings.Startup.UpdateChannel = UpdateChannel.Release; - DeviceIdentifier.UpdateUsageChannel(UpdateChannel.Release); - } - - if (newLevel != TelemetryUploadLevel.None && !SettingsManager.Settings.Startup.HasAcceptedTelemetryPrivacy) - { - MessageBox.Show( - "在开启匿名使用数据上传前,请先阅读并勾选上方的隐私说明。", - "需要同意隐私说明", - MessageBoxButton.OK, - MessageBoxImage.Warning); - - _isChangingTelemetryInternally = true; - try - { - SettingsManager.Settings.Startup.TelemetryUploadLevel = TelemetryUploadLevel.None; - if (ComboBoxTelemetryUploadLevel != null) - { - ComboBoxTelemetryUploadLevel.SelectedIndex = 0; - } - } - finally - { - _isChangingTelemetryInternally = false; - } - - return; - } - - SettingsManager.Settings.Startup.TelemetryUploadLevel = newLevel; - SettingsManager.SaveSettingsToFile(); - } - - private void CheckBoxTelemetryPrivacyAccepted_Checked(object sender, RoutedEventArgs e) - { - if (!_isLoaded) return; - if (_isChangingTelemetryPrivacyInternally) return; - - bool isChecked = CheckBoxTelemetryPrivacyAccepted.IsChecked == true; - - if (isChecked) - { - if (!PrivacyFileExists()) - { - MessageBox.Show( - "未找到隐私说明文件(privacy / privacy.txt),暂时无法启用匿名使用数据上传。", - "隐私说明缺失", - MessageBoxButton.OK, - MessageBoxImage.Warning); - - _isChangingTelemetryPrivacyInternally = true; - try - { - CheckBoxTelemetryPrivacyAccepted.IsChecked = false; - } - finally - { - _isChangingTelemetryPrivacyInternally = false; - } - - SettingsManager.Settings.Startup.HasAcceptedTelemetryPrivacy = false; - SettingsManager.SaveSettingsToFile(); - return; - } - - var privacyWindow = new PrivacyAgreementWindow(); - bool? dialogResult = privacyWindow.ShowDialog(); - - if (dialogResult == true && privacyWindow.UserAccepted) - { - SettingsManager.Settings.Startup.HasAcceptedTelemetryPrivacy = true; - SettingsManager.SaveSettingsToFile(); - } - else - { - _isChangingTelemetryPrivacyInternally = true; - try - { - CheckBoxTelemetryPrivacyAccepted.IsChecked = false; - } - finally - { - _isChangingTelemetryPrivacyInternally = false; - } - - SettingsManager.Settings.Startup.HasAcceptedTelemetryPrivacy = false; - SettingsManager.SaveSettingsToFile(); - } - } - else - { - var result = MessageBox.Show( - "取消同意隐私说明后,将关闭匿名使用数据上传,并切回正式通道(Release)。\n\n是否确认?", - "确认取消隐私同意", - MessageBoxButton.YesNo, - MessageBoxImage.Warning); - - if (result != MessageBoxResult.Yes) - { - _isChangingTelemetryPrivacyInternally = true; - try - { - CheckBoxTelemetryPrivacyAccepted.IsChecked = true; - } - finally - { - _isChangingTelemetryPrivacyInternally = false; - } - return; - } - - _isChangingTelemetryInternally = true; - try - { - SettingsManager.Settings.Startup.TelemetryUploadLevel = TelemetryUploadLevel.None; - if (ComboBoxTelemetryUploadLevel != null) - { - ComboBoxTelemetryUploadLevel.SelectedIndex = 0; - } - } - finally - { - _isChangingTelemetryInternally = false; - } - - if (SettingsManager.Settings.Startup.UpdateChannel != UpdateChannel.Release) - { - SettingsManager.Settings.Startup.UpdateChannel = UpdateChannel.Release; - DeviceIdentifier.UpdateUsageChannel(UpdateChannel.Release); - } - - SettingsManager.Settings.Startup.HasAcceptedTelemetryPrivacy = false; - SettingsManager.SaveSettingsToFile(); - } - } - - private static bool PrivacyFileExists() - { - try - { - var assembly = Assembly.GetExecutingAssembly(); - var resourceName = "Ink_Canvas.privacy.txt"; - using (Stream stream = assembly.GetManifestResourceStream(resourceName)) - { - return stream != null; - } - } - catch - { - return false; - } - } - } } diff --git a/Ink Canvas/Windows/SettingsViews/Pages/CanvasPage.xaml b/Ink Canvas/Windows/SettingsViews/Pages/CanvasPage.xaml index b4c32ed4..ba9eb663 100644 --- a/Ink Canvas/Windows/SettingsViews/Pages/CanvasPage.xaml +++ b/Ink Canvas/Windows/SettingsViews/Pages/CanvasPage.xaml @@ -174,8 +174,8 @@ + IsExpanded="{Binding IsOn, ElementName=CardBrushAutoRestore, Mode=OneWay}" + d:Visibility="Visible"> @@ -283,8 +283,8 @@ + IsExpanded="{Binding IsOn, ElementName=CardEnableInkToShape, Mode=OneWay}" + d:Visibility="Visible"> diff --git a/Ink Canvas/Windows/SettingsViews/Pages/IconographyPage.xaml b/Ink Canvas/Windows/SettingsViews/Pages/IconographyPage.xaml index e5d3d698..98d04f78 100644 --- a/Ink Canvas/Windows/SettingsViews/Pages/IconographyPage.xaml +++ b/Ink Canvas/Windows/SettingsViews/Pages/IconographyPage.xaml @@ -15,7 +15,7 @@ + IsExpanded="True"> diff --git a/Ink Canvas/Windows/SettingsViews/Pages/MainInterfacePage.xaml b/Ink Canvas/Windows/SettingsViews/Pages/MainInterfacePage.xaml new file mode 100644 index 00000000..a701a599 --- /dev/null +++ b/Ink Canvas/Windows/SettingsViews/Pages/MainInterfacePage.xaml @@ -0,0 +1,58 @@ + + + + + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ink Canvas/Windows/SettingsViews/Pages/MainInterfacePage.xaml.cs b/Ink Canvas/Windows/SettingsViews/Pages/MainInterfacePage.xaml.cs new file mode 100644 index 00000000..ad450b68 --- /dev/null +++ b/Ink Canvas/Windows/SettingsViews/Pages/MainInterfacePage.xaml.cs @@ -0,0 +1,88 @@ +using iNKORE.UI.WPF.Modern.Controls; +using System.Collections.ObjectModel; +using System.Windows; +using SWC = System.Windows.Controls; + +namespace Ink_Canvas.Windows.SettingsViews.Pages +{ + public partial class MainInterfacePage : SWC.Page + { + private readonly ObservableCollection _subPageItems = new(); + + public MainInterfacePage() + { + InitializeComponent(); + SubPageItems.ItemsSource = _subPageItems; + Loaded += MainInterfacePage_Loaded; + } + + private void MainInterfacePage_Loaded(object sender, RoutedEventArgs e) + { + LoadSubPages(); + } + + private void LoadSubPages() + { + _subPageItems.Clear(); + + var settingsWindow = Window.GetWindow(this) as SettingsWindow; + if (settingsWindow == null) return; + + var navView = settingsWindow.GetNavigationView(); + if (navView == null) return; + + foreach (var item in navView.MenuItems) + { + if (item is NavigationViewItem navItem) + { + string tag = navItem.Tag as string; + if (tag == "MainInterfacePage" && navItem.MenuItems.Count > 0) + { + foreach (var child in navItem.MenuItems) + { + if (child is NavigationViewItem childItem) + { + string childTag = childItem.Tag as string; + if (!string.IsNullOrEmpty(childTag)) + { + string glyph = ExtractIconGlyph(childItem); + string description = SWC.ToolTipService.GetToolTip(childItem) as string + ?? $"点击跳转到{childItem.Content}"; + + _subPageItems.Add(new SubPageNavItem + { + Header = childItem.Content?.ToString() ?? "", + Description = description, + PageTag = childTag, + IconGlyph = glyph + }); + } + } + } + break; + } + } + } + } + + private string ExtractIconGlyph(NavigationViewItem navItem) + { + if (navItem.Icon is FontIcon fontIcon) + return fontIcon.Glyph ?? "\uE737"; + + if (navItem.Icon is SymbolIcon symbolIcon) + return char.ConvertFromUtf32((int)symbolIcon.Symbol); + + return "\uE737"; + } + + private void SubPageCard_Click(object sender, RoutedEventArgs e) + { + if (sender is FrameworkElement element && element.Tag is string pageTag) + { + var settingsWindow = Window.GetWindow(this) as SettingsWindow; + settingsWindow?.NavigateToPage(pageTag); + } + } + } +} diff --git a/Ink Canvas/Windows/SettingsViews/Pages/PrivacyPage.xaml b/Ink Canvas/Windows/SettingsViews/Pages/PrivacyPage.xaml new file mode 100644 index 00000000..7f422dd3 --- /dev/null +++ b/Ink Canvas/Windows/SettingsViews/Pages/PrivacyPage.xaml @@ -0,0 +1,64 @@ + + + + + + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ink Canvas/Windows/SettingsViews/Pages/PrivacyPage.xaml.cs b/Ink Canvas/Windows/SettingsViews/Pages/PrivacyPage.xaml.cs new file mode 100644 index 00000000..b0934c99 --- /dev/null +++ b/Ink Canvas/Windows/SettingsViews/Pages/PrivacyPage.xaml.cs @@ -0,0 +1,279 @@ +using Ink_Canvas.Helpers; +using Ink_Canvas.Windows.SettingsViews.Helpers; +using System; +using System.IO; +using System.Reflection; +using System.Windows; +using System.Windows.Controls; + +namespace Ink_Canvas.Windows.SettingsViews.Pages +{ + public partial class PrivacyPage : iNKORE.UI.WPF.Modern.Controls.Page + { + private bool _isLoaded = false; + private bool _isChangingTelemetryInternally; + private bool _isChangingTelemetryPrivacyInternally; + + public PrivacyPage() + { + InitializeComponent(); + Loaded += PrivacyPage_Loaded; + } + + private void PrivacyPage_Loaded(object sender, RoutedEventArgs e) + { + LoadSettings(); + _isLoaded = true; + } + + private void LoadSettings() + { + _isLoaded = false; + + try + { + var settings = SettingsManager.Settings; + if (settings?.Startup != null) + { + int idx = 0; + switch (settings.Startup.TelemetryUploadLevel) + { + case TelemetryUploadLevel.None: + idx = 0; + break; + case TelemetryUploadLevel.Basic: + idx = 1; + break; + case TelemetryUploadLevel.Extended: + idx = 2; + break; + default: + idx = 0; + break; + } + ComboBoxTelemetryUploadLevel.SelectedIndex = idx; + CheckBoxTelemetryPrivacyAccepted.IsChecked = settings.Startup.HasAcceptedTelemetryPrivacy; + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"加载隐私页面设置时出错: {ex.Message}"); + } + + _isLoaded = true; + } + + private void ComboBoxTelemetryUploadLevel_SelectionChanged(object sender, RoutedEventArgs e) + { + if (!_isLoaded) return; + if (_isChangingTelemetryInternally) return; + var oldLevel = SettingsManager.Settings.Startup.TelemetryUploadLevel; + var item = ComboBoxTelemetryUploadLevel?.SelectedItem as ComboBoxItem; + if (item == null) return; + + var tag = item.Tag?.ToString() ?? "0"; + var newLevel = TelemetryUploadLevel.None; + switch (tag) + { + case "1": + newLevel = TelemetryUploadLevel.Basic; + break; + case "2": + newLevel = TelemetryUploadLevel.Extended; + break; + default: + newLevel = TelemetryUploadLevel.None; + break; + } + + if (newLevel == TelemetryUploadLevel.None && + oldLevel != TelemetryUploadLevel.None && + SettingsManager.Settings.Startup.UpdateChannel != UpdateChannel.Release) + { + var result = MessageBox.Show( + "关闭匿名使用数据上传后,将无法继续使用预览/测试通道,系统会自动切换回正式通道(Release)。\n\n是否确认关闭?", + "确认关闭遥测", + MessageBoxButton.YesNo, + MessageBoxImage.Warning); + + if (result != MessageBoxResult.Yes) + { + _isChangingTelemetryInternally = true; + try + { + int idx = 0; + switch (oldLevel) + { + case TelemetryUploadLevel.Basic: + idx = 1; + break; + case TelemetryUploadLevel.Extended: + idx = 2; + break; + default: + idx = 0; + break; + } + ComboBoxTelemetryUploadLevel.SelectedIndex = idx; + } + finally + { + _isChangingTelemetryInternally = false; + } + return; + } + + SettingsManager.Settings.Startup.UpdateChannel = UpdateChannel.Release; + DeviceIdentifier.UpdateUsageChannel(UpdateChannel.Release); + } + + if (newLevel != TelemetryUploadLevel.None && !SettingsManager.Settings.Startup.HasAcceptedTelemetryPrivacy) + { + MessageBox.Show( + "在开启匿名使用数据上传前,请先阅读并勾选上方的隐私说明。", + "需要同意隐私说明", + MessageBoxButton.OK, + MessageBoxImage.Warning); + + _isChangingTelemetryInternally = true; + try + { + SettingsManager.Settings.Startup.TelemetryUploadLevel = TelemetryUploadLevel.None; + if (ComboBoxTelemetryUploadLevel != null) + { + ComboBoxTelemetryUploadLevel.SelectedIndex = 0; + } + } + finally + { + _isChangingTelemetryInternally = false; + } + + return; + } + + SettingsManager.Settings.Startup.TelemetryUploadLevel = newLevel; + SettingsManager.SaveSettingsToFile(); + } + + private void CheckBoxTelemetryPrivacyAccepted_Checked(object sender, RoutedEventArgs e) + { + if (!_isLoaded) return; + if (_isChangingTelemetryPrivacyInternally) return; + + bool isChecked = CheckBoxTelemetryPrivacyAccepted.IsChecked == true; + + if (isChecked) + { + if (!PrivacyFileExists()) + { + MessageBox.Show( + "未找到隐私说明文件(privacy / privacy.txt),暂时无法启用匿名使用数据上传。", + "隐私说明缺失", + MessageBoxButton.OK, + MessageBoxImage.Warning); + + _isChangingTelemetryPrivacyInternally = true; + try + { + CheckBoxTelemetryPrivacyAccepted.IsChecked = false; + } + finally + { + _isChangingTelemetryPrivacyInternally = false; + } + + SettingsManager.Settings.Startup.HasAcceptedTelemetryPrivacy = false; + SettingsManager.SaveSettingsToFile(); + return; + } + + var privacyWindow = new PrivacyAgreementWindow(); + bool? dialogResult = privacyWindow.ShowDialog(); + + if (dialogResult == true && privacyWindow.UserAccepted) + { + SettingsManager.Settings.Startup.HasAcceptedTelemetryPrivacy = true; + SettingsManager.SaveSettingsToFile(); + } + else + { + _isChangingTelemetryPrivacyInternally = true; + try + { + CheckBoxTelemetryPrivacyAccepted.IsChecked = false; + } + finally + { + _isChangingTelemetryPrivacyInternally = false; + } + + SettingsManager.Settings.Startup.HasAcceptedTelemetryPrivacy = false; + SettingsManager.SaveSettingsToFile(); + } + } + else + { + var result = MessageBox.Show( + "取消同意隐私说明后,将关闭匿名使用数据上传,并切回正式通道(Release)。\n\n是否确认?", + "确认取消隐私同意", + MessageBoxButton.YesNo, + MessageBoxImage.Warning); + + if (result != MessageBoxResult.Yes) + { + _isChangingTelemetryPrivacyInternally = true; + try + { + CheckBoxTelemetryPrivacyAccepted.IsChecked = true; + } + finally + { + _isChangingTelemetryPrivacyInternally = false; + } + return; + } + + _isChangingTelemetryInternally = true; + try + { + SettingsManager.Settings.Startup.TelemetryUploadLevel = TelemetryUploadLevel.None; + if (ComboBoxTelemetryUploadLevel != null) + { + ComboBoxTelemetryUploadLevel.SelectedIndex = 0; + } + } + finally + { + _isChangingTelemetryInternally = false; + } + + if (SettingsManager.Settings.Startup.UpdateChannel != UpdateChannel.Release) + { + SettingsManager.Settings.Startup.UpdateChannel = UpdateChannel.Release; + DeviceIdentifier.UpdateUsageChannel(UpdateChannel.Release); + } + + SettingsManager.Settings.Startup.HasAcceptedTelemetryPrivacy = false; + SettingsManager.SaveSettingsToFile(); + } + } + + private static bool PrivacyFileExists() + { + try + { + var assembly = Assembly.GetExecutingAssembly(); + var resourceName = "Ink_Canvas.privacy.txt"; + using (Stream stream = assembly.GetManifestResourceStream(resourceName)) + { + return stream != null; + } + } + catch + { + return false; + } + } + } +} diff --git a/Ink Canvas/Windows/SettingsViews/Pages/StartupPage.xaml b/Ink Canvas/Windows/SettingsViews/Pages/StartupPage.xaml index 806f4023..7ac3c583 100644 --- a/Ink Canvas/Windows/SettingsViews/Pages/StartupPage.xaml +++ b/Ink Canvas/Windows/SettingsViews/Pages/StartupPage.xaml @@ -1,25 +1,22 @@ 4 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +