diff --git a/src/Markup/Avalonia.Markup.Xaml/AvaloniaTypeConverters.cs b/src/Markup/Avalonia.Markup.Xaml/AvaloniaTypeConverters.cs index fa9d364fc0..ac4d60dde1 100644 --- a/src/Markup/Avalonia.Markup.Xaml/AvaloniaTypeConverters.cs +++ b/src/Markup/Avalonia.Markup.Xaml/AvaloniaTypeConverters.cs @@ -44,6 +44,12 @@ namespace Avalonia.Markup.Xaml { typeof(FontFamily), typeof(FontFamilyTypeConverter) } }; + internal static Type GetBuiltinTypeConverter(Type type) + { + _converters.TryGetValue(type, out var result); + return result; + } + /// /// Tries to lookup a for a type. /// diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaTypeAttributeProvider.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaTypeAttributeProvider.cs index 83f4919d4b..7558a5df0b 100644 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaTypeAttributeProvider.cs +++ b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaTypeAttributeProvider.cs @@ -42,7 +42,10 @@ namespace Avalonia.Markup.Xaml.PortableXaml } else if (attributeType == typeof(TypeConverterAttribute)) { - result = ti.GetCustomAttribute(attributeType, inherit); + var builtin = AvaloniaTypeConverters.GetBuiltinTypeConverter(_type); + if (builtin != null) + result = new TypeConverterAttribute(builtin); + result = result ?? ti.GetCustomAttribute(attributeType, inherit); if (result == null) { @@ -111,4 +114,4 @@ namespace Avalonia.Markup.Xaml.PortableXaml return null; } } -} \ No newline at end of file +} diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/ConverterTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/ConverterTests.cs new file mode 100644 index 0000000000..6ffaaaee5c --- /dev/null +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/ConverterTests.cs @@ -0,0 +1,23 @@ +using System; +using Xunit; + +namespace Avalonia.Markup.Xaml.UnitTests.Converters +{ + public class ConverterTests + { + [Fact] + public void Bug_2228_Relative_Uris_Should_Be_Correctly_Parsed() + { + var testClass = typeof(TestClassWithUri); + var parsed = AvaloniaXamlLoader.Parse( + $"<{testClass.Name} xmlns='clr-namespace:{testClass.Namespace}' Uri='/test'/>", testClass.Assembly); + + Assert.False(parsed.Uri.IsAbsoluteUri); + } + } + + public class TestClassWithUri + { + public Uri Uri { get; set; } + } +}