diff --git a/src/Avalonia.Visuals/Matrix.cs b/src/Avalonia.Visuals/Matrix.cs
index 8812000bdc..ee31ea9152 100644
--- a/src/Avalonia.Visuals/Matrix.cs
+++ b/src/Avalonia.Visuals/Matrix.cs
@@ -3,6 +3,7 @@
using System;
using System.Globalization;
+using System.Linq;
namespace Avalonia
{
@@ -295,5 +296,33 @@ namespace Avalonia
((_m21 * _m32) - (_m22 * _m31)) / d,
((_m12 * _m31) - (_m11 * _m32)) / d);
}
+
+ ///
+ /// Parses a string.
+ ///
+ /// The string.
+ /// The current culture.
+ /// The .
+ public static Matrix Parse(string s, CultureInfo culture)
+ {
+ var parts = s.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)
+ .Select(x => x.Trim())
+ .ToArray();
+
+ if (parts.Length == 6)
+ {
+ return new Matrix(
+ double.Parse(parts[0], culture),
+ double.Parse(parts[1], culture),
+ double.Parse(parts[2], culture),
+ double.Parse(parts[3], culture),
+ double.Parse(parts[4], culture),
+ double.Parse(parts[5], culture));
+ }
+ else
+ {
+ throw new FormatException("Invalid Matrix.");
+ }
+ }
}
}
\ No newline at end of file
diff --git a/src/Avalonia.Visuals/Point.cs b/src/Avalonia.Visuals/Point.cs
index 7c7a3336fc..5fbd082967 100644
--- a/src/Avalonia.Visuals/Point.cs
+++ b/src/Avalonia.Visuals/Point.cs
@@ -183,7 +183,7 @@ namespace Avalonia
}
else
{
- throw new FormatException("Invalid Thickness.");
+ throw new FormatException("Invalid Point.");
}
}
diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
index dbf985fd79..84c0f1ef1c 100644
--- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
+++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
@@ -31,6 +31,7 @@
+
diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/MatrixTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/MatrixTypeConverter.cs
new file mode 100644
index 0000000000..c477ff5637
--- /dev/null
+++ b/src/Markup/Avalonia.Markup.Xaml/Converters/MatrixTypeConverter.cs
@@ -0,0 +1,23 @@
+// Copyright (c) The Avalonia Project. All rights reserved.
+// Licensed under the MIT license. See licence.md file in the project root for full license information.
+
+using System;
+using System.Globalization;
+
+namespace Avalonia.Markup.Xaml.Converters
+{
+ using System.ComponentModel;
+
+ public class MatrixTypeConverter : TypeConverter
+ {
+ public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+ {
+ return sourceType == typeof(string);
+ }
+
+ public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+ {
+ return Matrix.Parse((string)value, culture);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaDefaultTypeConverters.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaDefaultTypeConverters.cs
index 66e9a697e4..f8b99f2fdf 100644
--- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaDefaultTypeConverters.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaDefaultTypeConverters.cs
@@ -32,6 +32,7 @@ namespace Avalonia.Markup.Xaml.PortableXaml
{ typeof(AvaloniaList), typeof(AvaloniaListTypeConverter) },
{ typeof(IMemberSelector), typeof(MemberSelectorTypeConverter) },
{ typeof(Point), typeof(PointTypeConverter) },
+ { typeof(Matrix), typeof(MatrixTypeConverter) },
{ typeof(IList), typeof(PointsListTypeConverter) },
{ typeof(AvaloniaProperty), typeof(AvaloniaPropertyTypeConverter) },
{ typeof(RelativePoint), typeof(RelativePointTypeConverter) },
diff --git a/tests/Avalonia.Visuals.UnitTests/Media/MatrixTests.cs b/tests/Avalonia.Visuals.UnitTests/Media/MatrixTests.cs
new file mode 100644
index 0000000000..4c1e361952
--- /dev/null
+++ b/tests/Avalonia.Visuals.UnitTests/Media/MatrixTests.cs
@@ -0,0 +1,16 @@
+using System.Globalization;
+using Xunit;
+
+namespace Avalonia.Visuals.UnitTests.Media
+{
+ public class MatrixTests
+ {
+ [Fact]
+ public void Parse_Parses()
+ {
+ var matrix = Matrix.Parse("1,2,3,-4,5 6", CultureInfo.CurrentCulture);
+ var expected = new Matrix(1, 2, 3, -4, 5, 6);
+ Assert.Equal(expected, matrix);
+ }
+ }
+}
\ No newline at end of file