Browse Source

Fixed target type resolve for control templates with direct parent

Nikita Tsukanov 6 years ago
parent
commit
5801756763

+ 6 - 1
src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs

@@ -21,6 +21,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
 
             IXamlIlAstTypeReference targetType;
 
+            var templatableBaseType = context.Configuration.TypeSystem.GetType("Avalonia.Controls.Control");
+            
             if ((tt?.Values.FirstOrDefault() is XamlIlTypeExtensionNode tn))
             {
                 targetType = tn.Type;
@@ -31,9 +33,12 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
                     .FirstOrDefault();
                 if (parentScope?.Type == AvaloniaXamlIlTargetTypeMetadataNode.ScopeType.Style)
                     targetType = parentScope.TargetType;
+                else if (context.ParentNodes().Skip(1).FirstOrDefault() is XamlIlAstObjectNode directParentNode
+                         && templatableBaseType.IsAssignableFrom(directParentNode.Type.GetClrType()))
+                    targetType = directParentNode.Type;
                 else
                     targetType = new XamlIlAstClrTypeReference(node,
-                        context.Configuration.TypeSystem.GetType("Avalonia.Controls.Control"), false);
+                        templatableBaseType, false);
             }