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; }
+ }
+}