Browse Source

Merge branch 'master' into fixex/pointer-popup-positioning

pull/7250/head
Max Katz 5 years ago
committed by GitHub
parent
commit
71743c5f80
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 21
      samples/ControlCatalog/App.xaml.cs
  2. 2
      samples/ControlCatalog/MainView.xaml.cs
  3. 15
      src/Avalonia.Controls/ValidatingToplevel.cs
  4. 4
      src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml
  5. 64
      src/Avalonia.Themes.Default/Accents/Base.xaml
  6. 77
      src/Avalonia.Themes.Default/Accents/BaseDark.xaml
  7. 82
      src/Avalonia.Themes.Default/Accents/BaseLight.xaml
  8. 5
      src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj
  9. 0
      src/Avalonia.Themes.Default/Controls/AutoCompleteBox.xaml
  10. 0
      src/Avalonia.Themes.Default/Controls/Button.xaml
  11. 0
      src/Avalonia.Themes.Default/Controls/ButtonSpinner.xaml
  12. 0
      src/Avalonia.Themes.Default/Controls/Calendar.xaml
  13. 0
      src/Avalonia.Themes.Default/Controls/CalendarButton.xaml
  14. 0
      src/Avalonia.Themes.Default/Controls/CalendarDatePicker.xaml
  15. 0
      src/Avalonia.Themes.Default/Controls/CalendarDayButton.xaml
  16. 0
      src/Avalonia.Themes.Default/Controls/CalendarItem.xaml
  17. 0
      src/Avalonia.Themes.Default/Controls/CaptionButtons.xaml
  18. 0
      src/Avalonia.Themes.Default/Controls/Carousel.xaml
  19. 0
      src/Avalonia.Themes.Default/Controls/CheckBox.xaml
  20. 0
      src/Avalonia.Themes.Default/Controls/ComboBox.xaml
  21. 0
      src/Avalonia.Themes.Default/Controls/ComboBoxItem.xaml
  22. 0
      src/Avalonia.Themes.Default/Controls/ContentControl.xaml
  23. 0
      src/Avalonia.Themes.Default/Controls/ContextMenu.xaml
  24. 0
      src/Avalonia.Themes.Default/Controls/DataValidationErrors.xaml
  25. 0
      src/Avalonia.Themes.Default/Controls/DatePicker.xaml
  26. 0
      src/Avalonia.Themes.Default/Controls/EmbeddableControlRoot.xaml
  27. 0
      src/Avalonia.Themes.Default/Controls/Expander.xaml
  28. 0
      src/Avalonia.Themes.Default/Controls/FlyoutPresenter.xaml
  29. 0
      src/Avalonia.Themes.Default/Controls/FocusAdorner.xaml
  30. 0
      src/Avalonia.Themes.Default/Controls/GridSplitter.xaml
  31. 0
      src/Avalonia.Themes.Default/Controls/ItemsControl.xaml
  32. 0
      src/Avalonia.Themes.Default/Controls/Label.xaml
  33. 0
      src/Avalonia.Themes.Default/Controls/ListBox.xaml
  34. 0
      src/Avalonia.Themes.Default/Controls/ListBoxItem.xaml
  35. 0
      src/Avalonia.Themes.Default/Controls/ManagedFileChooser.xaml
  36. 0
      src/Avalonia.Themes.Default/Controls/Menu.xaml
  37. 0
      src/Avalonia.Themes.Default/Controls/MenuFlyoutPresenter.xaml
  38. 0
      src/Avalonia.Themes.Default/Controls/MenuItem.xaml
  39. 0
      src/Avalonia.Themes.Default/Controls/NativeMenuBar.xaml
  40. 0
      src/Avalonia.Themes.Default/Controls/NotificationCard.xaml
  41. 0
      src/Avalonia.Themes.Default/Controls/NumericUpDown.xaml
  42. 0
      src/Avalonia.Themes.Default/Controls/OverlayPopupHost.xaml
  43. 0
      src/Avalonia.Themes.Default/Controls/PathIcon.xaml
  44. 0
      src/Avalonia.Themes.Default/Controls/PopupRoot.xaml
  45. 0
      src/Avalonia.Themes.Default/Controls/ProgressBar.xaml
  46. 0
      src/Avalonia.Themes.Default/Controls/RadioButton.xaml
  47. 0
      src/Avalonia.Themes.Default/Controls/RepeatButton.xaml
  48. 0
      src/Avalonia.Themes.Default/Controls/ScrollBar.xaml
  49. 0
      src/Avalonia.Themes.Default/Controls/ScrollViewer.xaml
  50. 0
      src/Avalonia.Themes.Default/Controls/Separator.xaml
  51. 0
      src/Avalonia.Themes.Default/Controls/Slider.xaml
  52. 0
      src/Avalonia.Themes.Default/Controls/SplitView.xaml
  53. 0
      src/Avalonia.Themes.Default/Controls/TabControl.xaml
  54. 0
      src/Avalonia.Themes.Default/Controls/TabItem.xaml
  55. 0
      src/Avalonia.Themes.Default/Controls/TabStrip.xaml
  56. 0
      src/Avalonia.Themes.Default/Controls/TabStripItem.xaml
  57. 0
      src/Avalonia.Themes.Default/Controls/TextBox.xaml
  58. 0
      src/Avalonia.Themes.Default/Controls/TimePicker.xaml
  59. 0
      src/Avalonia.Themes.Default/Controls/TitleBar.xaml
  60. 0
      src/Avalonia.Themes.Default/Controls/ToggleButton.xaml
  61. 0
      src/Avalonia.Themes.Default/Controls/ToggleSwitch.xaml
  62. 0
      src/Avalonia.Themes.Default/Controls/ToolTip.xaml
  63. 0
      src/Avalonia.Themes.Default/Controls/TreeView.xaml
  64. 0
      src/Avalonia.Themes.Default/Controls/TreeViewItem.xaml
  65. 0
      src/Avalonia.Themes.Default/Controls/UserControl.xaml
  66. 0
      src/Avalonia.Themes.Default/Controls/Window.xaml
  67. 0
      src/Avalonia.Themes.Default/Controls/WindowNotificationManager.xaml
  68. 118
      src/Avalonia.Themes.Default/DefaultTheme.xaml
  69. 1
      src/Avalonia.Themes.Default/DefaultTheme.xaml.cs
  70. 166
      src/Avalonia.Themes.Default/SimpleTheme.cs
  71. 8
      src/Avalonia.Themes.Default/SimpleThemeMode.cs
  72. 3
      src/Avalonia.Themes.Fluent/Controls/ButtonSpinner.xaml
  73. 3
      src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml
  74. 4
      src/Avalonia.Themes.Fluent/Controls/CalendarItem.xaml
  75. 8
      src/Avalonia.Themes.Fluent/Controls/DataValidationErrors.xaml
  76. 3
      src/Avalonia.Themes.Fluent/Controls/DatePicker.xaml
  77. 8
      src/Avalonia.Themes.Fluent/Controls/Expander.xaml
  78. 4
      src/Avalonia.Themes.Fluent/Controls/ManagedFileChooser.xaml
  79. 6
      src/Avalonia.Themes.Fluent/Controls/MenuItem.xaml
  80. 3
      src/Avalonia.Themes.Fluent/Controls/NativeMenuBar.xaml
  81. 8
      src/Avalonia.Themes.Fluent/Controls/ProgressBar.xaml
  82. 3
      src/Avalonia.Themes.Fluent/Controls/TabItem.xaml
  83. 3
      src/Avalonia.Themes.Fluent/Controls/TabStripItem.xaml
  84. 2
      src/Avalonia.Themes.Fluent/Controls/TextBox.xaml
  85. 3
      src/Avalonia.Themes.Fluent/Controls/TimePicker.xaml
  86. 3
      src/Avalonia.Themes.Fluent/Controls/ToolTip.xaml
  87. 4
      src/Avalonia.Themes.Fluent/Controls/WindowNotificationManager.xaml
  88. 45
      src/Avalonia.Visuals/Media/PreciseEllipticArcHelper.cs
  89. 24
      src/Avalonia.Visuals/Media/StreamGeometryContext.cs
  90. 1
      src/Shared/RenderHelpers/RenderHelpers.projitems
  91. 13
      src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs
  92. 1
      src/Windows/Avalonia.Win32/WindowImpl.cs
  93. 12
      tests/Avalonia.DesignerSupport.TestApp/App.xaml
  94. 2
      tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs
  95. 56
      tests/Avalonia.RenderTests/Media/StreamGeometryTests.cs
  96. 2
      tests/Avalonia.UnitTests/TestServices.cs
  97. 6
      tests/Avalonia.UnitTests/UnitTestApplication.cs
  98. BIN
      tests/TestFiles/Direct2D1/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.deferred.expected.png
  99. BIN
      tests/TestFiles/Direct2D1/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.immediate.expected.png
  100. BIN
      tests/TestFiles/Skia/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.deferred.expected.png

