diff --git a/samples/ControlCatalog/App.xaml.cs b/samples/ControlCatalog/App.xaml.cs
index 505f486a6d..f6d382f99d 100644
--- a/samples/ControlCatalog/App.xaml.cs
+++ b/samples/ControlCatalog/App.xaml.cs
@@ -5,6 +5,7 @@ using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using Avalonia.Markup.Xaml.Styling;
using Avalonia.Styling;
+using Avalonia.Themes.Default;
using Avalonia.Themes.Fluent;
using ControlCatalog.ViewModels;
@@ -29,6 +30,8 @@ namespace ControlCatalog
public static FluentTheme Fluent = new FluentTheme(new Uri("avares://ControlCatalog/Styles"));
+ public static SimpleTheme Default = new SimpleTheme(new Uri("avares://ControlCatalog/Styles"));
+
public static Styles DefaultLight = new Styles
{
new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog"))
@@ -43,14 +46,7 @@ namespace ControlCatalog
{
Source = new Uri("avares://Avalonia.Themes.Fluent/Accents/BaseLight.xaml")
},
- new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog"))
- {
- Source = new Uri("avares://Avalonia.Themes.Default/Accents/BaseLight.xaml")
- },
- new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog"))
- {
- Source = new Uri("avares://Avalonia.Themes.Default/DefaultTheme.xaml")
- }
+ Default
};
public static Styles DefaultDark = new Styles
@@ -67,14 +63,7 @@ namespace ControlCatalog
{
Source = new Uri("avares://Avalonia.Themes.Fluent/Accents/BaseDark.xaml")
},
- new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog"))
- {
- Source = new Uri("avares://Avalonia.Themes.Default/Accents/BaseDark.xaml")
- },
- new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog"))
- {
- Source = new Uri("avares://Avalonia.Themes.Default/DefaultTheme.xaml")
- }
+ Default
};
public override void Initialize()
diff --git a/samples/ControlCatalog/MainView.xaml.cs b/samples/ControlCatalog/MainView.xaml.cs
index 0579355831..79cf07c8d9 100644
--- a/samples/ControlCatalog/MainView.xaml.cs
+++ b/samples/ControlCatalog/MainView.xaml.cs
@@ -63,11 +63,13 @@ namespace ControlCatalog
}
else if (theme == CatalogTheme.DefaultLight)
{
+ App.Default.Mode = Avalonia.Themes.Default.SimpleThemeMode.Light;
Application.Current.Styles[0] = App.DefaultLight;
Application.Current.Styles[1] = App.DataGridDefault;
}
else if (theme == CatalogTheme.DefaultDark)
{
+ App.Default.Mode = Avalonia.Themes.Default.SimpleThemeMode.Dark;
Application.Current.Styles[0] = App.DefaultDark;
Application.Current.Styles[1] = App.DataGridDefault;
}
diff --git a/src/Avalonia.Controls/ValidatingToplevel.cs b/src/Avalonia.Controls/ValidatingToplevel.cs
index 97792a9c87..d1edd28ebc 100644
--- a/src/Avalonia.Controls/ValidatingToplevel.cs
+++ b/src/Avalonia.Controls/ValidatingToplevel.cs
@@ -236,7 +236,18 @@ internal class ValidatingWindowImpl : ValidatingWindowBaseImpl, IWindowImpl
public void SetTitle(string title) => Inner.SetTitle(title);
- public void SetParent(IWindowImpl parent) => Inner.SetParent(parent);
+ public void SetParent(IWindowImpl parent)
+ {
+ //Workaround. SetParent will cast IWindowImpl to WindowImpl but ValidatingWindowImpl isn't actual WindowImpl so it will fail with InvalidCastException.
+ if (parent is ValidatingWindowImpl validatingToplevelImpl)
+ {
+ Inner.SetParent(validatingToplevelImpl.Inner);
+ }
+ else
+ {
+ Inner.SetParent(parent);
+ }
+ }
public void SetEnabled(bool enable) => Inner.SetEnabled(enable);
@@ -323,4 +334,4 @@ internal class ValidatingPopupImpl : ValidatingWindowBaseImpl, IPopupImpl
public IPopupPositioner PopupPositioner => Inner.PopupPositioner;
public void SetWindowManagerAddShadowHint(bool enabled) => Inner.SetWindowManagerAddShadowHint(enabled);
-}
\ No newline at end of file
+}
diff --git a/src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml b/src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml
index 45bfe5ff81..c32638f6ca 100644
--- a/src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml
+++ b/src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml
@@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:Avalonia.Diagnostics.Views"
xmlns:diag="clr-namespace:Avalonia.Diagnostics"
+ xmlns:default="using:Avalonia.Themes.Default"
Title="Avalonia DevTools"
x:Class="Avalonia.Diagnostics.Views.MainWindow">
@@ -9,8 +10,7 @@
-
-
+
diff --git a/src/Avalonia.Themes.Default/Accents/BaseDark.xaml b/src/Avalonia.Themes.Default/Accents/BaseDark.xaml
index 5f18bac44a..1843abebfd 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 30c6d39856..6247815303 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 678f75b43f..ef200b5532 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 109fde390c..702fcc7c7a 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 effdb88537..598b418977 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 0000000000..1d9f2d5f9d
--- /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 0000000000..be33466327
--- /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/ButtonSpinner.xaml b/src/Avalonia.Themes.Fluent/Controls/ButtonSpinner.xaml
index f2344ab380..836cc27db3 100644
--- a/src/Avalonia.Themes.Fluent/Controls/ButtonSpinner.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/ButtonSpinner.xaml
@@ -1,7 +1,8 @@
+ xmlns:converters="clr-namespace:Avalonia.Controls.Converters;assembly=Avalonia.Controls"
+ x:CompileBindings="True">
diff --git a/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml b/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml
index 26c3bbc19f..ffd3972b66 100644
--- a/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml
@@ -7,7 +7,8 @@
+ xmlns:sys="clr-namespace:System;assembly=netstandard"
+ x:CompileBindings="True">
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ x:CompileBindings="True"
+ x:DataType="CalendarItem">
diff --git a/src/Avalonia.Themes.Fluent/Controls/DataValidationErrors.xaml b/src/Avalonia.Themes.Fluent/Controls/DataValidationErrors.xaml
index d2fab37206..12e148d2f9 100644
--- a/src/Avalonia.Themes.Fluent/Controls/DataValidationErrors.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/DataValidationErrors.xaml
@@ -1,6 +1,8 @@
+ xmlns:sys="using:System"
+ x:CompileBindings="True"
+ x:DataType="DataValidationErrors">
@@ -27,7 +29,7 @@
-
\ No newline at end of file
+
diff --git a/src/Avalonia.Themes.Fluent/Controls/MenuItem.xaml b/src/Avalonia.Themes.Fluent/Controls/MenuItem.xaml
index 72c25cea37..831537f578 100644
--- a/src/Avalonia.Themes.Fluent/Controls/MenuItem.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/MenuItem.xaml
@@ -1,7 +1,9 @@
+ xmlns:sys="clr-namespace:System;assembly=netstandard"
+ x:DataType="MenuItem"
+ x:CompileBindings="True">
diff --git a/src/Avalonia.Themes.Fluent/Controls/NativeMenuBar.xaml b/src/Avalonia.Themes.Fluent/Controls/NativeMenuBar.xaml
index 799fe6ffe4..243095c004 100644
--- a/src/Avalonia.Themes.Fluent/Controls/NativeMenuBar.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/NativeMenuBar.xaml
@@ -1,6 +1,7 @@
diff --git a/src/Avalonia.Themes.Fluent/Controls/TimePicker.xaml b/src/Avalonia.Themes.Fluent/Controls/TimePicker.xaml
index 3320fc9a41..9aa73fc52e 100644
--- a/src/Avalonia.Themes.Fluent/Controls/TimePicker.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/TimePicker.xaml
@@ -7,7 +7,8 @@
+ xmlns:sys="clr-namespace:System;assembly=netstandard"
+ x:CompileBindings="True">
40
1
diff --git a/src/Avalonia.Themes.Fluent/Controls/ToolTip.xaml b/src/Avalonia.Themes.Fluent/Controls/ToolTip.xaml
index debdfb2772..2d18be91cb 100644
--- a/src/Avalonia.Themes.Fluent/Controls/ToolTip.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/ToolTip.xaml
@@ -1,6 +1,7 @@
+ xmlns:sys="clr-namespace:System;assembly=netstandard"
+ x:CompileBindings="True">
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ x:DataType="WindowNotificationManager"
+ x:CompileBindings="True">
";
var styles = AvaloniaRuntimeXamlLoader.Parse(xaml);
diff --git a/tests/Avalonia.RenderTests/Media/StreamGeometryTests.cs b/tests/Avalonia.RenderTests/Media/StreamGeometryTests.cs
new file mode 100644
index 0000000000..fc9cbf6a7f
--- /dev/null
+++ b/tests/Avalonia.RenderTests/Media/StreamGeometryTests.cs
@@ -0,0 +1,56 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Avalonia.Controls;
+using Avalonia.Controls.Shapes;
+using Avalonia.Media;
+using Avalonia.Media.Imaging;
+using Xunit;
+
+#if AVALONIA_SKIA
+namespace Avalonia.Skia.RenderTests
+#else
+namespace Avalonia.Direct2D1.RenderTests.Media
+#endif
+{
+ public class StreamGeometryTests : TestBase
+ {
+ public StreamGeometryTests()
+ : base(@"Media\StreamGeometry")
+ {
+ }
+
+ [Fact]
+ public async Task PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions()
+ {
+ var grid = new Avalonia.Controls.Primitives.UniformGrid() { Columns = 2, Rows = 4, Width = 320, Height = 400 };
+ foreach (var sweepDirection in new[] { SweepDirection.Clockwise, SweepDirection.CounterClockwise })
+ foreach (var isLargeArc in new[] { false, true })
+ foreach (var isPrecise in new[] { false, true })
+ {
+ Point Pt(double x, double y) => new Point(x, y);
+ Size Sz(double w, double h) => new Size(w, h);
+ var streamGeometry = new StreamGeometry();
+ using (var context = streamGeometry.Open())
+ {
+ context.BeginFigure(Pt(20, 20), true);
+
+ if(isPrecise)
+ context.PreciseArcTo(Pt(40, 40), Sz(20, 20), 0, isLargeArc, sweepDirection);
+ else
+ context.ArcTo(Pt(40, 40), Sz(20, 20), 0, isLargeArc, sweepDirection);
+ context.LineTo(Pt(40, 20));
+ context.LineTo(Pt(20, 20));
+ context.EndFigure(true);
+ }
+ var pathShape = new Avalonia.Controls.Shapes.Path();
+ pathShape.Data = streamGeometry;
+ pathShape.Stroke = new SolidColorBrush(Colors.CornflowerBlue);
+ pathShape.Fill = new SolidColorBrush(Colors.Gold);
+ pathShape.StrokeThickness = 2;
+ pathShape.Margin = new Thickness(20);
+ grid.Children.Add(pathShape);
+ }
+ await RenderToFile(grid);
+ }
+ }
+}
diff --git a/tests/Avalonia.UnitTests/TestServices.cs b/tests/Avalonia.UnitTests/TestServices.cs
index 8d27562146..1e586e3bb1 100644
--- a/tests/Avalonia.UnitTests/TestServices.cs
+++ b/tests/Avalonia.UnitTests/TestServices.cs
@@ -168,7 +168,7 @@ namespace Avalonia.UnitTests
};
var baseLight = (IStyle)AvaloniaXamlLoader.Load(
- new Uri("resm:Avalonia.Themes.Default.Accents.BaseLight.xaml?assembly=Avalonia.Themes.Default"));
+ new Uri("avares://Avalonia.Themes.Default/Accents/BaseLight.xaml"));
result.Add(baseLight);
return result;
diff --git a/tests/Avalonia.UnitTests/UnitTestApplication.cs b/tests/Avalonia.UnitTests/UnitTestApplication.cs
index 2d37057779..dc10754ea2 100644
--- a/tests/Avalonia.UnitTests/UnitTestApplication.cs
+++ b/tests/Avalonia.UnitTests/UnitTestApplication.cs
@@ -10,6 +10,7 @@ using System.Reactive.Disposables;
using System.Reactive.Concurrency;
using Avalonia.Input.Platform;
using Avalonia.Animation;
+using Avalonia.Shared.PlatformSupport;
namespace Avalonia.UnitTests
{
@@ -29,6 +30,11 @@ namespace Avalonia.UnitTests
RegisterServices();
}
+ static UnitTestApplication()
+ {
+ AssetLoader.RegisterResUriParsers();
+ }
+
public static new UnitTestApplication Current => (UnitTestApplication)Application.Current;
public TestServices Services => _services;
diff --git a/tests/TestFiles/Direct2D1/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.deferred.expected.png b/tests/TestFiles/Direct2D1/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.deferred.expected.png
new file mode 100644
index 0000000000..825b1d7ea7
Binary files /dev/null and b/tests/TestFiles/Direct2D1/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.deferred.expected.png differ
diff --git a/tests/TestFiles/Direct2D1/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.immediate.expected.png b/tests/TestFiles/Direct2D1/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.immediate.expected.png
new file mode 100644
index 0000000000..825b1d7ea7
Binary files /dev/null and b/tests/TestFiles/Direct2D1/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.immediate.expected.png differ
diff --git a/tests/TestFiles/Skia/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.deferred.expected.png b/tests/TestFiles/Skia/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.deferred.expected.png
new file mode 100644
index 0000000000..f7cc90678a
Binary files /dev/null and b/tests/TestFiles/Skia/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.deferred.expected.png differ
diff --git a/tests/TestFiles/Skia/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.immediate.expected.png b/tests/TestFiles/Skia/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.immediate.expected.png
new file mode 100644
index 0000000000..f7cc90678a
Binary files /dev/null and b/tests/TestFiles/Skia/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.immediate.expected.png differ