From 52617b4a58ed6a3ecd406e63c871ae934589bb11 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Sun, 15 Oct 2017 14:44:26 -0500 Subject: [PATCH 1/5] Remove StyleResource and StyleBinding. Fold XamlBinding into Binding since that is the only place it is being used now. --- Avalonia.sln | 3 +- .../Avalonia.Markup.Xaml.csproj | 3 - .../Avalonia.Markup.Xaml/Data/Binding.cs | 4 ++ .../Data/StyleResourceBinding.cs | 69 ------------------- .../MarkupExtensions/BindingExtension.cs | 27 +++++++- .../StyleResourceExtension.cs | 31 --------- .../PortableXaml/AvaloniaXamlType.cs | 12 +--- .../PortableXaml/XamlBinding.cs | 63 ----------------- .../Xaml/BasicTests.cs | 17 ++--- 9 files changed, 35 insertions(+), 194 deletions(-) delete mode 100644 src/Markup/Avalonia.Markup.Xaml/Data/StyleResourceBinding.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleResourceExtension.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/PortableXaml/XamlBinding.cs diff --git a/Avalonia.sln b/Avalonia.sln index 7f516667ee..c6509817ce 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26730.3 +VisualStudioVersion = 15.0.26730.10 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Base", "src\Avalonia.Base\Avalonia.Base.csproj", "{B09B78D8-9B26-48B0-9149-D64A2F120F3F}" EndProject @@ -204,6 +204,7 @@ Global tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{48840edd-24bf-495d-911e-2eb12ae75d3b}*SharedItemsImports = 13 src\Shared\PlatformSupport\PlatformSupport.projitems*{4a1abb09-9047-4bd5-a4ad-a055e52c5ee0}*SharedItemsImports = 4 src\Shared\PlatformSupport\PlatformSupport.projitems*{7863ea94-f0fb-4386-bf8c-e5bfa761560a}*SharedItemsImports = 4 + src\Shared\PlatformSupport\PlatformSupport.projitems*{7b92af71-6287-4693-9dcb-bd5b6e927e23}*SharedItemsImports = 4 src\Shared\RenderHelpers\RenderHelpers.projitems*{7d2d3083-71dd-4cc9-8907-39a0d86fb322}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{811a76cf-1cf6-440f-963b-bbe31bd72a82}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{9defc6b7-845b-4d8f-afc0-d32bf0032b8c}*SharedItemsImports = 13 diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index de015fc947..caf3259f30 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -39,7 +39,6 @@ - @@ -73,8 +72,6 @@ - - diff --git a/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs b/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs index 3f12593197..fd54f0f3ad 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs @@ -83,6 +83,8 @@ namespace Avalonia.Markup.Xaml.Data /// public object Source { get; set; } + internal WeakReference DefaultAnchor { get; set; } + /// public InstancedBinding Initiate( IAvaloniaObject target, @@ -92,6 +94,8 @@ namespace Avalonia.Markup.Xaml.Data { Contract.Requires(target != null); + anchor = anchor ?? DefaultAnchor.Target; + var pathInfo = ParsePath(Path); ValidateState(pathInfo); enableDataValidation = enableDataValidation && Priority == BindingPriority.LocalValue; diff --git a/src/Markup/Avalonia.Markup.Xaml/Data/StyleResourceBinding.cs b/src/Markup/Avalonia.Markup.Xaml/Data/StyleResourceBinding.cs deleted file mode 100644 index 787aebbdc6..0000000000 --- a/src/Markup/Avalonia.Markup.Xaml/Data/StyleResourceBinding.cs +++ /dev/null @@ -1,69 +0,0 @@ -// 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.Reactive.Disposables; -using System.Reactive.Linq; -using System.Reactive.Subjects; -using Avalonia.Controls; -using Avalonia.Data; -using Avalonia.Styling; - -namespace Avalonia.Markup.Xaml.Data -{ - public class StyleResourceBinding : IBinding - { - /// - /// Initializes a new instance of the class. - /// - /// The resource name. - public StyleResourceBinding(string name) - { - Name = name; - } - - /// - public BindingMode Mode => BindingMode.OneTime; - - /// - /// Gets the resource name. - /// - public string Name { get; } - - /// - public BindingPriority Priority => BindingPriority.LocalValue; - - /// - public InstancedBinding Initiate( - IAvaloniaObject target, - AvaloniaProperty targetProperty, - object anchor = null, - bool enableDataValidation = false) - { - var host = (target as IControl) ?? (anchor as IControl); - var style = anchor as IStyle; - var resource = AvaloniaProperty.UnsetValue; - - if (host != null) - { - resource = host.FindResource(Name); - } - else if (style != null) - { - if (!style.TryGetResource(Name, out resource)) - { - resource = AvaloniaProperty.UnsetValue; - } - } - - if (resource != AvaloniaProperty.UnsetValue) - { - return new InstancedBinding(resource, Priority); - } - else - { - return null; - } - } - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs index 9d1e36ee78..8984498393 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs @@ -7,8 +7,13 @@ using System; namespace Avalonia.Markup.Xaml.MarkupExtensions { + using Avalonia.Controls; + using Avalonia.Styling; + using Portable.Xaml; + using Portable.Xaml.ComponentModel; using Portable.Xaml.Markup; using PortableXaml; + using System.ComponentModel; [MarkupExtensionReturnType(typeof(IBinding))] public class BindingExtension : MarkupExtension @@ -24,7 +29,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions public override object ProvideValue(IServiceProvider serviceProvider) { - var b = new Binding + return new Binding { Converter = Converter, ConverterParameter = ConverterParameter, @@ -33,10 +38,26 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions Mode = Mode, Path = Path, Priority = Priority, - RelativeSource = RelativeSource + RelativeSource = RelativeSource, + DefaultAnchor = new WeakReference(GetDefaultAnchor((ITypeDescriptorContext)serviceProvider)) }; + } + + + private static object GetDefaultAnchor(ITypeDescriptorContext context) + { + object anchor = null; + + // The target is not a control, so we need to find an anchor that will let us look + // up named controls and style resources. First look for the closest IControl in + // the context. + anchor = context.GetFirstAmbientValue(); - return XamlBinding.FromMarkupExtensionContext(b, serviceProvider); + // If a control was not found, then try to find the highest-level style as the XAML + // file could be a XAML file containing only styles. + return anchor ?? + context.GetService()?.RootObject as IStyle ?? + context.GetLastOrDefaultAmbientValue(); } public IValueConverter Converter { get; set; } diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleResourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleResourceExtension.cs deleted file mode 100644 index 55a1b72125..0000000000 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleResourceExtension.cs +++ /dev/null @@ -1,31 +0,0 @@ -// 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 Avalonia.Data; -using Avalonia.Markup.Xaml.Data; -using System; - -namespace Avalonia.Markup.Xaml.MarkupExtensions -{ - using Portable.Xaml.Markup; - using PortableXaml; - - [MarkupExtensionReturnType(typeof(IBinding))] - public class StyleResourceExtension : MarkupExtension - { - public StyleResourceExtension(string name) - { - Name = name; - } - - public override object ProvideValue(IServiceProvider serviceProvider) - { - return XamlBinding.FromMarkupExtensionContext( - new StyleResourceBinding(Name), - serviceProvider); - } - - [ConstructorArgument("name")] - public string Name { get; set; } - } -} \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs index 71c8902cbd..94881723a9 100644 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs +++ b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs @@ -210,11 +210,6 @@ namespace Avalonia.Markup.Xaml.PortableXaml value); } - if (value is XamlBinding) - { - value = (value as XamlBinding).Value; - } - if (UpdateListInsteadSet && value != null && UpdateListInsteadSetValue(instance, value)) @@ -315,9 +310,7 @@ namespace Avalonia.Markup.Xaml.PortableXaml if (!Member.AssignBinding) ApplyBinding(obj, (IBinding)value); else - obj.SetValue(Property, value is XamlBinding ? - (value as XamlBinding).Value : - value); + obj.SetValue(Property, value); } else { @@ -346,12 +339,9 @@ namespace Avalonia.Markup.Xaml.PortableXaml { var control = obj as IControl; var property = Property; - var xamlBinding = binding as XamlBinding; if (control != null && property != Control.DataContextProperty) DelayedBinding.Add(control, property, binding); - else if (xamlBinding != null) - obj.Bind(property, xamlBinding.Value, xamlBinding.Anchor?.Target); else obj.Bind(property, binding); } diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/XamlBinding.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/XamlBinding.cs deleted file mode 100644 index 1f4e66471c..0000000000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/XamlBinding.cs +++ /dev/null @@ -1,63 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Data; -using Avalonia.Styling; -using Portable.Xaml; -using Portable.Xaml.ComponentModel; -using System.ComponentModel; -using Portable.Xaml.Markup; -using System; - -namespace Avalonia.Markup.Xaml.PortableXaml -{ - internal class XamlBinding : IBinding - { - public static IBinding FromMarkupExtensionContext( - IBinding binding, - IServiceProvider serviceProvider) - { - var context = (ITypeDescriptorContext)serviceProvider; - var pvt = context.GetService(); - - if (pvt.TargetObject is IControl) return binding; - - object anchor = GetDefaultAnchor(context); - - if (anchor == null) return binding; - - return new XamlBinding(binding, anchor); - } - - private static object GetDefaultAnchor(ITypeDescriptorContext context) - { - object anchor = null; - - // The target is not a control, so we need to find an anchor that will let us look - // up named controls and style resources. First look for the closest IControl in - // the context. - anchor = context.GetFirstAmbientValue(); - - // If a control was not found, then try to find the highest-level style as the XAML - // file could be a XAML file containing only styles. - return anchor ?? - context.GetService()?.RootObject as IStyle ?? - context.GetLastOrDefaultAmbientValue(); - } - - private XamlBinding(IBinding binding, object anchor) - { - Value = binding; - - Anchor = new WeakReference(anchor); - } - - public WeakReference Anchor { get; } - - public IBinding Value { get; } - - public InstancedBinding Initiate(IAvaloniaObject target, AvaloniaProperty targetProperty, object anchor = null, bool enableDataValidation = false) - { - return Value.Initiate(target, targetProperty, - anchor ?? Anchor.Target, enableDataValidation); - } - } -} \ No newline at end of file diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs index ce370790c3..88ee13eae4 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs @@ -411,8 +411,8 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml var xaml = @" - - "; From 918cd06d2fa2f135c93561f1508e132f5f0fcd06 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Sun, 15 Oct 2017 14:55:32 -0500 Subject: [PATCH 2/5] Fix failing tests. --- src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs b/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs index fd54f0f3ad..eb5f87ea2a 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs @@ -94,7 +94,7 @@ namespace Avalonia.Markup.Xaml.Data { Contract.Requires(target != null); - anchor = anchor ?? DefaultAnchor.Target; + anchor = anchor ?? DefaultAnchor?.Target; var pathInfo = ParsePath(Path); ValidateState(pathInfo); From 7e4c16838b0d99c330bd4df4c17f432d51d99533 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Sun, 15 Oct 2017 15:37:49 -0500 Subject: [PATCH 3/5] Remove StyleResource markup extension tests. --- .../Xaml/StyleTests.cs | 165 ------------------ 1 file changed, 165 deletions(-) diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs index 65fc9eaddd..b339972029 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs @@ -61,171 +61,6 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml } } - [Fact] - public void StyleResource_Can_Be_Assigned_To_Property() - { - var xaml = @" - - - - - - -"; - - var loader = new AvaloniaXamlLoader(); - var userControl = (UserControl)loader.Load(xaml); - var border = userControl.FindControl("border"); - - DelayedBinding.ApplyBindings(border); - - var brush = (SolidColorBrush)border.Background; - Assert.Equal(0xff506070, brush.Color.ToUint32()); - } - - [Fact] - public void StyleResource_Can_Be_Assigned_To_Setter() - { - //skip default theme and styles, they are not needed - using (UnitTestApplication.Start(TestServices.StyledWindow - .With(theme: () => new Styles()))) - { - var xaml = @" - - - - - -