21
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()

2
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;
}

15
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);
}
}

4
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">
<Window.DataTemplates>
@ -9,8 +10,7 @@
</Window.DataTemplates>
<Window.Styles>
<StyleInclude Source="resm:Avalonia.Themes.Default.DefaultTheme.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.Accents.BaseLight.xaml?assembly=Avalonia.Themes.Default"/>
<default:SimpleTheme Mode="Light"/>
<StyleInclude Source="resm:Avalonia.Controls.DataGrid.Themes.Default.xaml?assembly=Avalonia.Controls.DataGrid"/>
<Style Selector="DataGrid ContextMenu">
<Setter Property="Foreground" Value="Black"/>

64
src/Avalonia.Themes.Default/Accents/Base.xaml

@ -0,0 +1,64 @@
<Style
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard">
<Style.Resources>
<Color x:Key="ThemeAccentColor">#CC119EDA</Color>
<Color x:Key="ThemeAccentColor2">#99119EDA</Color>
<Color x:Key="ThemeAccentColor3">#66119EDA</Color>
<Color x:Key="ThemeAccentColor4">#33119EDA</Color>
<Color x:Key="ThemeForegroundLowColor">#FF808080</Color>
<Color x:Key="HighlightForegroundColor">#FFFFFFFF</Color>
<Color x:Key="ErrorColor">#FFFF0000</Color>
<Color x:Key="ErrorLowColor">#10FF0000</Color>
<SolidColorBrush x:Key="HighlightForegroundBrush" Color="{StaticResource HighlightForegroundColor}" />
<SolidColorBrush x:Key="ThemeForegroundLowBrush" Color="{StaticResource ThemeForegroundLowColor}" />
<SolidColorBrush x:Key="ThemeAccentBrush2" Color="{StaticResource ThemeAccentColor2}" />
<SolidColorBrush x:Key="ThemeAccentBrush3" Color="{StaticResource ThemeAccentColor3}" />
<SolidColorBrush x:Key="ThemeAccentBrush4" Color="{StaticResource ThemeAccentColor4}" />
<SolidColorBrush x:Key="ThemeAccentBrush" Color="{StaticResource ThemeAccentColor}" />
<SolidColorBrush x:Key="ErrorBrush" Color="{StaticResource ErrorColor}" />
<SolidColorBrush x:Key="ErrorLowBrush" Color="{StaticResource ErrorLowColor}" />
<SolidColorBrush
x:Key="NotificationCardBackgroundBrush"
Opacity="0.75"
Color="#444444" />
<SolidColorBrush
x:Key="NotificationCardInformationBackgroundBrush"
Opacity="0.75"
Color="#007ACC" />
<SolidColorBrush
x:Key="NotificationCardSuccessBackgroundBrush"
Opacity="0.75"
Color="#1F9E45" />
<SolidColorBrush
x:Key="NotificationCardWarningBackgroundBrush"
Opacity="0.75"
Color="#FDB328" />
<SolidColorBrush
x:Key="NotificationCardErrorBackgroundBrush"
Opacity="0.75"
Color="#BD202C" />
<SolidColorBrush x:Key="ThemeControlTransparentBrush" Color="Transparent" />
<SolidColorBrush
x:Key="DatePickerFlyoutPresenterHighlightFill"
Opacity="0.4"
Color="{StaticResource ThemeAccentColor}" />
<SolidColorBrush
x:Key="TimePickerFlyoutPresenterHighlightFill"
Opacity="0.4"
Color="{StaticResource ThemeAccentColor}" />
<Thickness x:Key="ThemeBorderThickness">1</Thickness>
<sys:Double x:Key="ThemeDisabledOpacity">0.5</sys:Double>
<sys:Double x:Key="FontSizeSmall">10</sys:Double>
<sys:Double x:Key="FontSizeNormal">12</sys:Double>
<sys:Double x:Key="FontSizeLarge">16</sys:Double>
<sys:Double x:Key="ScrollBarThickness">18</sys:Double>
<sys:Double x:Key="ScrollBarThumbThickness">8</sys:Double>
<sys:Double x:Key="IconElementThemeHeight">20</sys:Double>
<sys:Double x:Key="IconElementThemeWidth">20</sys:Double>
</Style.Resources>
</Style>

77
src/Avalonia.Themes.Default/Accents/BaseDark.xaml

