From 2b11e17c6de077e370631ac830e60d583209fbce Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Tue, 30 May 2023 17:46:59 +0200 Subject: [PATCH 01/42] feat: Also allows using string instead of {x.Type} in ControlTemplate.TargetType --- ...olTemplateTargetTypeMetadataTransformer.cs | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs index f95d086bf6..4d93408ce8 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs @@ -1,6 +1,7 @@ using System.Linq; using XamlX.Ast; using XamlX.Transform; +using XamlX.Transform.Transformers; using XamlX.TypeSystem; namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers @@ -22,26 +23,19 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers IXamlAstTypeReference targetType; var templatableBaseType = context.Configuration.TypeSystem.GetType("Avalonia.Controls.Control"); - - if ((tt?.Values.FirstOrDefault() is XamlTypeExtensionNode tn)) - { - targetType = tn.Value; - } - else + + targetType = tt?.Values.FirstOrDefault() switch { - var parentScope = context.ParentNodes().OfType() - .FirstOrDefault(); - if (parentScope?.ScopeType == AvaloniaXamlIlTargetTypeMetadataNode.ScopeTypes.Style) - targetType = parentScope.TargetType; - else if (context.ParentNodes().Skip(1).FirstOrDefault() is XamlAstObjectNode directParentNode - && templatableBaseType.IsAssignableFrom(directParentNode.Type.GetClrType())) - targetType = directParentNode.Type; - else - targetType = new XamlAstClrTypeReference(node, - templatableBaseType, false); - } - - + XamlTypeExtensionNode tn => tn.Value, + XamlAstTextNode textNode => TypeReferenceResolver.ResolveType(context, textNode.Text, false, textNode, true), + _ when context.ParentNodes() + .OfType() + .FirstOrDefault() is { ScopeType: AvaloniaXamlIlTargetTypeMetadataNode.ScopeTypes.Style } parentScope => parentScope.TargetType, + _ when context.ParentNodes().Skip(1).FirstOrDefault() is XamlAstObjectNode directParentNode + && templatableBaseType.IsAssignableFrom(directParentNode.Type.GetClrType()) => directParentNode.Type, + _ => new XamlAstClrTypeReference(node, + templatableBaseType, false) + }; return new AvaloniaXamlIlTargetTypeMetadataNode(on, targetType, AvaloniaXamlIlTargetTypeMetadataNode.ScopeTypes.ControlTemplate); @@ -59,7 +53,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers ControlTemplate, Transitions } - + public AvaloniaXamlIlTargetTypeMetadataNode(IXamlAstValueNode value, IXamlAstTypeReference targetType, ScopeTypes type) : base(value, value) From 46c4a1395227f0e40ba4bfa95ea42eeb2fbea6e2 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Wed, 31 May 2023 10:29:07 +0200 Subject: [PATCH 02/42] Add Test --- .../Xaml/ControlTemplateTests.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/ControlTemplateTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/ControlTemplateTests.cs index ea2407e18d..e21f6cd276 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/ControlTemplateTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/ControlTemplateTests.cs @@ -286,6 +286,24 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml Assert.IsType(typeof(ContentPresenter), template.Build(new ContentControl()).Result); } + [Fact] + public void ControlTemplate_With_String_TargetType() + { + var xaml = @" + + + +"; + var template = AvaloniaRuntimeXamlLoader.Parse(xaml); + + Assert.Equal(typeof(ContentControl), template.TargetType); + + Assert.IsType(typeof(ContentPresenter), template.Build(new ContentControl()).Result); + } + + [Fact] public void ControlTemplate_With_Panel_Children_Are_Added() { From 4015e3141097607f0dc71c3dba79e3c217880e58 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Wed, 5 Jul 2023 15:25:08 +0200 Subject: [PATCH 03/42] feat: Handle ClrPropertyInfo in StaticResourceExtension --- .../MarkupExtensions/StaticResourceExtension.cs | 12 +++++++++--- .../Avalonia.Markup/Markup/Data/DelayedBinding.cs | 11 ++++++----- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs index c23c31e24c..38c04505e6 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs @@ -32,14 +32,20 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions var stack = serviceProvider.GetService(); var provideTarget = serviceProvider.GetService(); var targetObject = provideTarget?.TargetObject; - var targetProperty = provideTarget?.TargetProperty; + var targetProperty = provideTarget?.TargetProperty switch + { + AvaloniaProperty ap => ap, + PropertyInfo pi => new Avalonia.Data.Core.ReflectionClrPropertyInfo(pi), + _ => provideTarget.TargetProperty, + } + ; var themeVariant = (targetObject as IThemeVariantHost)?.ActualThemeVariant ?? GetDictionaryVariant(serviceProvider); var targetType = targetProperty switch { AvaloniaProperty ap => ap.PropertyType, - PropertyInfo pi => pi.PropertyType, + Avalonia.Data.Core.IPropertyInfo cpi => cpi.PropertyType, _ => null }; @@ -62,7 +68,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions } if (targetObject is Control target && - targetProperty is PropertyInfo property) + targetProperty is Avalonia.Data.Core.IPropertyInfo property) { // This is stored locally to avoid allocating closure in the outer scope. var localTargetType = targetType; diff --git a/src/Markup/Avalonia.Markup/Markup/Data/DelayedBinding.cs b/src/Markup/Avalonia.Markup/Markup/Data/DelayedBinding.cs index 6c70a81298..9c0153e7b9 100644 --- a/src/Markup/Avalonia.Markup/Markup/Data/DelayedBinding.cs +++ b/src/Markup/Avalonia.Markup/Markup/Data/DelayedBinding.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Reflection; using System.Runtime.CompilerServices; using Avalonia.Data; +using Avalonia.Data.Core; using Avalonia.Logging; namespace Avalonia.Markup.Data @@ -56,11 +57,11 @@ namespace Avalonia.Markup.Data /// The control. /// The property on the control to bind to. /// A function which returns the value. - public static void Add(StyledElement target, PropertyInfo property, Func value) + public static void Add(StyledElement target, IPropertyInfo property, Func value) { if (target.IsInitialized) { - property.SetValue(target, value(target)); + property.Set(target, value(target)); } else { @@ -125,20 +126,20 @@ namespace Avalonia.Markup.Data private class ClrPropertyValueEntry : Entry { - public ClrPropertyValueEntry(PropertyInfo property, Func value) + public ClrPropertyValueEntry(IPropertyInfo property, Func value) { Property = property; Value = value; } - public PropertyInfo Property { get; } + public IPropertyInfo Property { get; } public Func Value { get; } public override void Apply(StyledElement control) { try { - Property.SetValue(control, Value(control)); + Property.Set(control, Value(control)); } catch (Exception e) { From 30c36147fd033eb05d50d00b1f8525dc3a7ed7fd Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 5 Jul 2023 14:46:27 +0100 Subject: [PATCH 04/42] fix DropDownButton glyph foreground color --- src/Avalonia.Themes.Fluent/Controls/DropDownButton.xaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Avalonia.Themes.Fluent/Controls/DropDownButton.xaml b/src/Avalonia.Themes.Fluent/Controls/DropDownButton.xaml index 438ad6cf18..2b26a7ef89 100644 --- a/src/Avalonia.Themes.Fluent/Controls/DropDownButton.xaml +++ b/src/Avalonia.Themes.Fluent/Controls/DropDownButton.xaml @@ -71,6 +71,9 @@ + +