diff --git a/build/SourceLink.props b/build/SourceLink.props
index 1e007e01eb7..9f058488812 100644
--- a/build/SourceLink.props
+++ b/build/SourceLink.props
@@ -3,7 +3,6 @@
true
false
true
- embedded
$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb
@@ -15,6 +14,10 @@
true
+
+ embedded
+
+
diff --git a/samples/ControlCatalog/App.xaml b/samples/ControlCatalog/App.xaml
index 227b31bf202..d0e1bd885e4 100644
--- a/samples/ControlCatalog/App.xaml
+++ b/samples/ControlCatalog/App.xaml
@@ -3,6 +3,7 @@
xmlns:vm="using:ControlCatalog.ViewModels"
x:DataType="vm:ApplicationViewModel"
x:CompileBindings="True"
+ Name="Avalonia ControlCatalog"
x:Class="ControlCatalog.App">
diff --git a/src/Avalonia.Themes.Default/Accents/BaseDark.xaml b/src/Avalonia.Themes.Default/Accents/BaseDark.xaml
index 5f18bac44ae..1843abebfd4 100644
--- a/src/Avalonia.Themes.Default/Accents/BaseDark.xaml
+++ b/src/Avalonia.Themes.Default/Accents/BaseDark.xaml
@@ -1,13 +1,9 @@
-
diff --git a/src/Avalonia.Themes.Default/Accents/BaseLight.xaml b/src/Avalonia.Themes.Default/Accents/BaseLight.xaml
index 30c6d398568..6247815303c 100644
--- a/src/Avalonia.Themes.Default/Accents/BaseLight.xaml
+++ b/src/Avalonia.Themes.Default/Accents/BaseLight.xaml
@@ -1,82 +1,38 @@
-
diff --git a/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj b/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj
index 678f75b43fa..ef200b5532e 100644
--- a/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj
+++ b/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj
@@ -13,10 +13,7 @@
-
-
-
-
+
diff --git a/src/Avalonia.Themes.Default/AutoCompleteBox.xaml b/src/Avalonia.Themes.Default/Controls/AutoCompleteBox.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/AutoCompleteBox.xaml
rename to src/Avalonia.Themes.Default/Controls/AutoCompleteBox.xaml
diff --git a/src/Avalonia.Themes.Default/Button.xaml b/src/Avalonia.Themes.Default/Controls/Button.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/Button.xaml
rename to src/Avalonia.Themes.Default/Controls/Button.xaml
diff --git a/src/Avalonia.Themes.Default/ButtonSpinner.xaml b/src/Avalonia.Themes.Default/Controls/ButtonSpinner.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ButtonSpinner.xaml
rename to src/Avalonia.Themes.Default/Controls/ButtonSpinner.xaml
diff --git a/src/Avalonia.Themes.Default/Calendar.xaml b/src/Avalonia.Themes.Default/Controls/Calendar.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/Calendar.xaml
rename to src/Avalonia.Themes.Default/Controls/Calendar.xaml
diff --git a/src/Avalonia.Themes.Default/CalendarButton.xaml b/src/Avalonia.Themes.Default/Controls/CalendarButton.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/CalendarButton.xaml
rename to src/Avalonia.Themes.Default/Controls/CalendarButton.xaml
diff --git a/src/Avalonia.Themes.Default/CalendarDatePicker.xaml b/src/Avalonia.Themes.Default/Controls/CalendarDatePicker.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/CalendarDatePicker.xaml
rename to src/Avalonia.Themes.Default/Controls/CalendarDatePicker.xaml
diff --git a/src/Avalonia.Themes.Default/CalendarDayButton.xaml b/src/Avalonia.Themes.Default/Controls/CalendarDayButton.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/CalendarDayButton.xaml
rename to src/Avalonia.Themes.Default/Controls/CalendarDayButton.xaml
diff --git a/src/Avalonia.Themes.Default/CalendarItem.xaml b/src/Avalonia.Themes.Default/Controls/CalendarItem.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/CalendarItem.xaml
rename to src/Avalonia.Themes.Default/Controls/CalendarItem.xaml
diff --git a/src/Avalonia.Themes.Default/CaptionButtons.xaml b/src/Avalonia.Themes.Default/Controls/CaptionButtons.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/CaptionButtons.xaml
rename to src/Avalonia.Themes.Default/Controls/CaptionButtons.xaml
diff --git a/src/Avalonia.Themes.Default/Carousel.xaml b/src/Avalonia.Themes.Default/Controls/Carousel.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/Carousel.xaml
rename to src/Avalonia.Themes.Default/Controls/Carousel.xaml
diff --git a/src/Avalonia.Themes.Default/CheckBox.xaml b/src/Avalonia.Themes.Default/Controls/CheckBox.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/CheckBox.xaml
rename to src/Avalonia.Themes.Default/Controls/CheckBox.xaml
diff --git a/src/Avalonia.Themes.Default/ComboBox.xaml b/src/Avalonia.Themes.Default/Controls/ComboBox.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ComboBox.xaml
rename to src/Avalonia.Themes.Default/Controls/ComboBox.xaml
diff --git a/src/Avalonia.Themes.Default/ComboBoxItem.xaml b/src/Avalonia.Themes.Default/Controls/ComboBoxItem.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ComboBoxItem.xaml
rename to src/Avalonia.Themes.Default/Controls/ComboBoxItem.xaml
diff --git a/src/Avalonia.Themes.Default/ContentControl.xaml b/src/Avalonia.Themes.Default/Controls/ContentControl.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ContentControl.xaml
rename to src/Avalonia.Themes.Default/Controls/ContentControl.xaml
diff --git a/src/Avalonia.Themes.Default/ContextMenu.xaml b/src/Avalonia.Themes.Default/Controls/ContextMenu.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ContextMenu.xaml
rename to src/Avalonia.Themes.Default/Controls/ContextMenu.xaml
diff --git a/src/Avalonia.Themes.Default/DataValidationErrors.xaml b/src/Avalonia.Themes.Default/Controls/DataValidationErrors.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/DataValidationErrors.xaml
rename to src/Avalonia.Themes.Default/Controls/DataValidationErrors.xaml
diff --git a/src/Avalonia.Themes.Default/DatePicker.xaml b/src/Avalonia.Themes.Default/Controls/DatePicker.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/DatePicker.xaml
rename to src/Avalonia.Themes.Default/Controls/DatePicker.xaml
diff --git a/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml b/src/Avalonia.Themes.Default/Controls/EmbeddableControlRoot.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml
rename to src/Avalonia.Themes.Default/Controls/EmbeddableControlRoot.xaml
diff --git a/src/Avalonia.Themes.Default/Expander.xaml b/src/Avalonia.Themes.Default/Controls/Expander.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/Expander.xaml
rename to src/Avalonia.Themes.Default/Controls/Expander.xaml
diff --git a/src/Avalonia.Themes.Default/FlyoutPresenter.xaml b/src/Avalonia.Themes.Default/Controls/FlyoutPresenter.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/FlyoutPresenter.xaml
rename to src/Avalonia.Themes.Default/Controls/FlyoutPresenter.xaml
diff --git a/src/Avalonia.Themes.Default/FocusAdorner.xaml b/src/Avalonia.Themes.Default/Controls/FocusAdorner.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/FocusAdorner.xaml
rename to src/Avalonia.Themes.Default/Controls/FocusAdorner.xaml
diff --git a/src/Avalonia.Themes.Default/GridSplitter.xaml b/src/Avalonia.Themes.Default/Controls/GridSplitter.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/GridSplitter.xaml
rename to src/Avalonia.Themes.Default/Controls/GridSplitter.xaml
diff --git a/src/Avalonia.Themes.Default/ItemsControl.xaml b/src/Avalonia.Themes.Default/Controls/ItemsControl.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ItemsControl.xaml
rename to src/Avalonia.Themes.Default/Controls/ItemsControl.xaml
diff --git a/src/Avalonia.Themes.Default/Label.xaml b/src/Avalonia.Themes.Default/Controls/Label.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/Label.xaml
rename to src/Avalonia.Themes.Default/Controls/Label.xaml
diff --git a/src/Avalonia.Themes.Default/ListBox.xaml b/src/Avalonia.Themes.Default/Controls/ListBox.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ListBox.xaml
rename to src/Avalonia.Themes.Default/Controls/ListBox.xaml
diff --git a/src/Avalonia.Themes.Default/ListBoxItem.xaml b/src/Avalonia.Themes.Default/Controls/ListBoxItem.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ListBoxItem.xaml
rename to src/Avalonia.Themes.Default/Controls/ListBoxItem.xaml
diff --git a/src/Avalonia.Themes.Default/ManagedFileChooser.xaml b/src/Avalonia.Themes.Default/Controls/ManagedFileChooser.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ManagedFileChooser.xaml
rename to src/Avalonia.Themes.Default/Controls/ManagedFileChooser.xaml
diff --git a/src/Avalonia.Themes.Default/Menu.xaml b/src/Avalonia.Themes.Default/Controls/Menu.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/Menu.xaml
rename to src/Avalonia.Themes.Default/Controls/Menu.xaml
diff --git a/src/Avalonia.Themes.Default/MenuFlyoutPresenter.xaml b/src/Avalonia.Themes.Default/Controls/MenuFlyoutPresenter.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/MenuFlyoutPresenter.xaml
rename to src/Avalonia.Themes.Default/Controls/MenuFlyoutPresenter.xaml
diff --git a/src/Avalonia.Themes.Default/MenuItem.xaml b/src/Avalonia.Themes.Default/Controls/MenuItem.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/MenuItem.xaml
rename to src/Avalonia.Themes.Default/Controls/MenuItem.xaml
diff --git a/src/Avalonia.Themes.Default/NativeMenuBar.xaml b/src/Avalonia.Themes.Default/Controls/NativeMenuBar.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/NativeMenuBar.xaml
rename to src/Avalonia.Themes.Default/Controls/NativeMenuBar.xaml
diff --git a/src/Avalonia.Themes.Default/NotificationCard.xaml b/src/Avalonia.Themes.Default/Controls/NotificationCard.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/NotificationCard.xaml
rename to src/Avalonia.Themes.Default/Controls/NotificationCard.xaml
diff --git a/src/Avalonia.Themes.Default/NumericUpDown.xaml b/src/Avalonia.Themes.Default/Controls/NumericUpDown.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/NumericUpDown.xaml
rename to src/Avalonia.Themes.Default/Controls/NumericUpDown.xaml
diff --git a/src/Avalonia.Themes.Default/OverlayPopupHost.xaml b/src/Avalonia.Themes.Default/Controls/OverlayPopupHost.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/OverlayPopupHost.xaml
rename to src/Avalonia.Themes.Default/Controls/OverlayPopupHost.xaml
diff --git a/src/Avalonia.Themes.Default/PathIcon.xaml b/src/Avalonia.Themes.Default/Controls/PathIcon.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/PathIcon.xaml
rename to src/Avalonia.Themes.Default/Controls/PathIcon.xaml
diff --git a/src/Avalonia.Themes.Default/PopupRoot.xaml b/src/Avalonia.Themes.Default/Controls/PopupRoot.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/PopupRoot.xaml
rename to src/Avalonia.Themes.Default/Controls/PopupRoot.xaml
diff --git a/src/Avalonia.Themes.Default/ProgressBar.xaml b/src/Avalonia.Themes.Default/Controls/ProgressBar.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ProgressBar.xaml
rename to src/Avalonia.Themes.Default/Controls/ProgressBar.xaml
diff --git a/src/Avalonia.Themes.Default/RadioButton.xaml b/src/Avalonia.Themes.Default/Controls/RadioButton.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/RadioButton.xaml
rename to src/Avalonia.Themes.Default/Controls/RadioButton.xaml
diff --git a/src/Avalonia.Themes.Default/RepeatButton.xaml b/src/Avalonia.Themes.Default/Controls/RepeatButton.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/RepeatButton.xaml
rename to src/Avalonia.Themes.Default/Controls/RepeatButton.xaml
diff --git a/src/Avalonia.Themes.Default/ScrollBar.xaml b/src/Avalonia.Themes.Default/Controls/ScrollBar.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ScrollBar.xaml
rename to src/Avalonia.Themes.Default/Controls/ScrollBar.xaml
diff --git a/src/Avalonia.Themes.Default/ScrollViewer.xaml b/src/Avalonia.Themes.Default/Controls/ScrollViewer.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ScrollViewer.xaml
rename to src/Avalonia.Themes.Default/Controls/ScrollViewer.xaml
diff --git a/src/Avalonia.Themes.Default/Separator.xaml b/src/Avalonia.Themes.Default/Controls/Separator.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/Separator.xaml
rename to src/Avalonia.Themes.Default/Controls/Separator.xaml
diff --git a/src/Avalonia.Themes.Default/Slider.xaml b/src/Avalonia.Themes.Default/Controls/Slider.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/Slider.xaml
rename to src/Avalonia.Themes.Default/Controls/Slider.xaml
diff --git a/src/Avalonia.Themes.Default/SplitView.xaml b/src/Avalonia.Themes.Default/Controls/SplitView.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/SplitView.xaml
rename to src/Avalonia.Themes.Default/Controls/SplitView.xaml
diff --git a/src/Avalonia.Themes.Default/TabControl.xaml b/src/Avalonia.Themes.Default/Controls/TabControl.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/TabControl.xaml
rename to src/Avalonia.Themes.Default/Controls/TabControl.xaml
diff --git a/src/Avalonia.Themes.Default/TabItem.xaml b/src/Avalonia.Themes.Default/Controls/TabItem.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/TabItem.xaml
rename to src/Avalonia.Themes.Default/Controls/TabItem.xaml
diff --git a/src/Avalonia.Themes.Default/TabStrip.xaml b/src/Avalonia.Themes.Default/Controls/TabStrip.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/TabStrip.xaml
rename to src/Avalonia.Themes.Default/Controls/TabStrip.xaml
diff --git a/src/Avalonia.Themes.Default/TabStripItem.xaml b/src/Avalonia.Themes.Default/Controls/TabStripItem.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/TabStripItem.xaml
rename to src/Avalonia.Themes.Default/Controls/TabStripItem.xaml
diff --git a/src/Avalonia.Themes.Default/TextBox.xaml b/src/Avalonia.Themes.Default/Controls/TextBox.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/TextBox.xaml
rename to src/Avalonia.Themes.Default/Controls/TextBox.xaml
diff --git a/src/Avalonia.Themes.Default/TimePicker.xaml b/src/Avalonia.Themes.Default/Controls/TimePicker.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/TimePicker.xaml
rename to src/Avalonia.Themes.Default/Controls/TimePicker.xaml
diff --git a/src/Avalonia.Themes.Default/TitleBar.xaml b/src/Avalonia.Themes.Default/Controls/TitleBar.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/TitleBar.xaml
rename to src/Avalonia.Themes.Default/Controls/TitleBar.xaml
diff --git a/src/Avalonia.Themes.Default/ToggleButton.xaml b/src/Avalonia.Themes.Default/Controls/ToggleButton.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ToggleButton.xaml
rename to src/Avalonia.Themes.Default/Controls/ToggleButton.xaml
diff --git a/src/Avalonia.Themes.Default/ToggleSwitch.xaml b/src/Avalonia.Themes.Default/Controls/ToggleSwitch.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ToggleSwitch.xaml
rename to src/Avalonia.Themes.Default/Controls/ToggleSwitch.xaml
diff --git a/src/Avalonia.Themes.Default/ToolTip.xaml b/src/Avalonia.Themes.Default/Controls/ToolTip.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/ToolTip.xaml
rename to src/Avalonia.Themes.Default/Controls/ToolTip.xaml
diff --git a/src/Avalonia.Themes.Default/TreeView.xaml b/src/Avalonia.Themes.Default/Controls/TreeView.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/TreeView.xaml
rename to src/Avalonia.Themes.Default/Controls/TreeView.xaml
diff --git a/src/Avalonia.Themes.Default/TreeViewItem.xaml b/src/Avalonia.Themes.Default/Controls/TreeViewItem.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/TreeViewItem.xaml
rename to src/Avalonia.Themes.Default/Controls/TreeViewItem.xaml
diff --git a/src/Avalonia.Themes.Default/UserControl.xaml b/src/Avalonia.Themes.Default/Controls/UserControl.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/UserControl.xaml
rename to src/Avalonia.Themes.Default/Controls/UserControl.xaml
diff --git a/src/Avalonia.Themes.Default/Window.xaml b/src/Avalonia.Themes.Default/Controls/Window.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/Window.xaml
rename to src/Avalonia.Themes.Default/Controls/Window.xaml
diff --git a/src/Avalonia.Themes.Default/WindowNotificationManager.xaml b/src/Avalonia.Themes.Default/Controls/WindowNotificationManager.xaml
similarity index 100%
rename from src/Avalonia.Themes.Default/WindowNotificationManager.xaml
rename to src/Avalonia.Themes.Default/Controls/WindowNotificationManager.xaml
diff --git a/src/Avalonia.Themes.Default/DefaultTheme.xaml b/src/Avalonia.Themes.Default/DefaultTheme.xaml
index 109fde390cc..702fcc7c7a2 100644
--- a/src/Avalonia.Themes.Default/DefaultTheme.xaml
+++ b/src/Avalonia.Themes.Default/DefaultTheme.xaml
@@ -2,65 +2,65 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Avalonia.Themes.Default.DefaultTheme">
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Avalonia.Themes.Default/DefaultTheme.xaml.cs b/src/Avalonia.Themes.Default/DefaultTheme.xaml.cs
index effdb885372..598b418977e 100644
--- a/src/Avalonia.Themes.Default/DefaultTheme.xaml.cs
+++ b/src/Avalonia.Themes.Default/DefaultTheme.xaml.cs
@@ -1,4 +1,3 @@
-using Avalonia.Markup.Xaml;
using Avalonia.Styling;
namespace Avalonia.Themes.Default
diff --git a/src/Avalonia.Themes.Default/SimpleTheme.cs b/src/Avalonia.Themes.Default/SimpleTheme.cs
new file mode 100644
index 00000000000..1d9f2d5f9d4
--- /dev/null
+++ b/src/Avalonia.Themes.Default/SimpleTheme.cs
@@ -0,0 +1,166 @@
+using System;
+using System.Collections.Generic;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+using Avalonia.Markup.Xaml.Styling;
+using Avalonia.Styling;
+#nullable enable
+
+namespace Avalonia.Themes.Default
+{
+ public class SimpleTheme : AvaloniaObject, IStyle, IResourceProvider
+ {
+ public static readonly StyledProperty ModeProperty =
+ AvaloniaProperty.Register(nameof(Mode));
+
+ private readonly Uri _baseUri;
+ private bool _isLoading;
+ private IStyle? _loaded;
+ private Styles _sharedStyles = new();
+ private Styles _simpleDark = new();
+ private Styles _simpleLight = new();
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The base URL for the XAML context.
+ public SimpleTheme(Uri baseUri)
+ {
+ _baseUri = baseUri;
+ InitStyles(_baseUri);
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The XAML service provider.
+ public SimpleTheme(IServiceProvider serviceProvider)
+ {
+ var service = serviceProvider.GetService(typeof(IUriContext));
+ if (service == null)
+ {
+ throw new Exception("There is no service object of type IUriContext!");
+ }
+ _baseUri = ((IUriContext)service).BaseUri;
+ InitStyles(_baseUri);
+ }
+
+ public event EventHandler OwnerChanged
+ {
+ add
+ {
+ if (Loaded is IResourceProvider rp)
+ {
+ rp.OwnerChanged += value;
+ }
+ }
+ remove
+ {
+ if (Loaded is IResourceProvider rp)
+ {
+ rp.OwnerChanged -= value;
+ }
+ }
+ }
+
+ IReadOnlyList IStyle.Children => _loaded?.Children ?? Array.Empty();
+
+ bool IResourceNode.HasResources => (Loaded as IResourceProvider)?.HasResources ?? false;
+
+ public IStyle Loaded
+ {
+ get
+ {
+ if (_loaded == null)
+ {
+ _isLoading = true;
+
+ if (Mode == SimpleThemeMode.Light)
+ {
+ _loaded = new Styles { _sharedStyles, _simpleLight };
+ }
+ else if (Mode == SimpleThemeMode.Dark)
+ {
+ _loaded = new Styles { _sharedStyles, _simpleDark };
+ }
+ _isLoading = false;
+ }
+
+ return _loaded!;
+ }
+ }
+
+ ///
+ /// Gets or sets the mode of the fluent theme (light, dark).
+ ///
+ public SimpleThemeMode Mode
+ {
+ get => GetValue(ModeProperty);
+ set => SetValue(ModeProperty, value);
+ }
+ public IResourceHost? Owner => (Loaded as IResourceProvider)?.Owner;
+
+ void IResourceProvider.AddOwner(IResourceHost owner) => (Loaded as IResourceProvider)?.AddOwner(owner);
+
+ void IResourceProvider.RemoveOwner(IResourceHost owner) => (Loaded as IResourceProvider)?.RemoveOwner(owner);
+
+ public SelectorMatchResult TryAttach(IStyleable target, IStyleHost? host) => Loaded.TryAttach(target, host);
+
+ public bool TryGetResource(object key, out object? value)
+ {
+ if (!_isLoading && Loaded is IResourceProvider p)
+ {
+ return p.TryGetResource(key, out value);
+ }
+
+ value = null;
+ return false;
+ }
+
+ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
+ {
+ base.OnPropertyChanged(change);
+ if (change.Property == ModeProperty)
+ {
+ if (Mode == SimpleThemeMode.Dark)
+ {
+ (Loaded as Styles)![1] = _simpleDark[0];
+ }
+ else
+ {
+ (Loaded as Styles)![1] = _simpleLight[0];
+ }
+ }
+ }
+
+ private void InitStyles(Uri baseUri)
+ {
+ _sharedStyles = new Styles
+ {
+ new StyleInclude(baseUri)
+ {
+ Source = new Uri("avares://Avalonia.Themes.Default/DefaultTheme.xaml")
+ },
+ new StyleInclude(baseUri)
+ {
+ Source = new Uri("avares://Avalonia.Themes.Default/Accents/Base.xaml")
+ }
+ };
+ _simpleLight = new Styles
+ {
+ new StyleInclude(baseUri)
+ {
+ Source = new Uri("avares://Avalonia.Themes.Default/Accents/BaseLight.xaml")
+ }
+ };
+
+ _simpleDark = new Styles
+ {
+ new StyleInclude(baseUri)
+ {
+ Source = new Uri("avares://Avalonia.Themes.Default/Accents/BaseDark.xaml")
+ }
+ };
+ }
+
+ }
+}
diff --git a/src/Avalonia.Themes.Default/SimpleThemeMode.cs b/src/Avalonia.Themes.Default/SimpleThemeMode.cs
new file mode 100644
index 00000000000..be334663278
--- /dev/null
+++ b/src/Avalonia.Themes.Default/SimpleThemeMode.cs
@@ -0,0 +1,8 @@
+namespace Avalonia.Themes.Default
+{
+ public enum SimpleThemeMode
+ {
+ Light,
+ Dark
+ }
+}
diff --git a/src/Avalonia.Themes.Fluent/Controls/CalendarButton.xaml b/src/Avalonia.Themes.Fluent/Controls/CalendarButton.xaml
index ca538e4b0ae..3a6af609839 100644
--- a/src/Avalonia.Themes.Fluent/Controls/CalendarButton.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/CalendarButton.xaml
@@ -11,7 +11,7 @@
-
+
diff --git a/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml b/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml
index 6c4e94caf13..26c3bbc19fe 100644
--- a/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml
@@ -33,6 +33,7 @@
+
@@ -107,7 +108,6 @@
Padding="{TemplateBinding Padding}"
Watermark="{TemplateBinding Watermark}"
UseFloatingWatermark="{TemplateBinding UseFloatingWatermark}"
- DataValidationErrors.Errors="{TemplateBinding (DataValidationErrors.Errors)}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
Grid.Column="0"/>
@@ -136,8 +136,12 @@
DisplayDateEnd="{TemplateBinding DisplayDateEnd}" />
+
+
diff --git a/src/Avalonia.Themes.Fluent/Controls/CalendarDayButton.xaml b/src/Avalonia.Themes.Fluent/Controls/CalendarDayButton.xaml
index ff72044c93c..9223c0dd71c 100644
--- a/src/Avalonia.Themes.Fluent/Controls/CalendarDayButton.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/CalendarDayButton.xaml
@@ -11,7 +11,7 @@
-
+
diff --git a/src/Avalonia.Themes.Fluent/Controls/CalendarItem.xaml b/src/Avalonia.Themes.Fluent/Controls/CalendarItem.xaml
index 5bf3ac11af0..2c1031f3e5e 100644
--- a/src/Avalonia.Themes.Fluent/Controls/CalendarItem.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/CalendarItem.xaml
@@ -32,6 +32,7 @@