@ -1,13 +1,9 @@
<Style xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard">
<Style
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard">
<Style.Resources>
<Color x:Key="ThemeAccentColor">#CC119EDA</Color>
<Color x:Key="ThemeAccentColor2">#99119EDA</Color>
<Color x:Key="ThemeAccentColor3">#66119EDA</Color>
<Color x:Key="ThemeAccentColor4">#33119EDA</Color>
<Color x:Key="ThemeBackgroundColor">#FF282828</Color>
<Color x:Key="ThemeBorderLowColor">#FF505050</Color>
<Color x:Key="ThemeBorderMidColor">#FF808080</Color>
@ -21,59 +17,22 @@
<Color x:Key="ThemeControlHighlightMidColor">#FF828282</Color>
<Color x:Key="ThemeControlHighlightHighColor">#FF505050</Color>
<Color x:Key="ThemeForegroundColor">#FFDEDEDE</Color>
<Color x:Key="ThemeForegroundLowColor">#FF808080</Color>
<Color x:Key="HighlightColor">#FF119EDA</Color>
<Color x:Key="HighlightForegroundColor">#FFFFFFFF</Color>
<Color x:Key="ErrorColor">#FFFF0000</Color>
<Color x:Key="ErrorLowColor">#10FF0000</Color>
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="{DynamicResource ThemeBackgroundColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeBorderLowBrush" Color="{DynamicResource ThemeBorderLowColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeBorderMidBrush" Color="{DynamicResource ThemeBorderMidColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeBorderHighBrush" Color="{DynamicResource ThemeBorderHighColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlLowBrush" Color="{DynamicResource ThemeControlLowColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlMidBrush" Color="{DynamicResource ThemeControlMidColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlMidHighBrush" Color="{DynamicResource ThemeControlMidHighColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlHighBrush" Color="{DynamicResource ThemeControlHighColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlVeryHighBrush" Color="{DynamicResource ThemeControlVeryHighColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlHighlightLowBrush" Color="{DynamicResource ThemeControlHighlightLowColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlHighlightMidBrush" Color="{DynamicResource ThemeControlHighlightMidColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlHighlightHighBrush" Color="{DynamicResource ThemeControlHighlightHighColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeForegroundBrush" Color="{DynamicResource ThemeForegroundColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeForegroundLowBrush" Color="{DynamicResource ThemeForegroundLowColor}"></SolidColorBrush>
<SolidColorBrush x:Key="HighlightBrush" Color="{DynamicResource HighlightColor}"></SolidColorBrush>
<SolidColorBrush x:Key="HighlightForegroundBrush" Color="{DynamicResource HighlightForegroundColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeAccentBrush" Color="{DynamicResource ThemeAccentColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeAccentBrush2" Color="{DynamicResource ThemeAccentColor2}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeAccentBrush3" Color="{DynamicResource ThemeAccentColor3}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeAccentBrush4" Color="{DynamicResource ThemeAccentColor4}"></SolidColorBrush>
<SolidColorBrush x:Key="ErrorBrush" Color="{DynamicResource ErrorColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ErrorLowBrush" Color="{DynamicResource ErrorLowColor}"></SolidColorBrush>
<SolidColorBrush x:Key="NotificationCardBackgroundBrush" Color="#444444" Opacity="0.75"/>
<SolidColorBrush x:Key="NotificationCardInformationBackgroundBrush" Color="#007ACC" Opacity="0.75"/>
<SolidColorBrush x:Key="NotificationCardSuccessBackgroundBrush" Color="#1F9E45" Opacity="0.75"/>
<SolidColorBrush x:Key="NotificationCardWarningBackgroundBrush" Color="#FDB328" Opacity="0.75"/>
<SolidColorBrush x:Key="NotificationCardErrorBackgroundBrush" Color="#BD202C" Opacity="0.75"/>
<SolidColorBrush x:Key="DatePickerFlyoutPresenterHighlightFill" Color="{DynamicResource ThemeAccentColor}" Opacity="0.4" />
<SolidColorBrush x:Key="TimePickerFlyoutPresenterHighlightFill" Color="{DynamicResource ThemeAccentColor}" Opacity="0.4" />
<SolidColorBrush x:Key="ThemeControlTransparentBrush" Color="Transparent" />
<Thickness x:Key="ThemeBorderThickness">1,1,1,1</Thickness>
<sys:Double x:Key="ThemeDisabledOpacity">0.5</sys:Double>
<sys:Double x:Key="FontSizeSmall">10</sys:Double>
<sys:Double x:Key="FontSizeNormal">12</sys:Double>
<sys:Double x:Key="FontSizeLarge">16</sys:Double>
<sys:Double x:Key="ScrollBarThickness">18</sys:Double>
<sys:Double x:Key="ScrollBarThumbThickness">8</sys:Double>
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="{StaticResource ThemeBackgroundColor}" />
<SolidColorBrush x:Key="ThemeBorderLowBrush" Color="{StaticResource ThemeBorderLowColor}" />
<SolidColorBrush x:Key="ThemeBorderMidBrush" Color="{StaticResource ThemeBorderMidColor}" />
<SolidColorBrush x:Key="ThemeBorderHighBrush" Color="{StaticResource ThemeBorderHighColor}" />
<SolidColorBrush x:Key="ThemeControlLowBrush" Color="{StaticResource ThemeControlLowColor}" />
<SolidColorBrush x:Key="ThemeControlMidBrush" Color="{StaticResource ThemeControlMidColor}" />
<SolidColorBrush x:Key="ThemeControlMidHighBrush" Color="{StaticResource ThemeControlMidHighColor}" />
<SolidColorBrush x:Key="ThemeControlHighBrush" Color="{StaticResource ThemeControlHighColor}" />
<SolidColorBrush x:Key="ThemeControlVeryHighBrush" Color="{StaticResource ThemeControlVeryHighColor}" />
<SolidColorBrush x:Key="ThemeControlHighlightLowBrush" Color="{StaticResource ThemeControlHighlightLowColor}" />
<SolidColorBrush x:Key="ThemeControlHighlightMidBrush" Color="{StaticResource ThemeControlHighlightMidColor}" />
<SolidColorBrush x:Key="ThemeControlHighlightHighBrush" Color="{StaticResource ThemeControlHighlightHighColor}" />
<SolidColorBrush x:Key="ThemeForegroundBrush" Color="{StaticResource ThemeForegroundColor}" />
<SolidColorBrush x:Key="HighlightBrush" Color="{StaticResource HighlightColor}" />
<sys:Double x:Key="IconElementThemeHeight">20</sys:Double>
<sys:Double x:Key="IconElementThemeWidth">20</sys:Double>
</Style.Resources>
</Style>

82
src/Avalonia.Themes.Default/Accents/BaseLight.xaml

@ -1,82 +1,38 @@
<Style xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard">
<Style
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard">
<Style.Resources>
<Color x:Key="ThemeAccentColor">#CC119EDA</Color>
<Color x:Key="ThemeAccentColor2">#99119EDA</Color>
<Color x:Key="ThemeAccentColor3">#66119EDA</Color>
<Color x:Key="ThemeAccentColor4">#33119EDA</Color>
<Color x:Key="ThemeBackgroundColor">#FFFFFFFF</Color>
<Color x:Key="ThemeBorderLowColor">#FFAAAAAA</Color>
<Color x:Key="ThemeBorderMidColor">#FF888888</Color>
<Color x:Key="ThemeBorderHighColor">#FF333333</Color>
<Color x:Key="ThemeControlLowColor">#FF868999</Color>
<Color x:Key="ThemeControlMidColor">#FFF5F5F5</Color>
<Color x:Key="ThemeControlMidHighColor">#FFC2C3C9</Color>
<Color x:Key="ThemeControlHighColor">#FF686868</Color>
<Color x:Key="ThemeControlVeryHighColor">#FF5B5B5B</Color>
<Color x:Key="ThemeControlHighlightLowColor">#FFF0F0F0</Color>
<Color x:Key="ThemeControlHighlightMidColor">#FFD0D0D0</Color>
<Color x:Key="ThemeControlHighlightHighColor">#FF808080</Color>
<Color x:Key="ThemeForegroundColor">#FF000000</Color>
<Color x:Key="ThemeForegroundLowColor">#FF808080</Color>
<Color x:Key="HighlightColor">#FF086F9E</Color>
<Color x:Key="HighlightForegroundColor">#FFFFFFFF</Color>
<Color x:Key="ErrorColor">#FFFF0000</Color>
<Color x:Key="ErrorLowColor">#10FF0000</Color>
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="{DynamicResource ThemeBackgroundColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeBorderLowBrush" Color="{DynamicResource ThemeBorderLowColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeBorderMidBrush" Color="{DynamicResource ThemeBorderMidColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeBorderHighBrush" Color="{DynamicResource ThemeBorderHighColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlLowBrush" Color="{DynamicResource ThemeControlLowColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlMidBrush" Color="{DynamicResource ThemeControlMidColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlMidHighBrush" Color="{DynamicResource ThemeControlMidHighColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlHighBrush" Color="{DynamicResource ThemeControlHighColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlVeryHighBrush" Color="{DynamicResource ThemeControlVeryHighColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlHighlightLowBrush" Color="{DynamicResource ThemeControlHighlightLowColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlHighlightMidBrush" Color="{DynamicResource ThemeControlHighlightMidColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeControlHighlightHighBrush" Color="{DynamicResource ThemeControlHighlightHighColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeForegroundBrush" Color="{DynamicResource ThemeForegroundColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeForegroundLowBrush" Color="{DynamicResource ThemeForegroundLowColor}"></SolidColorBrush>
<SolidColorBrush x:Key="HighlightBrush" Color="{DynamicResource HighlightColor}"></SolidColorBrush>
<SolidColorBrush x:Key="HighlightForegroundBrush" Color="{DynamicResource HighlightForegroundColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeAccentBrush" Color="{DynamicResource ThemeAccentColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeAccentBrush2" Color="{DynamicResource ThemeAccentColor2}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeAccentBrush3" Color="{DynamicResource ThemeAccentColor3}"></SolidColorBrush>
<SolidColorBrush x:Key="ThemeAccentBrush4" Color="{DynamicResource ThemeAccentColor4}"></SolidColorBrush>
<SolidColorBrush x:Key="ErrorBrush" Color="{DynamicResource ErrorColor}"></SolidColorBrush>
<SolidColorBrush x:Key="ErrorLowBrush" Color="{DynamicResource ErrorLowColor}"></SolidColorBrush>
<SolidColorBrush x:Key="NotificationCardBackgroundBrush" Color="#444444" Opacity="0.75"/>
<SolidColorBrush x:Key="NotificationCardInformationBackgroundBrush" Color="#007ACC" Opacity="0.75"/>
<SolidColorBrush x:Key="NotificationCardSuccessBackgroundBrush" Color="#1F9E45" Opacity="0.75"/>
<SolidColorBrush x:Key="NotificationCardWarningBackgroundBrush" Color="#FDB328" Opacity="0.75"/>
<SolidColorBrush x:Key="NotificationCardErrorBackgroundBrush" Color="#BD202C" Opacity="0.75"/>
<SolidColorBrush x:Key="DatePickerFlyoutPresenterHighlightFill" Color="{DynamicResource ThemeAccentColor}" Opacity="0.4" />
<SolidColorBrush x:Key="TimePickerFlyoutPresenterHighlightFill" Color="{DynamicResource ThemeAccentColor}" Opacity="0.4" />
<SolidColorBrush x:Key="ThemeControlTransparentBrush" Color="Transparent" />
<Thickness x:Key="ThemeBorderThickness">1</Thickness>
<sys:Double x:Key="ThemeDisabledOpacity">0.5</sys:Double>
<sys:Double x:Key="FontSizeSmall">10</sys:Double>
<sys:Double x:Key="FontSizeNormal">12</sys:Double>
<sys:Double x:Key="FontSizeLarge">16</sys:Double>
<sys:Double x:Key="ScrollBarThickness">18</sys:Double>
<sys:Double x:Key="ScrollBarThumbThickness">8</sys:Double>
<sys:Double x:Key="IconElementThemeHeight">20</sys:Double>
<sys:Double x:Key="IconElementThemeWidth">20</sys:Double>
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="{StaticResource ThemeBackgroundColor}" />
<SolidColorBrush x:Key="ThemeBorderLowBrush" Color="{StaticResource ThemeBorderLowColor}" />
<SolidColorBrush x:Key="ThemeBorderMidBrush" Color="{StaticResource ThemeBorderMidColor}" />
<SolidColorBrush x:Key="ThemeBorderHighBrush" Color="{StaticResource ThemeBorderHighColor}" />
<SolidColorBrush x:Key="ThemeControlLowBrush" Color="{StaticResource ThemeControlLowColor}" />
<SolidColorBrush x:Key="ThemeControlMidBrush" Color="{StaticResource ThemeControlMidColor}" />
<SolidColorBrush x:Key="ThemeControlMidHighBrush" Color="{StaticResource ThemeControlMidHighColor}" />
<SolidColorBrush x:Key="ThemeControlHighBrush" Color="{StaticResource ThemeControlHighColor}" />
<SolidColorBrush x:Key="ThemeControlVeryHighBrush" Color="{StaticResource ThemeControlVeryHighColor}" />
<SolidColorBrush x:Key="ThemeControlHighlightLowBrush" Color="{StaticResource ThemeControlHighlightLowColor}" />
<SolidColorBrush x:Key="ThemeControlHighlightMidBrush" Color="{StaticResource ThemeControlHighlightMidColor}" />
<SolidColorBrush x:Key="ThemeControlHighlightHighBrush" Color="{StaticResource ThemeControlHighlightHighColor}" />
<SolidColorBrush x:Key="ThemeForegroundBrush" Color="{StaticResource ThemeForegroundColor}" />
<SolidColorBrush x:Key="HighlightBrush" Color="{StaticResource HighlightColor}" />
</Style.Resources>
</Style>

