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