using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; 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.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Ink_Canvas.Components; using iNKORE.UI.WPF.Helpers; namespace Ink_Canvas.Windows.SettingsViews { public class SettingsViewPanel { public string Title { get; set; } public Visibility _TitleVisibility => String.IsNullOrWhiteSpace(Title) ? Visibility.Collapsed : Visibility.Visible; public Thickness _PanelMargin => String.IsNullOrWhiteSpace(Title) ? new Thickness(0) : new Thickness(0, 12, 0, 0); public ObservableCollection Items { get; set; } = new ObservableCollection() { }; } public enum SettingsItemType { Plain, // 只显示Title和Description SingleToggleSwtich, ToggleSwitchWithArrowButton, SelectionButtons, } public class SettingsItem : INotifyPropertyChanged { public string Title { get; set; } public string Description { get; set; } public SettingsItemType Type { get; set; } = SettingsItemType.Plain; public bool IsClickable { get; set; } = false; public bool IsSeparatorVisible { get; set; } = true; public Visibility _SeparatorVisibility => IsSeparatorVisible ? Visibility.Visible : Visibility.Collapsed; public Visibility _ToggleSwitchVisibility => Type == SettingsItemType.SingleToggleSwtich || Type == SettingsItemType.ToggleSwitchWithArrowButton ? Visibility.Visible : Visibility.Collapsed; private bool _toggleSwitchToggled; public bool ToggleSwitchToggled { get => _toggleSwitchToggled; set { if (_toggleSwitchToggled != value) { _toggleSwitchToggled = value; OnPropertyChanged(nameof(ToggleSwitchToggled)); // 通知绑定控件属性变化 OnToggleSwitchToggled?.Invoke(this, EventArgs.Empty); // 触发事件 } } } public event EventHandler OnToggleSwitchToggled; public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private SolidColorBrush _toggleSwitchBackground = new SolidColorBrush(Color.FromRgb(53, 132, 228)); public SolidColorBrush ToggleSwitchBackground { get => _toggleSwitchBackground; set { if (_toggleSwitchBackground != value) { _toggleSwitchBackground = value; OnPropertyChanged(nameof(ToggleSwitchBackground)); // 通知绑定控件属性变化 } } } private bool _toggleSwitchEnabled = true; public bool ToggleSwitchEnabled { get => _toggleSwitchEnabled; set { if (_toggleSwitchEnabled != value) { _toggleSwitchEnabled = value; OnPropertyChanged(nameof(ToggleSwitchEnabled)); // 通知绑定控件属性变化 } } } } public partial class SettingsBaseView : UserControl { public SettingsBaseView() { InitializeComponent(); SettingsViewBaseItemsControl.ItemsSource = SettingsPanels; } public ObservableCollection SettingsPanels { get; set; } = new ObservableCollection() { }; public event EventHandler IsTopBarNeedShadowEffect; public event EventHandler IsTopBarNeedNoShadowEffect; private void ScrollViewerEx_ScrollChanged(object sender, ScrollChangedEventArgs e) { var scrollViewer = (ScrollViewer)sender; if (scrollViewer.VerticalOffset >= 10) { IsTopBarNeedShadowEffect?.Invoke(this, new RoutedEventArgs()); } else { IsTopBarNeedNoShadowEffect?.Invoke(this, new RoutedEventArgs()); } } 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 ToggleSwitch_OnToggled(object sender, RoutedEventArgs e) { var toggleswitch = sender as ToggleSwitch; var item = toggleswitch.Tag as SettingsItem; item.ToggleSwitchToggled = toggleswitch.IsOn; } 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)); } } }