5
src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj

@ -13,10 +13,7 @@
<ProjectReference Include="..\Avalonia.Visuals\Avalonia.Visuals.csproj" />
<ProjectReference Include="..\Avalonia.Styling\Avalonia.Styling.csproj" />
<ProjectReference Include="..\Avalonia.Dialogs\Avalonia.Dialogs.csproj" />
<AvaloniaResource Include="DefaultTheme.xaml" />
<AvaloniaResource Include="Accents/*.xaml" />
<!-- Compatibility with old apps, probably need to replace with AvaloniaResource -->
<EmbeddedResource Include="**/*.xaml" />
<AvaloniaResource Include="**/*.xaml" />
</ItemGroup>
<Import Project="..\..\build\BuildTargets.targets" />
<Import Project="..\..\build\Rx.props" />

0
src/Avalonia.Themes.Default/AutoCompleteBox.xaml → src/Avalonia.Themes.Default/Controls/AutoCompleteBox.xaml

0
src/Avalonia.Themes.Default/Button.xaml → src/Avalonia.Themes.Default/Controls/Button.xaml

0
src/Avalonia.Themes.Default/ButtonSpinner.xaml → src/Avalonia.Themes.Default/Controls/ButtonSpinner.xaml

0
src/Avalonia.Themes.Default/Calendar.xaml → src/Avalonia.Themes.Default/Controls/Calendar.xaml

0
src/Avalonia.Themes.Default/CalendarButton.xaml → src/Avalonia.Themes.Default/Controls/CalendarButton.xaml

0
src/Avalonia.Themes.Default/CalendarDatePicker.xaml → src/Avalonia.Themes.Default/Controls/CalendarDatePicker.xaml

0
src/Avalonia.Themes.Default/CalendarDayButton.xaml → src/Avalonia.Themes.Default/Controls/CalendarDayButton.xaml

0
src/Avalonia.Themes.Default/CalendarItem.xaml → src/Avalonia.Themes.Default/Controls/CalendarItem.xaml

0
src/Avalonia.Themes.Default/CaptionButtons.xaml → src/Avalonia.Themes.Default/Controls/CaptionButtons.xaml

0
src/Avalonia.Themes.Default/Carousel.xaml → src/Avalonia.Themes.Default/Controls/Carousel.xaml

0
src/Avalonia.Themes.Default/CheckBox.xaml → src/Avalonia.Themes.Default/Controls/CheckBox.xaml

0
src/Avalonia.Themes.Default/ComboBox.xaml → src/Avalonia.Themes.Default/Controls/ComboBox.xaml

0
src/Avalonia.Themes.Default/ComboBoxItem.xaml → src/Avalonia.Themes.Default/Controls/ComboBoxItem.xaml

0
src/Avalonia.Themes.Default/ContentControl.xaml → src/Avalonia.Themes.Default/Controls/ContentControl.xaml

0
src/Avalonia.Themes.Default/ContextMenu.xaml → src/Avalonia.Themes.Default/Controls/ContextMenu.xaml

0
src/Avalonia.Themes.Default/DataValidationErrors.xaml → src/Avalonia.Themes.Default/Controls/DataValidationErrors.xaml

0
src/Avalonia.Themes.Default/DatePicker.xaml → src/Avalonia.Themes.Default/Controls/DatePicker.xaml

0
src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml → src/Avalonia.Themes.Default/Controls/EmbeddableControlRoot.xaml

0
src/Avalonia.Themes.Default/Expander.xaml → src/Avalonia.Themes.Default/Controls/Expander.xaml

0
src/Avalonia.Themes.Default/FlyoutPresenter.xaml → src/Avalonia.Themes.Default/Controls/FlyoutPresenter.xaml

0
src/Avalonia.Themes.Default/FocusAdorner.xaml → src/Avalonia.Themes.Default/Controls/FocusAdorner.xaml

0
src/Avalonia.Themes.Default/GridSplitter.xaml → src/Avalonia.Themes.Default/Controls/GridSplitter.xaml

0
src/Avalonia.Themes.Default/ItemsControl.xaml → src/Avalonia.Themes.Default/Controls/ItemsControl.xaml

0
src/Avalonia.Themes.Default/Label.xaml → src/Avalonia.Themes.Default/Controls/Label.xaml

