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