diff --git a/src/Avalonia.Themes.Fluent/FluentTheme.cs b/src/Avalonia.Themes.Fluent/FluentTheme.cs index 53be41e4d13..d1136d44a49 100644 --- a/src/Avalonia.Themes.Fluent/FluentTheme.cs +++ b/src/Avalonia.Themes.Fluent/FluentTheme.cs @@ -15,6 +15,12 @@ public enum FluentThemeMode Dark, } + public enum DensityStyle + { + Normal, + Compact + } + /// /// Includes the fluent theme in an application. /// @@ -24,6 +30,7 @@ public class FluentTheme : AvaloniaObject, IStyle, IResourceProvider private Styles _fluentDark = new(); private Styles _fluentLight = new(); private Styles _sharedStyles = new(); + private Styles _densityStyles = new(); private bool _isLoading; private IStyle? _loaded; @@ -47,9 +54,12 @@ public FluentTheme(IServiceProvider serviceProvider) InitStyles(_baseUri); } - public static readonly StyledProperty ModeProperty = AvaloniaProperty.Register(nameof(Mode)); + + public static readonly StyledProperty DensityStyleProperty = + AvaloniaProperty.Register(nameof(DensityStyle)); + /// /// Gets or sets the mode of the fluent theme (light, dark). /// @@ -58,6 +68,16 @@ public FluentThemeMode Mode get => GetValue(ModeProperty); set => SetValue(ModeProperty, value); } + + /// + /// Gets or sets the density style of the fluent theme (normal, compact). + /// + public DensityStyle DensityStyle + { + get => GetValue(DensityStyleProperty); + set => SetValue(DensityStyleProperty, value); + } + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { base.OnPropertyChanged(change); @@ -74,6 +94,18 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs (Loaded as Styles)![2] = _fluentLight[1]; } } + + if (change.Property == DensityStyleProperty) + { + if (DensityStyle == DensityStyle.Compact) + { + (Loaded as Styles)!.Add(_densityStyles[0]); + } + else if (DensityStyle == DensityStyle.Normal) + { + (Loaded as Styles)!.Remove(_densityStyles[0]); + } + } } public IResourceHost? Owner => (Loaded as IResourceProvider)?.Owner; @@ -97,6 +129,12 @@ public IStyle Loaded { _loaded = new Styles() { _sharedStyles, _fluentDark[0], _fluentDark[1] }; } + + if (DensityStyle == DensityStyle.Compact) + { + (_loaded as Styles)!.Add(_densityStyles[0]); + } + _isLoading = false; } @@ -183,6 +221,14 @@ private void InitStyles(Uri baseUri) Source = new Uri("avares://Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml") } }; + + _densityStyles = new Styles + { + new StyleInclude(baseUri) + { + Source = new Uri("avares://Avalonia.Themes.Fluent/DensityStyles/Compact.xaml") + } + }; } } }