0
src/Avalonia.Themes.Default/ListBox.xaml → src/Avalonia.Themes.Default/Controls/ListBox.xaml

0
src/Avalonia.Themes.Default/ListBoxItem.xaml → src/Avalonia.Themes.Default/Controls/ListBoxItem.xaml

0
src/Avalonia.Themes.Default/ManagedFileChooser.xaml → src/Avalonia.Themes.Default/Controls/ManagedFileChooser.xaml

0
src/Avalonia.Themes.Default/Menu.xaml → src/Avalonia.Themes.Default/Controls/Menu.xaml

0
src/Avalonia.Themes.Default/MenuFlyoutPresenter.xaml → src/Avalonia.Themes.Default/Controls/MenuFlyoutPresenter.xaml

0
src/Avalonia.Themes.Default/MenuItem.xaml → src/Avalonia.Themes.Default/Controls/MenuItem.xaml

0
src/Avalonia.Themes.Default/NativeMenuBar.xaml → src/Avalonia.Themes.Default/Controls/NativeMenuBar.xaml

0
src/Avalonia.Themes.Default/NotificationCard.xaml → src/Avalonia.Themes.Default/Controls/NotificationCard.xaml

0
src/Avalonia.Themes.Default/NumericUpDown.xaml → src/Avalonia.Themes.Default/Controls/NumericUpDown.xaml

0
src/Avalonia.Themes.Default/OverlayPopupHost.xaml → src/Avalonia.Themes.Default/Controls/OverlayPopupHost.xaml

0
src/Avalonia.Themes.Default/PathIcon.xaml → src/Avalonia.Themes.Default/Controls/PathIcon.xaml

0
src/Avalonia.Themes.Default/PopupRoot.xaml → src/Avalonia.Themes.Default/Controls/PopupRoot.xaml

0
src/Avalonia.Themes.Default/ProgressBar.xaml → src/Avalonia.Themes.Default/Controls/ProgressBar.xaml

0
src/Avalonia.Themes.Default/RadioButton.xaml → src/Avalonia.Themes.Default/Controls/RadioButton.xaml

0
src/Avalonia.Themes.Default/RepeatButton.xaml → src/Avalonia.Themes.Default/Controls/RepeatButton.xaml

0
src/Avalonia.Themes.Default/ScrollBar.xaml → src/Avalonia.Themes.Default/Controls/ScrollBar.xaml

0
src/Avalonia.Themes.Default/ScrollViewer.xaml → src/Avalonia.Themes.Default/Controls/ScrollViewer.xaml

0
src/Avalonia.Themes.Default/Separator.xaml → src/Avalonia.Themes.Default/Controls/Separator.xaml

0
src/Avalonia.Themes.Default/Slider.xaml → src/Avalonia.Themes.Default/Controls/Slider.xaml

0
src/Avalonia.Themes.Default/SplitView.xaml → src/Avalonia.Themes.Default/Controls/SplitView.xaml

0
src/Avalonia.Themes.Default/TabControl.xaml → src/Avalonia.Themes.Default/Controls/TabControl.xaml

0
src/Avalonia.Themes.Default/TabItem.xaml → src/Avalonia.Themes.Default/Controls/TabItem.xaml

0
src/Avalonia.Themes.Default/TabStrip.xaml → src/Avalonia.Themes.Default/Controls/TabStrip.xaml

0
src/Avalonia.Themes.Default/TabStripItem.xaml → src/Avalonia.Themes.Default/Controls/TabStripItem.xaml

0
src/Avalonia.Themes.Default/TextBox.xaml → src/Avalonia.Themes.Default/Controls/TextBox.xaml

0
src/Avalonia.Themes.Default/TimePicker.xaml → src/Avalonia.Themes.Default/Controls/TimePicker.xaml

0
src/Avalonia.Themes.Default/TitleBar.xaml → src/Avalonia.Themes.Default/Controls/TitleBar.xaml

0
src/Avalonia.Themes.Default/ToggleButton.xaml → src/Avalonia.Themes.Default/Controls/ToggleButton.xaml

0
src/Avalonia.Themes.Default/ToggleSwitch.xaml → src/Avalonia.Themes.Default/Controls/ToggleSwitch.xaml

0
src/Avalonia.Themes.Default/ToolTip.xaml → src/Avalonia.Themes.Default/Controls/ToolTip.xaml

0
src/Avalonia.Themes.Default/TreeView.xaml → src/Avalonia.Themes.Default/Controls/TreeView.xaml

0
src/Avalonia.Themes.Default/TreeViewItem.xaml → src/Avalonia.Themes.Default/Controls/TreeViewItem.xaml

0
src/Avalonia.Themes.Default/UserControl.xaml → src/Avalonia.Themes.Default/Controls/UserControl.xaml

0
src/Avalonia.Themes.Default/Window.xaml → src/Avalonia.Themes.Default/Controls/Window.xaml

0
src/Avalonia.Themes.Default/WindowNotificationManager.xaml → src/Avalonia.Themes.Default/Controls/WindowNotificationManager.xaml

118
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">
<!-- Define ToolTip first so its styles can be overriden by other controls (e.g. TextBox) -->
<StyleInclude Source="resm:Avalonia.Themes.Default.ToolTip.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.DataValidationErrors.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ToolTip.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/DataValidationErrors.xaml"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.FocusAdorner.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.Button.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.Carousel.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.CheckBox.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.CaptionButtons.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ComboBox.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ComboBoxItem.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ContentControl.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.Label.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.GridSplitter.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ItemsControl.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ListBox.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ListBoxItem.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.Menu.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ContextMenu.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.MenuItem.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.OverlayPopupHost.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.PathIcon.xaml?assembly=Avalonia.Themes.Default" />
<StyleInclude Source="resm:Avalonia.Themes.Default.PopupRoot.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ProgressBar.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.RadioButton.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.RepeatButton.xaml?assembly=Avalonia.Themes.Default" />
<StyleInclude Source="resm:Avalonia.Themes.Default.Separator.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.Slider.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ScrollBar.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ScrollViewer.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.TabStrip.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.TabStripItem.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/FocusAdorner.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/Button.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/Carousel.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/CheckBox.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/CaptionButtons.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ComboBox.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ComboBoxItem.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ContentControl.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/Label.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/GridSplitter.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ItemsControl.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ListBox.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ListBoxItem.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/Menu.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ContextMenu.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/MenuItem.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/OverlayPopupHost.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/PathIcon.xaml" />
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/PopupRoot.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ProgressBar.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/RadioButton.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/RepeatButton.xaml" />
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/Separator.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/Slider.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ScrollBar.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ScrollViewer.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/TabStrip.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/TabStripItem.xaml"/>
<!-- TabControl needs to come after TabStrip as it redefines the inner TabStrip.ItemsPanel-->
<StyleInclude Source="resm:Avalonia.Themes.Default.TabControl.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.TabItem.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.TextBox.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ToggleButton.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.Expander.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.TitleBar.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.TreeView.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.TreeViewItem.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.UserControl.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.Window.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.EmbeddableControlRoot.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.CalendarButton.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.CalendarDayButton.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.CalendarItem.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.Calendar.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.CalendarDatePicker.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ButtonSpinner.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.NumericUpDown.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.AutoCompleteBox.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.WindowNotificationManager.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.NotificationCard.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.NativeMenuBar.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ToggleSwitch.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.SplitView.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.DatePicker.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.TimePicker.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.FlyoutPresenter.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.MenuFlyoutPresenter.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ManagedFileChooser.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/TabControl.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/TabItem.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/TextBox.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ToggleButton.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/Expander.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/TitleBar.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/TreeView.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/TreeViewItem.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/UserControl.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/Window.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/EmbeddableControlRoot.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/CalendarButton.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/CalendarDayButton.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/CalendarItem.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/Calendar.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/CalendarDatePicker.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ButtonSpinner.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/NumericUpDown.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/AutoCompleteBox.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/WindowNotificationManager.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/NotificationCard.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/NativeMenuBar.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ToggleSwitch.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/SplitView.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/DatePicker.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/TimePicker.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/FlyoutPresenter.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/MenuFlyoutPresenter.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/Controls/ManagedFileChooser.xaml"/>
</Styles>

