From b166b9c3fb3ef7ba23b15c29180d50854e435ea9 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 22 Aug 2017 17:45:16 +0200 Subject: [PATCH] Started adding StaticResource. --- .../Avalonia.Markup.Xaml.csproj | 1 + .../StaticResourceExtension.cs | 45 +++++++ .../Xaml/StaticResourceTests.cs | 125 ++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs create mode 100644 tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StaticResourceTests.cs diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index 08ea6b6877..efb8ea4cc5 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -34,6 +34,7 @@ + diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs new file mode 100644 index 0000000000..1d3afee96c --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs @@ -0,0 +1,45 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System; +using System.ComponentModel; +using Avalonia.Controls; +using Portable.Xaml; +using Portable.Xaml.ComponentModel; +using Portable.Xaml.Markup; + +namespace Avalonia.Markup.Xaml.MarkupExtensions +{ + public class StaticResourceExtension : MarkupExtension + { + public StaticResourceExtension() + { + } + + public StaticResourceExtension(string resourceKey) + { + ResourceKey = resourceKey; + } + + public string ResourceKey { get; set; } + + public override object ProvideValue(IServiceProvider serviceProvider) + { + var context = (ITypeDescriptorContext)serviceProvider; + var schemaContext = context.GetService()?.SchemaContext; + var ambientProvider = context.GetService(); + var resourceProviderType = schemaContext.GetXamlType(typeof(IResourceProvider)); + var resourceProviders = ambientProvider.GetAllAmbientValues(resourceProviderType); + + foreach (IResourceProvider resourceProvider in resourceProviders) + { + if (resourceProvider.TryGetResource(ResourceKey, out var value)) + { + return value; + } + } + + return AvaloniaProperty.UnsetValue; + } + } +} diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StaticResourceTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StaticResourceTests.cs new file mode 100644 index 0000000000..a89f11a173 --- /dev/null +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StaticResourceTests.cs @@ -0,0 +1,125 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System; +using Avalonia.Controls; +using Avalonia.Markup.Xaml.Data; +using Avalonia.Media; +using Avalonia.Styling; +using Avalonia.UnitTests; +using Xunit; + +namespace Avalonia.Markup.Xaml.UnitTests.Xaml +{ + public class StaticResourceTests + { + [Fact] + public void StaticResource_Style_Can_Be_Assigned_To_Property() + { + var xaml = @" + + + #ff506070 + + + +"; + + var loader = new AvaloniaXamlLoader(); + var userControl = (UserControl)loader.Load(xaml); + var border = userControl.FindControl("border"); + + var brush = (SolidColorBrush)border.Background; + Assert.Equal(0xff506070, brush.Color.ToUint32()); + } + + [Fact] + public void StaticResource_From_Style_Can_Be_Assigned_To_Property() + { + var xaml = @" + + + + + + +"; + + var loader = new AvaloniaXamlLoader(); + var userControl = (UserControl)loader.Load(xaml); + var border = userControl.FindControl("border"); + + var brush = (SolidColorBrush)border.Background; + Assert.Equal(0xff506070, brush.Color.ToUint32()); + } + + [Fact] + public void StaticResource_Can_Be_Assigned_To_Setter() + { + using (StyledWindowNoTheme()) + { + var xaml = @" + + + #ff506070 + + + + +