From 1ce247cc021f2bbe23d8d0494bd62abe70b50f93 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Mon, 14 Nov 2022 11:30:43 +0100 Subject: [PATCH 01/17] fix: Ensure Dev*,Microcom and Build Task are builds before Controls when build solution in IDE --- Avalonia.sln | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Avalonia.sln b/Avalonia.sln index e2f04ddc35..687dd86e81 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -12,6 +12,11 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Direct2D1", "src\Windows\Avalonia.Direct2D1\Avalonia.Direct2D1.csproj", "{3E908F67-5543-4879-A1DC-08EACE79B3CD}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Controls", "src\Avalonia.Controls\Avalonia.Controls.csproj", "{D2221C82-4A25-4583-9B43-D791E3F6820C}" + ProjectSection(ProjectDependencies) = postProject + {1BBFAD42-B99E-47E0-B00A-A4BC6B6BB4BB} = {1BBFAD42-B99E-47E0-B00A-A4BC6B6BB4BB} + {BF28998D-072C-439A-AFBB-2FE5021241E0} = {BF28998D-072C-439A-AFBB-2FE5021241E0} + {FE2F3E5E-1E34-4972-8DC1-5C2C588E5ECE} = {FE2F3E5E-1E34-4972-8DC1-5C2C588E5ECE} + EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Themes.Simple", "src\Avalonia.Themes.Simple\Avalonia.Themes.Simple.csproj", "{3E10A5FA-E8DA-48B1-AD44-6A5B6CB7750F}" EndProject From b51ba178c9d2c4b306018b11bec0cbcdc793768f Mon Sep 17 00:00:00 2001 From: DJGosnell Date: Mon, 14 Nov 2022 15:49:41 -0500 Subject: [PATCH 02/17] Added SKPaintCache. Cached all SKPaint usages in the DrawingContextImpl to reduce disposals. --- src/Skia/Avalonia.Skia/DrawingContextImpl.cs | 43 ++++++++++--------- src/Skia/Avalonia.Skia/GeometryImpl.cs | 13 +++--- src/Skia/Avalonia.Skia/SKPaintCache.cs | 45 ++++++++++++++++++++ 3 files changed, 74 insertions(+), 27 deletions(-) create mode 100644 src/Skia/Avalonia.Skia/SKPaintCache.cs diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index 99ab60d1ac..e3957747bd 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -35,9 +35,9 @@ namespace Avalonia.Skia private GRContext _grContext; public GRContext GrContext => _grContext; private ISkiaGpu _gpu; - private readonly SKPaint _strokePaint = new SKPaint(); - private readonly SKPaint _fillPaint = new SKPaint(); - private readonly SKPaint _boxShadowPaint = new SKPaint(); + private readonly SKPaint _strokePaint = SKPaintCache.Get(); + private readonly SKPaint _fillPaint = SKPaintCache.Get(); + private readonly SKPaint _boxShadowPaint = SKPaintCache.Get(); private static SKShader s_acrylicNoiseShader; private readonly ISkiaGpuRenderSession _session; private bool _leased = false; @@ -187,17 +187,13 @@ namespace Avalonia.Skia var s = sourceRect.ToSKRect(); var d = destRect.ToSKRect(); - using (var paint = - new SKPaint - { - Color = new SKColor(255, 255, 255, (byte)(255 * opacity * _currentOpacity)) - }) - { - paint.FilterQuality = bitmapInterpolationMode.ToSKFilterQuality(); - paint.BlendMode = _currentBlendingMode.ToSKBlendMode(); + var paint = SKPaintCache.Get(); + paint.Color = new SKColor(255, 255, 255, (byte)(255 * opacity * _currentOpacity)); + paint.FilterQuality = bitmapInterpolationMode.ToSKFilterQuality(); + paint.BlendMode = _currentBlendingMode.ToSKBlendMode(); - drawableImage.Draw(this, s, d, paint); - } + drawableImage.Draw(this, s, d, paint); + SKPaintCache.Return(paint); } /// @@ -561,6 +557,11 @@ namespace Avalonia.Skia CheckLease(); try { + // Return leased paints. + SKPaintCache.Return(_strokePaint); + SKPaintCache.Return(_fillPaint); + SKPaintCache.Return(_boxShadowPaint); + if (_grContext != null) { Monitor.Exit(_grContext); @@ -631,15 +632,17 @@ namespace Avalonia.Skia public void PopOpacityMask() { CheckLease(); - using (var paint = new SKPaint { BlendMode = SKBlendMode.DstIn }) + + var paint = SKPaintCache.Get(); + paint.BlendMode = SKBlendMode.DstIn; + + Canvas.SaveLayer(paint); + SKPaintCache.Return(paint); + using (var paintWrapper = _maskStack.Pop()) { - Canvas.SaveLayer(paint); - using (var paintWrapper = _maskStack.Pop()) - { - Canvas.DrawPaint(paintWrapper.Paint); - } - Canvas.Restore(); + Canvas.DrawPaint(paintWrapper.Paint); } + Canvas.Restore(); Canvas.Restore(); } diff --git a/src/Skia/Avalonia.Skia/GeometryImpl.cs b/src/Skia/Avalonia.Skia/GeometryImpl.cs index 19dbcf9713..0e95b5d139 100644 --- a/src/Skia/Avalonia.Skia/GeometryImpl.cs +++ b/src/Skia/Avalonia.Skia/GeometryImpl.cs @@ -81,15 +81,14 @@ namespace Avalonia.Skia } else { - using (var paint = new SKPaint()) - { - paint.IsStroke = true; - paint.StrokeWidth = strokeWidth; + var paint = SKPaintCache.Get(); + paint.IsStroke = true; + paint.StrokeWidth = strokeWidth; + paint.GetFillPath(EffectivePath, strokePath); - paint.GetFillPath(EffectivePath, strokePath); + SKPaintCache.Return(paint); - _pathCache.Cache(strokePath, strokeWidth, strokePath.TightBounds.ToAvaloniaRect()); - } + _pathCache.Cache(strokePath, strokeWidth, strokePath.TightBounds.ToAvaloniaRect()); } } diff --git a/src/Skia/Avalonia.Skia/SKPaintCache.cs b/src/Skia/Avalonia.Skia/SKPaintCache.cs new file mode 100644 index 0000000000..79f9575591 --- /dev/null +++ b/src/Skia/Avalonia.Skia/SKPaintCache.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SkiaSharp; + +namespace Avalonia.Skia +{ + internal static class SKPaintCache + { + private static ConcurrentBag s_cachedPaints; + + static SKPaintCache() + { + s_cachedPaints = new ConcurrentBag(); + } + + public static SKPaint Get() + { + if (!s_cachedPaints.TryTake(out var paint)) + { + paint = new SKPaint(); + } + + return paint; + } + + public static void Return(SKPaint paint) + { + paint.Reset(); + s_cachedPaints.Add(paint); + } + + public static void Clear() + { + while (s_cachedPaints.TryTake(out var paint)) + { + paint.Dispose(); + } + } + + } +} From 713d2cab359ee68092e1916b6ba7f3466676a7dc Mon Sep 17 00:00:00 2001 From: DJGosnell Date: Mon, 14 Nov 2022 15:55:47 -0500 Subject: [PATCH 03/17] Added documentation. --- src/Skia/Avalonia.Skia/SKPaintCache.cs | 30 ++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/Skia/Avalonia.Skia/SKPaintCache.cs b/src/Skia/Avalonia.Skia/SKPaintCache.cs index 79f9575591..9d80e3a729 100644 --- a/src/Skia/Avalonia.Skia/SKPaintCache.cs +++ b/src/Skia/Avalonia.Skia/SKPaintCache.cs @@ -1,13 +1,11 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Concurrent; using SkiaSharp; namespace Avalonia.Skia { + /// + /// Cache for SKPaints. + /// internal static class SKPaintCache { private static ConcurrentBag s_cachedPaints; @@ -17,6 +15,14 @@ namespace Avalonia.Skia s_cachedPaints = new ConcurrentBag(); } + /// + /// Gets a SKPaint for usage. + /// + /// + /// If a SKPaint is in the cache, that existing SKPaint will be returned. + /// Otherwise a new SKPaint will be created. + /// + /// public static SKPaint Get() { if (!s_cachedPaints.TryTake(out var paint)) @@ -27,12 +33,24 @@ namespace Avalonia.Skia return paint; } + /// + /// Returns a SKPaint for reuse later. + /// + /// + /// Do not use the paint further. + /// Do not return the same paint multiple times as that will break the cache. + /// Uses SKPaint.Reset() for reuse later. + /// + /// public static void Return(SKPaint paint) { paint.Reset(); s_cachedPaints.Add(paint); } + /// + /// Clears and disposes all cached paints. + /// public static void Clear() { while (s_cachedPaints.TryTake(out var paint)) From 9d999a6827eaa74a416678d6310256843f6000c9 Mon Sep 17 00:00:00 2001 From: DJGosnell Date: Mon, 14 Nov 2022 17:01:25 -0500 Subject: [PATCH 04/17] Changed SKPaintCache.Return to ReturnReset. Added SKPaintCache.Return which only returns the paint and does not reset. Removed PaintWrapper._disposePaint. Removed all method call's references to setting PaintWrapper._disposePaint. --- src/Skia/Avalonia.Skia/DrawingContextImpl.cs | 51 +++++++++----------- src/Skia/Avalonia.Skia/GeometryImpl.cs | 2 +- src/Skia/Avalonia.Skia/SKPaintCache.cs | 15 +++++- 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index e3957747bd..6dcafdcfd7 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -193,7 +193,7 @@ namespace Avalonia.Skia paint.BlendMode = _currentBlendingMode.ToSKBlendMode(); drawableImage.Draw(this, s, d, paint); - SKPaintCache.Return(paint); + SKPaintCache.ReturnReset(paint); } /// @@ -558,9 +558,9 @@ namespace Avalonia.Skia try { // Return leased paints. - SKPaintCache.Return(_strokePaint); - SKPaintCache.Return(_fillPaint); - SKPaintCache.Return(_boxShadowPaint); + SKPaintCache.ReturnReset(_strokePaint); + SKPaintCache.ReturnReset(_fillPaint); + SKPaintCache.ReturnReset(_boxShadowPaint); if (_grContext != null) { @@ -621,11 +621,11 @@ namespace Avalonia.Skia public void PushOpacityMask(IBrush mask, Rect bounds) { CheckLease(); - // TODO: This should be disposed - var paint = new SKPaint(); + + var paint = SKPaintCache.Get(); Canvas.SaveLayer(paint); - _maskStack.Push(CreatePaint(paint, mask, bounds.Size, true)); + _maskStack.Push(CreatePaint(paint, mask, bounds.Size)); } /// @@ -637,11 +637,16 @@ namespace Avalonia.Skia paint.BlendMode = SKBlendMode.DstIn; Canvas.SaveLayer(paint); - SKPaintCache.Return(paint); - using (var paintWrapper = _maskStack.Pop()) + SKPaintCache.ReturnReset(paint); + + PaintWrapper paintWrapper; + using (paintWrapper = _maskStack.Pop()) { Canvas.DrawPaint(paintWrapper.Paint); } + // Return the paint wrapper's paint less the reset since the paint is already reset in the Dispose method above. + SKPaintCache.Return(paintWrapper.Paint); + Canvas.Restore(); Canvas.Restore(); @@ -977,9 +982,9 @@ namespace Avalonia.Skia ); } - internal PaintWrapper CreateAcrylicPaint (SKPaint paint, IExperimentalAcrylicMaterial material, bool disposePaint = false) + internal PaintWrapper CreateAcrylicPaint (SKPaint paint, IExperimentalAcrylicMaterial material) { - var paintWrapper = new PaintWrapper(paint, disposePaint); + var paintWrapper = new PaintWrapper(paint); paint.IsAntialias = true; @@ -1026,11 +1031,10 @@ namespace Avalonia.Skia /// The paint to wrap. /// Source brush. /// Target size. - /// Optional dispose of the supplied paint. /// Paint wrapper for given brush. - internal PaintWrapper CreatePaint(SKPaint paint, IBrush brush, Size targetSize, bool disposePaint = false) + internal PaintWrapper CreatePaint(SKPaint paint, IBrush brush, Size targetSize) { - var paintWrapper = new PaintWrapper(paint, disposePaint); + var paintWrapper = new PaintWrapper(paint); paint.IsAntialias = true; @@ -1083,9 +1087,8 @@ namespace Avalonia.Skia /// The paint to wrap. /// Source pen. /// Target size. - /// Optional dispose of the supplied paint. /// - private PaintWrapper CreatePaint(SKPaint paint, IPen pen, Size targetSize, bool disposePaint = false) + private PaintWrapper CreatePaint(SKPaint paint, IPen pen, Size targetSize) { // In Skia 0 thickness means - use hairline rendering // and for us it means - there is nothing rendered. @@ -1094,7 +1097,7 @@ namespace Avalonia.Skia return default; } - var rv = CreatePaint(paint, pen.Brush, targetSize, disposePaint); + var rv = CreatePaint(paint, pen.Brush, targetSize); paint.IsStroke = true; paint.StrokeWidth = (float) pen.Thickness; @@ -1209,16 +1212,14 @@ namespace Avalonia.Skia { //We are saving memory allocations there public readonly SKPaint Paint; - private readonly bool _disposePaint; private IDisposable _disposable1; private IDisposable _disposable2; private IDisposable _disposable3; - public PaintWrapper(SKPaint paint, bool disposePaint) + public PaintWrapper(SKPaint paint) { Paint = paint; - _disposePaint = disposePaint; _disposable1 = null; _disposable2 = null; @@ -1266,15 +1267,7 @@ namespace Avalonia.Skia /// public void Dispose() { - if (_disposePaint) - { - Paint?.Dispose(); - } - else - { - Paint?.Reset(); - } - + Paint?.Reset(); _disposable1?.Dispose(); _disposable2?.Dispose(); _disposable3?.Dispose(); diff --git a/src/Skia/Avalonia.Skia/GeometryImpl.cs b/src/Skia/Avalonia.Skia/GeometryImpl.cs index 0e95b5d139..4037cc4a35 100644 --- a/src/Skia/Avalonia.Skia/GeometryImpl.cs +++ b/src/Skia/Avalonia.Skia/GeometryImpl.cs @@ -86,7 +86,7 @@ namespace Avalonia.Skia paint.StrokeWidth = strokeWidth; paint.GetFillPath(EffectivePath, strokePath); - SKPaintCache.Return(paint); + SKPaintCache.ReturnReset(paint); _pathCache.Cache(strokePath, strokeWidth, strokePath.TightBounds.ToAvaloniaRect()); } diff --git a/src/Skia/Avalonia.Skia/SKPaintCache.cs b/src/Skia/Avalonia.Skia/SKPaintCache.cs index 9d80e3a729..6588ab8da8 100644 --- a/src/Skia/Avalonia.Skia/SKPaintCache.cs +++ b/src/Skia/Avalonia.Skia/SKPaintCache.cs @@ -39,10 +39,23 @@ namespace Avalonia.Skia /// /// Do not use the paint further. /// Do not return the same paint multiple times as that will break the cache. - /// Uses SKPaint.Reset() for reuse later. /// /// public static void Return(SKPaint paint) + { + s_cachedPaints.Add(paint); + } + + /// + /// Returns a SKPaint and resets it for reuse later. + /// + /// + /// Do not use the paint further. + /// Do not return the same paint multiple times as that will break the cache. + /// Uses SKPaint.Reset() for reuse later. + /// + /// + public static void ReturnReset(SKPaint paint) { paint.Reset(); s_cachedPaints.Add(paint); From 79332f208baea480ed6c8a0f94ce7660607377b9 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Tue, 15 Nov 2022 01:49:15 -0500 Subject: [PATCH 05/17] Fix wrong type parameter for the command accessor --- .../CompiledBindings/CommandAccessorPlugin.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindings/CommandAccessorPlugin.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindings/CommandAccessorPlugin.cs index 970cc767f7..8339fe8e38 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindings/CommandAccessorPlugin.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindings/CommandAccessorPlugin.cs @@ -124,7 +124,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings { if (_dependsOnProperties is { Count: > 0 } && _reference.TryGetTarget(out var o) && o is INotifyPropertyChanged inpc) { - WeakEventHandlerManager.Unsubscribe( + WeakEventHandlerManager.Unsubscribe( inpc, nameof(INotifyPropertyChanged.PropertyChanged), OnNotifyPropertyChanged); @@ -145,7 +145,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings { if (_dependsOnProperties is { Count:>0 } && _reference.TryGetTarget(out var o) && o is INotifyPropertyChanged inpc) { - WeakEventHandlerManager.Subscribe( + WeakEventHandlerManager.Subscribe( inpc, nameof(INotifyPropertyChanged.PropertyChanged), OnNotifyPropertyChanged); From 3c73f9dc0fac37540f5eae8731a6afb8c0801d58 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Tue, 15 Nov 2022 01:49:28 -0500 Subject: [PATCH 06/17] Fix CanExecute for compiled binding commands --- src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github index 880ba5742e..cd3682c615 160000 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github @@ -1 +1 @@ -Subproject commit 880ba5742e52b67afda048c4023cf7e3c3c16a46 +Subproject commit cd3682c61577a3518de765f7938295d98ff9808c From fa0cea97fefe70c5526122dc2b74fa45749c2d41 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Tue, 15 Nov 2022 02:01:56 -0500 Subject: [PATCH 07/17] Enable compiled bindings by default and fix all the usages + adjust some namespaces --- build/BuildTargets.targets | 1 + samples/BindingDemo/MainWindow.xaml | 6 +-- samples/BindingDemo/TestItemView.xaml | 6 ++- samples/ControlCatalog/App.xaml | 1 - samples/ControlCatalog/ControlCatalog.csproj | 15 ------- samples/ControlCatalog/DecoratedWindow.xaml | 11 +++-- samples/ControlCatalog/MainView.xaml | 8 ++-- samples/ControlCatalog/MainWindow.xaml | 11 ++--- samples/ControlCatalog/Models/StateData.cs | 20 +++++++++ .../Pages/AutoCompleteBoxPage.xaml | 6 +-- .../Pages/AutoCompleteBoxPage.xaml.cs | 20 +-------- samples/ControlCatalog/Pages/BorderPage.xaml | 1 - .../Pages/ButtonSpinnerPage.xaml | 2 +- .../Pages/CalendarDatePickerPage.xaml | 2 +- .../ControlCatalog/Pages/ColorPickerPage.xaml | 4 +- .../ControlCatalog/Pages/ComboBoxPage.xaml | 8 ++-- .../Pages/CompositionPage.axaml | 4 +- .../Pages/ContextFlyoutPage.xaml | 6 ++- .../ControlCatalog/Pages/ContextMenuPage.xaml | 6 ++- samples/ControlCatalog/Pages/CursorPage.xaml | 6 ++- .../ControlCatalog/Pages/DataGridPage.xaml | 30 ++++++------- .../Pages/DateTimePickerPage.xaml | 2 +- .../ControlCatalog/Pages/ExpanderPage.xaml | 4 +- .../Pages/ItemsRepeaterPage.xaml | 8 ++-- .../Pages/ItemsRepeaterPage.xaml.cs | 4 +- samples/ControlCatalog/Pages/LabelsPage.axaml | 4 +- samples/ControlCatalog/Pages/ListBoxPage.xaml | 4 +- samples/ControlCatalog/Pages/MenuPage.xaml | 8 ++-- .../Pages/NotificationsPage.xaml | 4 +- .../Pages/NumericUpDownPage.xaml | 11 +++-- .../Pages/NumericUpDownPage.xaml.cs | 3 ++ samples/ControlCatalog/Pages/OpenGlPage.xaml | 2 +- .../Pages/PlatformInfoPage.xaml | 4 +- .../ControlCatalog/Pages/ProgressBarPage.xaml | 2 +- .../Pages/ScrollViewerPage.xaml | 4 +- samples/ControlCatalog/Pages/SliderPage.xaml | 2 +- .../ControlCatalog/Pages/SplitViewPage.xaml | 6 ++- .../ControlCatalog/Pages/TabControlPage.xaml | 10 +++-- .../Pages/TabControlPage.xaml.cs | 32 +++----------- .../ControlCatalog/Pages/TabStripPage.xaml | 10 +++-- .../ControlCatalog/Pages/TabStripPage.xaml.cs | 40 +++++++---------- samples/ControlCatalog/Pages/TextBoxPage.xaml | 2 +- .../TransitioningContentControlPage.axaml | 3 +- .../ControlCatalog/Pages/TreeViewPage.xaml | 4 +- samples/ControlCatalog/Pages/ViewboxPage.xaml | 2 +- .../Pages/WindowCustomizationsPage.xaml | 4 +- .../ViewModels/CursorPageViewModel.cs | 20 ++++----- .../ViewModels/ItemsRepeaterPageViewModel.cs | 44 +++++++++---------- .../ViewModels/TabControlPageViewModel.cs | 26 +++++++++++ .../Views/CustomNotificationView.xaml | 4 +- samples/IntegrationTestApp/MainWindow.axaml | 4 +- .../IntegrationTestApp/ShowWindowTest.axaml | 1 + samples/MobileSandbox/App.xaml | 1 - samples/MobileSandbox/MainView.xaml | 4 +- .../Views/CustomNotificationView.xaml | 8 ++-- samples/RenderDemo/MainWindow.xaml | 6 ++- samples/RenderDemo/Pages/AnimationsPage.xaml | 4 +- .../RenderDemo/Pages/CustomAnimatorPage.xaml | 2 +- samples/RenderDemo/Pages/GlyphRunPage.xaml | 2 +- samples/RenderDemo/Pages/LineBoundsPage.xaml | 2 +- .../RenderDemo/Pages/Transform3DPage.axaml | 4 +- samples/RenderDemo/Pages/TransitionsPage.xaml | 2 + .../HamburgerMenu/HamburgerMenu.xaml | 6 +-- samples/VirtualizationDemo/MainWindow.xaml | 4 +- .../Themes/Fluent/ColorPicker.xaml | 5 +-- .../Themes/Fluent/ColorPreviewer.xaml | 3 +- .../Themes/Fluent/ColorSlider.xaml | 3 +- .../Themes/Fluent/ColorSpectrum.xaml | 3 +- .../Themes/Fluent/ColorView.xaml | 5 +-- .../Themes/Fluent/Fluent.xaml | 3 +- .../Themes/Simple/ColorPicker.xaml | 5 +-- .../Themes/Simple/ColorPreviewer.xaml | 3 +- .../Themes/Simple/ColorSlider.xaml | 3 +- .../Themes/Simple/ColorSpectrum.xaml | 3 +- .../Themes/Simple/ColorView.xaml | 5 +-- .../Themes/Simple/Simple.xaml | 3 +- .../Themes/Fluent.xaml | 6 +-- .../Themes/Simple.xaml | 5 ++- .../Diagnostics/Controls/FilterTextBox.axaml | 1 - .../Controls/ThicknessEditor.axaml | 2 +- .../Diagnostics/ViewModels/MainViewModel.cs | 4 +- .../Diagnostics/Views/ConsoleView.xaml | 4 +- .../Diagnostics/Views/ControlDetailsView.xaml | 28 +++++++----- .../Diagnostics/Views/EventsPageView.xaml | 10 ++--- .../Views/LayoutExplorerView.axaml | 7 +-- .../Diagnostics/Views/MainView.xaml | 8 ++-- .../Diagnostics/Views/MainWindow.xaml | 8 ++-- .../Diagnostics/Views/TreePageView.xaml | 7 +-- src/Avalonia.Dialogs/AboutAvaloniaDialog.xaml | 4 +- src/Avalonia.Dialogs/InternalViewModelBase.cs | 7 +-- .../ManagedFileChooserFilterViewModel.cs | 3 +- .../ManagedFileChooserItemViewModel.cs | 3 +- .../ManagedFileChooserNavigationItem.cs | 2 +- .../ManagedFileChooserViewModel.cs | 3 +- .../Controls/ButtonSpinner.xaml | 5 +-- .../Controls/CalendarDatePicker.xaml | 3 +- .../Controls/CalendarItem.xaml | 8 ++-- .../Controls/ComboBox.xaml | 2 +- .../Controls/DataValidationErrors.xaml | 5 +-- .../Controls/DatePicker.xaml | 3 +- .../Controls/DateTimePickerShared.xaml | 4 +- .../Controls/DropDownButton.xaml | 3 +- .../Controls/Expander.xaml | 3 +- .../Controls/ManagedFileChooser.xaml | 7 +-- .../Controls/MenuItem.xaml | 5 +-- .../Controls/MenuScrollViewer.xaml | 2 +- .../Controls/NativeMenuBar.xaml | 20 ++++----- .../Controls/ProgressBar.xaml | 3 +- .../Controls/ScrollViewer.xaml | 3 +- .../Controls/Slider.xaml | 2 +- .../Controls/SplitButton.xaml | 1 - .../Controls/TabItem.xaml | 3 +- .../Controls/TabStripItem.xaml | 3 +- .../Controls/TextBox.xaml | 5 +-- .../Controls/TimePicker.xaml | 3 +- .../Controls/ToggleSwitch.xaml | 3 +- .../Controls/ToolTip.xaml | 3 +- .../Controls/TreeViewItem.xaml | 2 +- .../Controls/WindowNotificationManager.xaml | 1 - src/Avalonia.Themes.Fluent/FluentDark.xaml | 2 +- src/Avalonia.Themes.Fluent/FluentLight.xaml | 2 +- .../Controls/ButtonSpinner.xaml | 3 +- .../Controls/CalendarDatePicker.xaml | 3 +- .../Controls/CalendarItem.xaml | 2 +- .../Controls/DatePicker.xaml | 3 +- .../Controls/DateTimePickerShared.xaml | 4 +- .../Controls/ManagedFileChooser.xaml | 4 +- .../Controls/NativeMenuBar.xaml | 17 +++---- .../Controls/ProgressBar.xaml | 2 +- .../Controls/SplitButton.xaml | 1 - .../Controls/SplitView.xaml | 6 +-- .../Controls/TimePicker.xaml | 3 +- .../Controls/TreeViewItem.xaml | 2 +- .../MainWindow.xaml | 1 - 134 files changed, 412 insertions(+), 398 deletions(-) create mode 100644 samples/ControlCatalog/Models/StateData.cs create mode 100644 samples/ControlCatalog/ViewModels/TabControlPageViewModel.cs diff --git a/build/BuildTargets.targets b/build/BuildTargets.targets index a5543cd050..481dbf06b2 100644 --- a/build/BuildTargets.targets +++ b/build/BuildTargets.targets @@ -3,6 +3,7 @@ $(MSBuildThisFileDirectory)\..\src\Avalonia.Build.Tasks\bin\$(Configuration)\netstandard2.0\Avalonia.Build.Tasks.dll true true + true diff --git a/samples/BindingDemo/MainWindow.xaml b/samples/BindingDemo/MainWindow.xaml index b583503327..08ac0426ea 100644 --- a/samples/BindingDemo/MainWindow.xaml +++ b/samples/BindingDemo/MainWindow.xaml @@ -1,8 +1,8 @@ - + diff --git a/samples/BindingDemo/TestItemView.xaml b/samples/BindingDemo/TestItemView.xaml index 46c34c6507..6edade34b2 100644 --- a/samples/BindingDemo/TestItemView.xaml +++ b/samples/BindingDemo/TestItemView.xaml @@ -1,8 +1,10 @@ + xmlns:viewModels="using:BindingDemo.ViewModels" + x:Class="BindingDemo.TestItemView" + x:DataType="viewModels:TestItem"> - \ No newline at end of file + diff --git a/samples/ControlCatalog/App.xaml b/samples/ControlCatalog/App.xaml index b228e72f72..5570ada27b 100644 --- a/samples/ControlCatalog/App.xaml +++ b/samples/ControlCatalog/App.xaml @@ -2,7 +2,6 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="using:ControlCatalog.ViewModels" x:DataType="vm:ApplicationViewModel" - x:CompileBindings="True" Name="Avalonia ControlCatalog" x:Class="ControlCatalog.App"> diff --git a/samples/ControlCatalog/ControlCatalog.csproj b/samples/ControlCatalog/ControlCatalog.csproj index 2654574a3e..6b550a30be 100644 --- a/samples/ControlCatalog/ControlCatalog.csproj +++ b/samples/ControlCatalog/ControlCatalog.csproj @@ -14,9 +14,6 @@ - - - @@ -35,17 +32,5 @@ - - - MSBuild:Compile - - - - - - %(Filename) - - - diff --git a/samples/ControlCatalog/DecoratedWindow.xaml b/samples/ControlCatalog/DecoratedWindow.xaml index c778b31c42..997ae54f41 100644 --- a/samples/ControlCatalog/DecoratedWindow.xaml +++ b/samples/ControlCatalog/DecoratedWindow.xaml @@ -2,7 +2,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="ControlCatalog.DecoratedWindow" Title="Avalonia Control Gallery" - xmlns:local="clr-namespace:ControlCatalog" SystemDecorations="None" Name="Window"> + SystemDecorations="None" Name="Window"> @@ -43,8 +43,13 @@ Hello world! - Decorated - + + + None + BorderOnly + Full + + CanResize diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml index 0d7a1ea4d7..b5a09b5fbd 100644 --- a/samples/ControlCatalog/MainView.xaml +++ b/samples/ControlCatalog/MainView.xaml @@ -1,9 +1,11 @@ + xmlns:controls="using:ControlSamples" + xmlns:models="using:ControlCatalog.Models" + xmlns:pages="using:ControlCatalog.Pages" + xmlns:viewModels="using:ControlCatalog.ViewModels" + x:DataType="viewModels:MainWindowViewModel"> diff --git a/samples/ControlCatalog/Pages/DataGridPage.xaml b/samples/ControlCatalog/Pages/DataGridPage.xaml index 27272a9ff7..f1fcd8035a 100644 --- a/samples/ControlCatalog/Pages/DataGridPage.xaml +++ b/samples/ControlCatalog/Pages/DataGridPage.xaml @@ -4,13 +4,13 @@ x:Class="ControlCatalog.Pages.DataGridPage"> - + - + @@ -49,15 +49,15 @@ AlternatingRowBackground="#1fff"> - - + - - + + + IsVisible="{Binding #ShowGDP.IsChecked}" + x:DataType="local:Country" /> @@ -65,11 +65,11 @@ - - - - - + + + + + @@ -77,9 +77,9 @@ - - - + + + diff --git a/samples/ControlCatalog/Pages/DateTimePickerPage.xaml b/samples/ControlCatalog/Pages/DateTimePickerPage.xaml index 6217d39b21..47753f56b6 100644 --- a/samples/ControlCatalog/Pages/DateTimePickerPage.xaml +++ b/samples/ControlCatalog/Pages/DateTimePickerPage.xaml @@ -2,7 +2,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:sys="clr-namespace:System;assembly=netstandard" + xmlns:sys="using:System" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="ControlCatalog.Pages.DateTimePickerPage"> diff --git a/samples/ControlCatalog/Pages/ExpanderPage.xaml b/samples/ControlCatalog/Pages/ExpanderPage.xaml index 8c8702c665..f0a80fd7ab 100644 --- a/samples/ControlCatalog/Pages/ExpanderPage.xaml +++ b/samples/ControlCatalog/Pages/ExpanderPage.xaml @@ -1,6 +1,8 @@ + xmlns:viewModels="using:ControlCatalog.ViewModels" + x:Class="ControlCatalog.Pages.ExpanderPage" + x:DataType="viewModels:ExpanderPageViewModel"> Expands to show nested content diff --git a/samples/ControlCatalog/Pages/ItemsRepeaterPage.xaml b/samples/ControlCatalog/Pages/ItemsRepeaterPage.xaml index 1d42b92096..5ca4ca9bdd 100644 --- a/samples/ControlCatalog/Pages/ItemsRepeaterPage.xaml +++ b/samples/ControlCatalog/Pages/ItemsRepeaterPage.xaml @@ -1,6 +1,8 @@ + xmlns:viewModels="using:ControlCatalog.ViewModels" + x:Class="ControlCatalog.Pages.ItemsRepeaterPage" + x:DataType="viewModels:ItemsRepeaterPageViewModel"> diff --git a/samples/ControlCatalog/Pages/NotificationsPage.xaml b/samples/ControlCatalog/Pages/NotificationsPage.xaml index d48b338fe8..46c1fe52de 100644 --- a/samples/ControlCatalog/Pages/NotificationsPage.xaml +++ b/samples/ControlCatalog/Pages/NotificationsPage.xaml @@ -1,6 +1,8 @@ + xmlns:viewModels="using:ControlCatalog.ViewModels" + x:Class="ControlCatalog.Pages.NotificationsPage" + x:DataType="viewModels:NotificationViewModel">