1
src/Avalonia.Themes.Default/DefaultTheme.xaml.cs

@ -1,4 +1,3 @@
using Avalonia.Markup.Xaml;
using Avalonia.Styling;
namespace Avalonia.Themes.Default

166
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<SimpleThemeMode> ModeProperty =
AvaloniaProperty.Register<SimpleTheme, SimpleThemeMode>(nameof(Mode));
private readonly Uri _baseUri;
private bool _isLoading;
private IStyle? _loaded;
private Styles _sharedStyles = new();
private Styles _simpleDark = new();
private Styles _simpleLight = new();
/// <summary>
/// Initializes a new instance of the <see cref="SimpleTheme"/> class.
/// </summary>
/// <param name="baseUri">The base URL for the XAML context.</param>
public SimpleTheme(Uri baseUri)
{
_baseUri = baseUri;
InitStyles(_baseUri);
}
/// <summary>
/// Initializes a new instance of the <see cref="SimpleTheme"/> class.
/// </summary>
/// <param name="serviceProvider">The XAML service provider.</param>
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> IStyle.Children => _loaded?.Children ?? Array.Empty<IStyle>();
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!;
}
}
/// <summary>
/// Gets or sets the mode of the fluent theme (light, dark).
/// </summary>
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<T>(AvaloniaPropertyChangedEventArgs<T> 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")
}
};
}
}
}

8
src/Avalonia.Themes.Default/SimpleThemeMode.cs

@ -0,0 +1,8 @@
namespace Avalonia.Themes.Default
{
public enum SimpleThemeMode
{
Light,
Dark
}
}

3
src/Avalonia.Themes.Fluent/Controls/ButtonSpinner.xaml

@ -1,7 +1,8 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard"
xmlns:converters="clr-namespace:Avalonia.Controls.Converters;assembly=Avalonia.Controls">
xmlns:converters="clr-namespace:Avalonia.Controls.Converters;assembly=Avalonia.Controls"
x:CompileBindings="True">
<Design.PreviewWith>
<Border Padding="20"
Background="Black">

3
src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml

@ -7,7 +7,8 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard">
xmlns:sys="clr-namespace:System;assembly=netstandard"
x:CompileBindings="True">
<Design.PreviewWith>
<Border Margin="20, 20, 20, 200">
<CalendarDatePicker Width="200"

4
src/Avalonia.Themes.Fluent/Controls/CalendarItem.xaml

@ -6,7 +6,9 @@
-->
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:CompileBindings="True"
x:DataType="CalendarItem">
<Design.PreviewWith>
<Border Padding="20">
<Calendar />

8
src/Avalonia.Themes.Fluent/Controls/DataValidationErrors.xaml

@ -1,6 +1,8 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="using:System">
xmlns:sys="using:System"
x:CompileBindings="True"
x:DataType="DataValidationErrors">
<Design.PreviewWith>
<Border Padding="20">
<StackPanel Spacing="20">
@ -27,7 +29,7 @@
<Style Selector="DataValidationErrors">
<Style.Resources>
<DataTemplate x:Key="InlineDataValidationErrorTemplate">
<ItemsControl Items="{Binding}" TextBlock.Foreground="{DynamicResource SystemControlErrorTextForegroundBrush}">
<ItemsControl Items="{Binding}" x:DataType="DataValidationErrors" TextBlock.Foreground="{DynamicResource SystemControlErrorTextForegroundBrush}">
<ItemsControl.Styles>
<Style Selector="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
@ -54,7 +56,7 @@
</DockPanel>
</ControlTemplate>
<DataTemplate x:Key="TooltipDataValidationErrorTemplate">
<DataTemplate x:DataType="DataValidationErrors" x:Key="TooltipDataValidationErrorTemplate">
<Panel Name="PART_InlineErrorTemplatePanel" Background="Transparent">
<Panel.Styles>
<Style Selector="Panel#PART_InlineErrorTemplatePanel">

3
src/Avalonia.Themes.Fluent/Controls/DatePicker.xaml

@ -7,7 +7,8 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard">
xmlns:sys="clr-namespace:System;assembly=netstandard"
x:CompileBindings="True">
<Design.PreviewWith>
<Border Padding="20">
<DatePicker CornerRadius="10" />

8
src/Avalonia.Themes.Fluent/Controls/Expander.xaml

@ -1,4 +1,6 @@
<Styles xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:CompileBindings="True">
<Design.PreviewWith>
<Border Padding="20">
<StackPanel Orientation="Vertical" Spacing="20" Width="350">
@ -69,13 +71,13 @@
BorderThickness="{TemplateBinding BorderThickness}"
Content="{TemplateBinding Header}"
ContentTemplate="{TemplateBinding HeaderTemplate}"
IsChecked="{Binding Path=IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
IsChecked="{TemplateBinding IsExpanded, Mode=TwoWay}"
IsEnabled="{TemplateBinding IsEnabled}" />
<Border x:Name="ExpanderContent"
Padding="{DynamicResource ExpanderContentPadding}"
Background="{DynamicResource ExpanderDropDownBackground}"
BorderBrush="{DynamicResource ExpanderDropDownBorderBrush}"
IsVisible="{Binding Path=IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
IsVisible="{TemplateBinding IsExpanded, Mode=TwoWay}">
<ContentPresenter x:Name="PART_ContentPresenter"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"

4
src/Avalonia.Themes.Fluent/Controls/ManagedFileChooser.xaml

@ -142,7 +142,7 @@
<Rectangle Fill="{DynamicResource SystemControlHighlightAltBaseMediumLowBrush}" Height="1" Margin="0,5,0,0" DockPanel.Dock="Bottom"/>
<DockPanel Margin="4,0">
<Button Command="{Binding GoUp}" DockPanel.Dock="Left">
<Path Data="M 0 7 L 7 0 L 14 7 M 7 0 L 7 16" Stroke="{Binding $parent[Button].Foreground}" StrokeThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,1,0,-1"/>
<Path Data="M 0 7 L 7 0 L 14 7 M 7 0 L 7 16" Stroke="{CompiledBinding $parent[Button].Foreground}" StrokeThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,1,0,-1"/>
</Button>
<TextBox x:Name="Location" Text="{Binding Location}">
<TextBox.KeyBindings>
@ -321,4 +321,4 @@
<Style Selector="dialogs|ManagedFileChooser /template/ UniformGrid#Finalize > Button /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="HorizontalAlignment" Value="Stretch"/>
</Style>
</Styles>
</Styles>

6
src/Avalonia.Themes.Fluent/Controls/MenuItem.xaml

@ -1,7 +1,9 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:conv="clr-namespace:Avalonia.Controls.Converters;assembly=Avalonia.Controls"
xmlns:sys="clr-namespace:System;assembly=netstandard">
xmlns:sys="clr-namespace:System;assembly=netstandard"
x:DataType="MenuItem"
x:CompileBindings="True">
<Design.PreviewWith>
<Border Padding="20"
Width="400"
@ -158,7 +160,7 @@
</ContentPresenter>
<Popup Name="PART_Popup"
WindowManagerAddShadowHint="False"
MinWidth="{Binding Bounds.Width, RelativeSource={RelativeSource TemplatedParent}}"
MinWidth="{ReflectionBinding Bounds.Width, RelativeSource={RelativeSource TemplatedParent}}"
IsLightDismissEnabled="True"
IsOpen="{TemplateBinding IsSubMenuOpen, Mode=TwoWay}"
OverlayInputPassThroughElement="{Binding $parent[Menu]}">

3
src/Avalonia.Themes.Fluent/Controls/NativeMenuBar.xaml

