From 12b7a5615a29da5cc2d519a78f21f26da96544ff Mon Sep 17 00:00:00 2001 From: Compunet <117437050+dme-compunet@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:28:19 +0200 Subject: [PATCH] Do not resolve markup extensions when resolving selector types (#20903) * Do not resolve markup extensions when resolving selector types * Added commen * Added unit test --- .../AvaloniaXamlIlSelectorTransformer.cs | 4 +++- .../Xaml/StyleTests.cs | 20 +++++++++++++++++++ .../Xaml/TestSelectorControl.cs | 5 +++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 tests/Avalonia.Markup.Xaml.UnitTests/Xaml/TestSelectorControl.cs diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs index d37cffc360..1a8a80329f 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs @@ -209,8 +209,10 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers throw new XamlSelectorsTransformException("Unable to parse selector: " + e.Message, node, e); } + // Selectors should resolve control types only. + // isMarkupExtension = false to prevent resolving selector types to XExtension. var selector = Create(parsed, (p, n) - => TypeReferenceResolver.ResolveType(context, $"{p}:{n}", true, node, true)); + => TypeReferenceResolver.ResolveType(context, $"{p}:{n}", false, node, true)); pn.Values[0] = selector; var templateType = GetLastTemplateTypeFromSelector(selector); diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs index 54f80984ff..95d6cbca94 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs @@ -788,5 +788,25 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml Assert.Equal("Cannot add a Style without selector to a ControlTheme. Line 5, position 14.", exception.Message); } + + [Fact] + public void Selector_Should_Not_Resolve_To_MarkupExtension_Type() + { + using var _ = UnitTestApplication.Start(TestServices.StyledWindow); + + var style = (Style)AvaloniaRuntimeXamlLoader.Load( + $""" + + """); + + Assert.NotNull(style.Selector); + + var targetType = style.Selector.TargetType; + + Assert.NotEqual(typeof(TestSelectorControlExtension), targetType); + } } } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/TestSelectorControl.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/TestSelectorControl.cs new file mode 100644 index 0000000000..a1cb89c002 --- /dev/null +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/TestSelectorControl.cs @@ -0,0 +1,5 @@ +namespace Avalonia.Markup.Xaml.UnitTests.Xaml; + +public class TestSelectorControl; + +public class TestSelectorControlExtension;