using System.Windows; using System.Windows.Controls; namespace XFEToolBox.WpfCore.Controls; /// /// 将相关的 设置项组织为可折叠组。 /// public class SettingsExpander : HeaderedItemsControl { public static readonly DependencyProperty DescriptionProperty = DependencyProperty.Register( nameof(Description), typeof(object), typeof(SettingsExpander), new PropertyMetadata(null)); public static readonly DependencyProperty DescriptionTemplateProperty = DependencyProperty.Register( nameof(DescriptionTemplate), typeof(DataTemplate), typeof(SettingsExpander), new PropertyMetadata(null)); public static readonly DependencyProperty HeaderIconProperty = DependencyProperty.Register( nameof(HeaderIcon), typeof(object), typeof(SettingsExpander), new PropertyMetadata(null)); public static readonly DependencyProperty HeaderIconTemplateProperty = DependencyProperty.Register( nameof(HeaderIconTemplate), typeof(DataTemplate), typeof(SettingsExpander), new PropertyMetadata(null)); public static readonly DependencyProperty ContentProperty = DependencyProperty.Register( nameof(Content), typeof(object), typeof(SettingsExpander), new PropertyMetadata(null)); public static readonly DependencyProperty ContentTemplateProperty = DependencyProperty.Register( nameof(ContentTemplate), typeof(DataTemplate), typeof(SettingsExpander), new PropertyMetadata(null)); public static readonly DependencyProperty ItemsHeaderProperty = DependencyProperty.Register( nameof(ItemsHeader), typeof(object), typeof(SettingsExpander), new PropertyMetadata(null)); public static readonly DependencyProperty ItemsFooterProperty = DependencyProperty.Register( nameof(ItemsFooter), typeof(object), typeof(SettingsExpander), new PropertyMetadata(null)); public static readonly DependencyProperty IsHeaderClickEnabledProperty = DependencyProperty.Register( nameof(IsHeaderClickEnabled), typeof(bool), typeof(SettingsExpander), new PropertyMetadata(true)); public static readonly DependencyProperty IsExpandedProperty = DependencyProperty.Register( nameof(IsExpanded), typeof(bool), typeof(SettingsExpander), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnIsExpandedChanged)); public static readonly RoutedEvent ExpandedEvent = EventManager.RegisterRoutedEvent( nameof(Expanded), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SettingsExpander)); public static readonly RoutedEvent CollapsedEvent = EventManager.RegisterRoutedEvent( nameof(Collapsed), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SettingsExpander)); public object? Description { get => GetValue(DescriptionProperty); set => SetValue(DescriptionProperty, value); } public DataTemplate? DescriptionTemplate { get => (DataTemplate?)GetValue(DescriptionTemplateProperty); set => SetValue(DescriptionTemplateProperty, value); } public object? HeaderIcon { get => GetValue(HeaderIconProperty); set => SetValue(HeaderIconProperty, value); } public DataTemplate? HeaderIconTemplate { get => (DataTemplate?)GetValue(HeaderIconTemplateProperty); set => SetValue(HeaderIconTemplateProperty, value); } public object? Content { get => GetValue(ContentProperty); set => SetValue(ContentProperty, value); } public DataTemplate? ContentTemplate { get => (DataTemplate?)GetValue(ContentTemplateProperty); set => SetValue(ContentTemplateProperty, value); } public object? ItemsHeader { get => GetValue(ItemsHeaderProperty); set => SetValue(ItemsHeaderProperty, value); } public object? ItemsFooter { get => GetValue(ItemsFooterProperty); set => SetValue(ItemsFooterProperty, value); } public bool IsHeaderClickEnabled { get => (bool)GetValue(IsHeaderClickEnabledProperty); set => SetValue(IsHeaderClickEnabledProperty, value); } public bool IsExpanded { get => (bool)GetValue(IsExpandedProperty); set => SetValue(IsExpandedProperty, value); } public event RoutedEventHandler Expanded { add => AddHandler(ExpandedEvent, value); remove => RemoveHandler(ExpandedEvent, value); } public event RoutedEventHandler Collapsed { add => AddHandler(CollapsedEvent, value); remove => RemoveHandler(CollapsedEvent, value); } private static void OnIsExpandedChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs) { var expander = (SettingsExpander)dependencyObject; expander.RaiseEvent(new RoutedEventArgs((bool)eventArgs.NewValue ? ExpandedEvent : CollapsedEvent, expander)); } }