@ -1,6 +1,7 @@
<Style xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Avalonia.Themes.Fluent"
x:CompileBindings="True"
Selector="NativeMenuBar">
<Style.Resources>
<local:InverseBooleanValueConverter x:Key="AvaloniaThemesDefaultNativeMenuBarInverseBooleanValueConverter" Default="True"/>
@ -11,7 +12,7 @@
IsVisible="{Binding $parent[TopLevel].(NativeMenu.IsNativeMenuExported), Converter={StaticResource AvaloniaThemesDefaultNativeMenuBarInverseBooleanValueConverter}}"
Items="{Binding $parent[TopLevel].(NativeMenu.Menu).Items}">
<Menu.Styles>
<Style Selector="MenuItem">
<Style x:DataType="NativeMenuItem" Selector="MenuItem">
<Setter Property="Header" Value="{Binding Header}"/>
<Setter Property="InputGesture" Value="{Binding Gesture}"/>
<Setter Property="Items" Value="{Binding Menu.Items}"/>

8
src/Avalonia.Themes.Fluent/Controls/ProgressBar.xaml

@ -1,4 +1,6 @@
<Styles xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:CompileBindings="True">
<Design.PreviewWith>
<Border Padding="20">
<StackPanel Spacing="10">
@ -29,8 +31,8 @@
<Border x:Name="IndeterminateProgressBarIndicator" CornerRadius="{TemplateBinding CornerRadius}" Margin="{TemplateBinding Padding}" Background="{TemplateBinding Foreground}" />
<Border x:Name="IndeterminateProgressBarIndicator2" CornerRadius="{TemplateBinding CornerRadius}" Margin="{TemplateBinding Padding}" Background="{TemplateBinding Foreground}" />
</Panel>
<LayoutTransformControl x:Name="PART_LayoutTransformControl" HorizontalAlignment="Center" VerticalAlignment="Center" IsVisible="{Binding ShowProgressText, RelativeSource={RelativeSource TemplatedParent}}">
<TextBlock Foreground="{DynamicResource SystemControlForegroundBaseHighBrush}" Text="{Binding Value, RelativeSource={RelativeSource TemplatedParent}, StringFormat={}{0:0}%}" />
<LayoutTransformControl x:Name="PART_LayoutTransformControl" HorizontalAlignment="Center" VerticalAlignment="Center" IsVisible="{TemplateBinding ShowProgressText}">
<TextBlock Foreground="{DynamicResource SystemControlForegroundBaseHighBrush}" Text="{ReflectionBinding Value, RelativeSource={RelativeSource TemplatedParent}, StringFormat={}{0:0}%}" />
</LayoutTransformControl>
</Panel>
</Border>

3
src/Avalonia.Themes.Fluent/Controls/TabItem.xaml

@ -1,5 +1,6 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:CompileBindings="True">
<Design.PreviewWith>
<Border Padding="20">
<StackPanel Spacing="20">

3
src/Avalonia.Themes.Fluent/Controls/TabStripItem.xaml

@ -1,5 +1,6 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:CompileBindings="True">
<Design.PreviewWith>
<Border Padding="20">
<StackPanel Spacing="20">

2
src/Avalonia.Themes.Fluent/Controls/TextBox.xaml

@ -166,7 +166,7 @@
<Setter Property="InnerRightContent">
<Template>
<ToggleButton Classes="passwordBoxRevealButton"
IsChecked="{Binding $parent[TextBox].RevealPassword, Mode=TwoWay}" />
IsChecked="{CompiledBinding $parent[TextBox].RevealPassword, Mode=TwoWay}" />
</Template>
</Setter>
</Style>

3
src/Avalonia.Themes.Fluent/Controls/TimePicker.xaml

@ -7,7 +7,8 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard">
xmlns:sys="clr-namespace:System;assembly=netstandard"
x:CompileBindings="True">
<Styles.Resources>
<x:Double x:Key="TimePickerFlyoutPresenterItemHeight">40</x:Double>
<x:Double x:Key="TimePickerSpacerThemeWidth">1</x:Double>

3
src/Avalonia.Themes.Fluent/Controls/ToolTip.xaml

@ -1,6 +1,7 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard">
xmlns:sys="clr-namespace:System;assembly=netstandard"
x:CompileBindings="True">
<Design.PreviewWith>
<Grid RowDefinitions="Auto,Auto"

4
src/Avalonia.Themes.Fluent/Controls/WindowNotificationManager.xaml

@ -1,5 +1,7 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:DataType="WindowNotificationManager"
x:CompileBindings="True">
<Style Selector="WindowNotificationManager">
<Setter Property="Margin" Value="0 0"/>
<Setter Property="Template">

45
src/Shared/RenderHelpers/ArcToHelper.cs → src/Avalonia.Visuals/Media/PreciseEllipticArcHelper.cs

