using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Management; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Interop; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Media.Imaging; using System.Windows.Shapes; using Ink_Canvas.Windows.SettingsViews; using iNKORE.UI.WPF.Helpers; using iNKORE.UI.WPF.Modern.Controls; using OSVersionExtension; namespace Ink_Canvas.Windows { public partial class SettingsWindow : Window { public SettingsWindow() { InitializeComponent(); // 初始化侧边栏项目 SidebarItemsControl.ItemsSource = SidebarItems; SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "启动时行为", Name = "StartupItem", IconSource = FindResource("StartupIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "画板和墨迹", Name = "CanvasAndInkItem", IconSource = FindResource("CanvasAndInkIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "手势操作", Name = "GesturesItem", IconSource = FindResource("GesturesIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "墨迹纠正", Name = "InkRecognitionItem", IconSource = FindResource("InkRecognitionIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Separator }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "个性化设置", Name = "ThemeItem", IconSource = FindResource("AppearanceIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "快捷键设置", Name = "ShortcutsItem", IconSource = FindResource("AppearanceIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "崩溃处理", Name = "CrashActionItem", IconSource = FindResource("AppearanceIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Separator }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "PowerPoint 支持", Name = "PowerPointItem", IconSource = FindResource("PowerPointIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "自动化行为", Name = "AutomationItem", IconSource = FindResource("AutomationIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "随机点名", Name = "LuckyRandomItem", IconSource = FindResource("LuckyRandomIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Separator }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "存储空间", Name = "StorageItem", IconSource = FindResource("StorageIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "截图和屏幕捕捉", Name = "SnapshotItem", IconSource = FindResource("SnapshotIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Separator }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "高级选项", Name = "AdvancedItem", IconSource = FindResource("AdvancedIcon") as DrawingImage, Selected = false, }); SidebarItems.Add(new SidebarItem() { Type = SidebarItemType.Item, Title = "关于 InkCanvasForClass", Name = "AboutItem", IconSource = FindResource("AboutIcon") as DrawingImage, Selected = false, }); _selectedSidebarItemName = "CanvasAndInkItem"; UpdateSidebarItemsSelection(); SettingsPanes = new Grid[] { AboutPane, CanvasAndInkPane, GesturesPane, StartupPane, ThemePane, ShortcutsPane, CrashActionPane, InkRecognitionPane, AutomationPane, PowerPointPane, LuckyRandomPane, StoragePane, SnapshotPane, AdvancedPane }; SettingsPaneScrollViewers = new ScrollViewer[] { SettingsAboutPanel.AboutScrollViewerEx, CanvasAndInkScrollViewerEx, GesturesScrollViewerEx, StartupScrollViewerEx, ThemeScrollViewerEx, ShortcutsScrollViewerEx, CrashActionScrollViewerEx, InkRecognitionScrollViewerEx, AutomationScrollViewerEx, PowerPointScrollViewerEx, LuckyRandomScrollViewerEx, StorageScrollViewerEx, SnapshotScrollViewerEx, AdvancedScrollViewerEx }; SettingsPaneTitles = new string[] { "关于", "画板和墨迹", "手势操作", "启动时行为", "个性化设置", "快捷键设置", "崩溃处理", "墨迹识别", "自动化", "PowerPoint", "幸运随机", "存储", "截图", "高级" }; SettingsPaneNames = new string[] { "AboutItem", "CanvasAndInkItem", "GesturesItem", "StartupItem", "ThemeItem", "ShortcutsItem", "CrashActionItem", "InkRecognitionItem", "AutomationItem", "PowerPointItem", "LuckyRandomItem", "StorageItem", "SnapshotItem", "AdvancedItem" }; SettingsAboutPanel.IsTopBarNeedShadowEffect += (o, s) => DropShadowEffectTopBar.Opacity = 0.25; SettingsAboutPanel.IsTopBarNeedNoShadowEffect += (o, s) => DropShadowEffectTopBar.Opacity = 0; } public enum SidebarItemType { Item, Separator } public class SidebarItem { public SidebarItemType Type { get; set; } public string Title { get; set; } public string Name { get; set; } public ImageSource IconSource { get; set; } public bool Selected { get; set; } public Visibility _spVisibility { get => this.Type == SidebarItemType.Separator ? Visibility.Visible : Visibility.Collapsed; } public Visibility _siVisibility { get => this.Type == SidebarItemType.Item ? Visibility.Visible : Visibility.Collapsed; } public SolidColorBrush _siBackground { get => this.Selected ? new SolidColorBrush(Color.FromRgb(217, 217, 217)) : new SolidColorBrush(Colors.Transparent); } } public string _selectedSidebarItemName = ""; public ObservableCollection SidebarItems = new ObservableCollection(); public void UpdateSidebarItemsSelection() { foreach (var si in SidebarItems) { si.Selected = si.Name == _selectedSidebarItemName; if (si.Selected) SettingsWindowTitle.Text = si.Title; } CollectionViewSource.GetDefaultView(SidebarItems).Refresh(); AboutPane.Visibility = _selectedSidebarItemName == "AboutItem" ? Visibility.Visible : Visibility.Collapsed; CanvasAndInkPane.Visibility = _selectedSidebarItemName == "CanvasAndInkItem" ? Visibility.Visible : Visibility.Collapsed; GesturesPane.Visibility = _selectedSidebarItemName == "GesturesItem" ? Visibility.Visible : Visibility.Collapsed; StartupPane.Visibility = _selectedSidebarItemName == "StartupItem" ? Visibility.Visible : Visibility.Collapsed; ThemePane.Visibility = _selectedSidebarItemName == "ThemeItem" ? Visibility.Visible : Visibility.Collapsed; ShortcutsPane.Visibility = _selectedSidebarItemName == "ShortcutsItem" ? Visibility.Visible : Visibility.Collapsed; CrashActionPane.Visibility = _selectedSidebarItemName == "CrashActionItem" ? Visibility.Visible : Visibility.Collapsed; InkRecognitionPane.Visibility = _selectedSidebarItemName == "InkRecognitionItem" ? Visibility.Visible : Visibility.Collapsed; AutomationPane.Visibility = _selectedSidebarItemName == "AutomationItem" ? Visibility.Visible : Visibility.Collapsed; PowerPointPane.Visibility = _selectedSidebarItemName == "PowerPointItem" ? Visibility.Visible : Visibility.Collapsed; LuckyRandomPane.Visibility = _selectedSidebarItemName == "LuckyRandomItem" ? Visibility.Visible : Visibility.Collapsed; StoragePane.Visibility = _selectedSidebarItemName == "StorageItem" ? Visibility.Visible : Visibility.Collapsed; SnapshotPane.Visibility = _selectedSidebarItemName == "SnapshotItem" ? Visibility.Visible : Visibility.Collapsed; AdvancedPane.Visibility = _selectedSidebarItemName == "AdvancedItem" ? Visibility.Visible : Visibility.Collapsed; foreach (var sv in SettingsPaneScrollViewers) { sv.ScrollToTop(); } } private void ScrollViewerEx_ScrollChanged(object sender, ScrollChangedEventArgs e) { var scrollViewer = (ScrollViewer)sender; if (scrollViewer.VerticalOffset >= 10) { DropShadowEffectTopBar.Opacity = 0.25; } else { DropShadowEffectTopBar.Opacity = 0; } } private void ScrollBar_Scroll(object sender, RoutedEventArgs e) { var scrollbar = (ScrollBar)sender; var scrollviewer = scrollbar.FindAscendant(); if (scrollviewer != null) scrollviewer.ScrollToVerticalOffset(scrollbar.Track.Value); } private void ScrollBarTrack_MouseEnter(object sender, MouseEventArgs e) { var border = (Border)sender; if (border.Child is Track track) { track.Width = 16; track.Margin = new Thickness(0, 0, -2, 0); var scrollbar = track.FindAscendant(); if (scrollbar != null) scrollbar.Width = 16; var grid = track.FindAscendant(); if (grid.FindDescendantByName("ScrollBarBorderTrackBackground") is Border backgroundBorder) { backgroundBorder.Width = 8; backgroundBorder.CornerRadius = new CornerRadius(4); backgroundBorder.Opacity = 1; } var thumb = track.Thumb.Template.FindName("ScrollbarThumbEx", track.Thumb) ; if (thumb != null) { var _thumb = thumb as Border; _thumb.CornerRadius = new CornerRadius(4); _thumb.Width = 8; _thumb.Margin = new Thickness(-0.75, 0, 1, 0); _thumb.Background = new SolidColorBrush(Color.FromRgb(138, 138, 138)); } } } private void ScrollBarTrack_MouseLeave(object sender, MouseEventArgs e) { var border = (Border)sender; border.Background = new SolidColorBrush(Colors.Transparent); border.CornerRadius = new CornerRadius(0); if (border.Child is Track track) { track.Width = 6; track.Margin = new Thickness(0, 0, 0, 0); var scrollbar = track.FindAscendant(); if (scrollbar != null) scrollbar.Width = 6; var grid = track.FindAscendant(); if (grid.FindDescendantByName("ScrollBarBorderTrackBackground") is Border backgroundBorder) { backgroundBorder.Width = 3; backgroundBorder.CornerRadius = new CornerRadius(1.5); backgroundBorder.Opacity = 0; } var thumb = track.Thumb.Template.FindName("ScrollbarThumbEx", track.Thumb) ; if (thumb != null) { var _thumb = thumb as Border; _thumb.CornerRadius = new CornerRadius(1.5); _thumb.Width = 3; _thumb.Margin = new Thickness(0); _thumb.Background = new SolidColorBrush(Color.FromRgb(195, 195, 195)); } } } private void ScrollbarThumb_MouseDown(object sender, MouseButtonEventArgs e) { var thumb = (Thumb)sender; var border = thumb.Template.FindName("ScrollbarThumbEx",thumb); ((Border)border).Background = new SolidColorBrush(Color.FromRgb(95, 95, 95)); } private void ScrollbarThumb_MouseUp(object sender, MouseButtonEventArgs e) { var thumb = (Thumb)sender; var border = thumb.Template.FindName("ScrollbarThumbEx",thumb); ((Border)border).Background = new SolidColorBrush(Color.FromRgb(138, 138, 138)); } private Border _sidebarItemMouseDownBorder = null; private void SidebarItem_MouseDown(object sender, MouseButtonEventArgs e) { if (_sidebarItemMouseDownBorder != null || _sidebarItemMouseDownBorder == sender) return; _sidebarItemMouseDownBorder = (Border)sender; var bd = sender as Border; if (bd.FindDescendantByName("MouseFeedbackBorder") is Border feedbackBd) feedbackBd.Opacity = 0.12; } private void SidebarItem_MouseUp(object sender, MouseButtonEventArgs e) { if (_sidebarItemMouseDownBorder == null || _sidebarItemMouseDownBorder != sender) return; if (_sidebarItemMouseDownBorder.Tag is SidebarItem data) _selectedSidebarItemName = data.Name; SidebarItem_MouseLeave(sender, null); UpdateSidebarItemsSelection(); } private void SidebarItem_MouseLeave(object sender, MouseEventArgs e) { if (_sidebarItemMouseDownBorder == null || _sidebarItemMouseDownBorder != sender) return; if (_sidebarItemMouseDownBorder.FindDescendantByName("MouseFeedbackBorder") is Border feedbackBd) feedbackBd.Opacity = 0; _sidebarItemMouseDownBorder = null; } private void CloseButton_Click(object sender, MouseButtonEventArgs e) { Close(); } private void SearchButton_Click(object sender, MouseButtonEventArgs e) { // 搜索功能 - 可以显示搜索框或搜索对话框 } private void MenuButton_Click(object sender, MouseButtonEventArgs e) { // 切换侧边栏的收纳和展开状态 _isSidebarCollapsed = !_isSidebarCollapsed; if (_isSidebarCollapsed) { // 收纳侧边栏 SidebarBorder.Width = 0; MainContentGrid.Margin = new Thickness(0, 48, 0, 0); TopbarGrid.Margin = new Thickness(0, 0, 0, 0); } else { // 展开侧边栏 SidebarBorder.Width = 250; MainContentGrid.Margin = new Thickness(250, 48, 0, 0); TopbarGrid.Margin = new Thickness(250, 0, 0, 0); } } private bool _isSidebarCollapsed; public Grid[] SettingsPanes; public ScrollViewer[] SettingsPaneScrollViewers; public string[] SettingsPaneTitles; public string[] SettingsPaneNames; } }