@ -1,5 +1,6 @@
// Copyright © 2003-2004, Luc Maisonobe
// 2015 - Alexey Rozanov <thehdotx@gmail.com> - Adaptations for Avalonia and oval center computations
// 2022 - Alexey Rozanov <thehdotx@gmail.com> - Fix for arcs sometimes drawn in inverted order.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with
@ -49,12 +50,10 @@
// Adapted from http://www.spaceroots.org/documents/ellipse/EllipticalArc.java
using System;
using Avalonia.Media;
using Avalonia.Platform;
namespace Avalonia.RenderHelpers
namespace Avalonia.Media
{
static class ArcToHelper
static class PreciseEllipticArcHelper
{
/// <summary>
/// This class represents an elliptical arc on a 2D plane.
@ -292,6 +291,8 @@ namespace Avalonia.RenderHelpers
/// </summary>
internal double G2;
public bool DrawInOppositeDirection { get; set; }
/// <summary>
/// Builds an elliptical arc composed of the full unit circle around (0,0)
/// </summary>
@ -850,7 +851,7 @@ namespace Avalonia.RenderHelpers
/// Builds the arc outline using given StreamGeometryContext and default (max) Bezier curve degree and acceptable error of half a pixel (0.5)
/// </summary>
/// <param name="path">A StreamGeometryContext to output the path commands to</param>
public void BuildArc(IStreamGeometryContextImpl path)
public void BuildArc(StreamGeometryContext path)
{
BuildArc(path, _maxDegree, _defaultFlatness, true);
}
@ -862,7 +863,7 @@ namespace Avalonia.RenderHelpers
/// <param name="degree">degree of the Bezier curve to use</param>
/// <param name="threshold">acceptable error</param>
/// <param name="openNewFigure">if true, a new figure will be started in the specified StreamGeometryContext</param>
public void BuildArc(IStreamGeometryContextImpl path, int degree, double threshold, bool openNewFigure)
public void BuildArc(StreamGeometryContext path, int degree, double threshold, bool openNewFigure)
{
if (degree < 1 || degree > _maxDegree)
throw new ArgumentException($"degree should be between {1} and {_maxDegree}", nameof(degree));
@ -888,8 +889,18 @@ namespace Avalonia.RenderHelpers
}
n = n << 1;
}
dEta = (Eta2 - Eta1) / n;
etaB = Eta1;
if (!DrawInOppositeDirection)
{
dEta = (Eta2 - Eta1) / n;
etaB = Eta1;
}
else
{
dEta = (Eta1 - Eta2) / n;
etaB = Eta2;
}
double cosEtaB = Math.Cos(etaB);
double sinEtaB = Math.Sin(etaB);
double aCosEtaB = A * cosEtaB;
@ -922,6 +933,7 @@ namespace Avalonia.RenderHelpers
*/
//otherwise we're supposed to be already at the (xB,yB)
double t = Math.Tan(0.5 * dEta);
double alpha = Math.Sin(dEta) * (Math.Sqrt(4 + 3 * t * t) - 1) / 3;
@ -1012,7 +1024,7 @@ namespace Avalonia.RenderHelpers
/// <param name="theta">Ellipse theta (angle measured from the abscissa)</param>
/// <param name="isLargeArc">Large Arc Indicator</param>
/// <param name="clockwise">Clockwise direction flag</param>
public static void BuildArc(IStreamGeometryContextImpl path, Point p1, Point p2, Size size, double theta, bool isLargeArc, bool clockwise)
public static void BuildArc(StreamGeometryContext path, Point p1, Point p2, Size size, double theta, bool isLargeArc, bool clockwise)
{
// var orthogonalizer = new RotateTransform(-theta);
@ -1058,7 +1070,7 @@ namespace Avalonia.RenderHelpers
}
double multiplier = Math.Sqrt(numerator / denominator);
double multiplier = Math.Sqrt(Math.Abs(numerator / denominator));
Point mulVec = new Point(rx * p1S.Y / ry, -ry * p1S.X / rx);
int sign = (clockwise != isLargeArc) ? 1 : -1;
@ -1104,9 +1116,16 @@ namespace Avalonia.RenderHelpers
// path.LineTo(c, true, true);
// path.LineTo(clockwise ? p1 : p2, true,true);
path.LineTo(clockwise ? p1 : p2);
var arc = new EllipticalArc(c.X, c.Y, rx, ry, theta, thetaStart, thetaEnd, false);
double ManhattanDistance(Point p1, Point p2) => Math.Abs(p1.X - p2.X) + Math.Abs(p1.Y - p2.Y);
if (ManhattanDistance(p2, new Point(arc.X2, arc.Y2)) > ManhattanDistance(p2, new Point(arc.X1, arc.Y1)))
{
arc.DrawInOppositeDirection = true;
}
arc.BuildArc(path, arc._maxDegree, arc._defaultFlatness, false);
//path.LineTo(p2);
//uncomment this to draw a pie
//path.LineTo(c, true, true);
@ -1136,9 +1155,9 @@ namespace Avalonia.RenderHelpers
}
}
public static void ArcTo(IStreamGeometryContextImpl streamGeometryContextImpl, Point currentPoint, Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection)
public static void ArcTo(StreamGeometryContext streamGeometryContextImpl, Point currentPoint, Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection)
{
EllipticalArc.BuildArc(streamGeometryContextImpl, currentPoint, point, size, rotationAngle*Math.PI/180,
EllipticalArc.BuildArc(streamGeometryContextImpl, currentPoint, point, size, rotationAngle*(Math.PI/180),
isLargeArc,
sweepDirection == SweepDirection.Clockwise);
}

24
src/Avalonia.Visuals/Media/StreamGeometryContext.cs

@ -15,6 +15,8 @@ namespace Avalonia.Media
{
private readonly IStreamGeometryContextImpl _impl;
private Point _currentPoint;
/// <summary>
/// Initializes a new instance of the <see cref="StreamGeometryContext"/> class.
/// </summary>
@ -47,6 +49,24 @@ namespace Avalonia.Media
public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection)
{
_impl.ArcTo(point, size, rotationAngle, isLargeArc, sweepDirection);
_currentPoint = point;
}
/// <summary>
/// Draws an arc to the specified point using polylines, quadratic or cubic Bezier curves
/// Significantly more precise when drawing elliptic arcs with extreme width:height ratios.
/// </summary>
/// <param name="point">The destination point.</param>
/// <param name="size">The radii of an oval whose perimeter is used to draw the angle.</param>
/// <param name="rotationAngle">The rotation angle of the oval that specifies the curve.</param>
/// <param name="isLargeArc">true to draw the arc greater than 180 degrees; otherwise, false.</param>
/// <param name="sweepDirection">
/// A value that indicates whether the arc is drawn in the Clockwise or Counterclockwise direction.
/// </param>
public void PreciseArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection)
{
PreciseEllipticArcHelper.ArcTo(this, _currentPoint, point, size, rotationAngle, isLargeArc, sweepDirection);
}
/// <summary>
@ -57,6 +77,7 @@ namespace Avalonia.Media
public void BeginFigure(Point startPoint, bool isFilled)
{
_impl.BeginFigure(startPoint, isFilled);
_currentPoint = startPoint;
}
/// <summary>
@ -68,6 +89,7 @@ namespace Avalonia.Media
public void CubicBezierTo(Point point1, Point point2, Point point3)
{
_impl.CubicBezierTo(point1, point2, point3);
_currentPoint = point3;
}
/// <summary>
@ -78,6 +100,7 @@ namespace Avalonia.Media
public void QuadraticBezierTo(Point control, Point endPoint)
{
_impl.QuadraticBezierTo(control, endPoint);
_currentPoint = endPoint;
}
/// <summary>
@ -87,6 +110,7 @@ namespace Avalonia.Media
public void LineTo(Point point)
{
_impl.LineTo(point);
_currentPoint = point;
}
/// <summary>

1
src/Shared/RenderHelpers/RenderHelpers.projitems

@ -9,7 +9,6 @@
<Import_RootNamespace>Avalonia.RenderHelpers</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)ArcToHelper.cs" />
<Compile Include="$(MSBuildThisFileDirectory)QuadBezierHelper.cs" />
</ItemGroup>
</Project>

13
src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs

@ -151,8 +151,8 @@ namespace Avalonia.Win32
}
case WindowsMessage.WM_CHAR:
{
// Ignore control chars
if (ToInt32(wParam) >= 32)
// Ignore control chars and chars that were handled in WM_KEYDOWN.
if (ToInt32(wParam) >= 32 && !_ignoreWmChar)
{
e = new RawTextInputEventArgs(WindowsKeyboardDevice.Instance, timestamp, _owner,
new string((char)ToInt32(wParam), 1));
@ -519,6 +519,15 @@ namespace Avalonia.Win32
{
Input(e);
if ((WindowsMessage)msg == WindowsMessage.WM_KEYDOWN)
{
// Handling a WM_KEYDOWN message should cause the subsequent WM_CHAR message to
// be ignored. This should be safe to do as WM_CHAR should only be produced in
// response to the call to TranslateMessage/DispatchMessage after a WM_KEYDOWN
// is handled.
_ignoreWmChar = e.Handled;
}
if (e.Handled)
{
return IntPtr.Zero;

1
src/Windows/Avalonia.Win32/WindowImpl.cs

@ -90,6 +90,7 @@ namespace Avalonia.Win32
private bool _shown;
private bool _hiddenWindowIsParent;
private uint _langid;
private bool _ignoreWmChar;
public WindowImpl()
{

12
tests/Avalonia.DesignerSupport.TestApp/App.xaml

@ -1,8 +1,10 @@
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Avalonia.DesignerSupport.TestApp.App">
<Application
x:Class="Avalonia.DesignerSupport.TestApp.App"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Application.Styles>
<StyleInclude Source="resm:Avalonia.Themes.Default.DefaultTheme.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.Accents.BaseLight.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/DefaultTheme.xaml" />
<StyleInclude Source="avares://Avalonia.Themes.Default/Accents/Base.xaml" />
<StyleInclude Source="avares://Avalonia.Themes.Default/Accents/BaseLight.xaml" />
</Application.Styles>
</Application>

2
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs

@ -528,7 +528,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
var xaml = @"
<Styles xmlns='https://github.com/avaloniaui'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
<StyleInclude Source='resm:Avalonia.Themes.Default.ContextMenu.xaml?assembly=Avalonia.Themes.Default'/>
<StyleInclude Source='avares://Avalonia.Themes.Default/Controls/ContextMenu.xaml'/>
</Styles>";
var styles = AvaloniaRuntimeXamlLoader.Parse<Styles>(xaml);

56
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);
}
}
}

2
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;

6
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;

BIN
tests/TestFiles/Direct2D1/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.deferred.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
tests/TestFiles/Direct2D1/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.immediate.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
tests/TestFiles/Skia/Media/StreamGeometry/PreciseEllipticArc_Produces_Valid_Arcs_In_All_Directions.deferred.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save