diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs index 871ab77cac..099ffa8c8c 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs @@ -4,7 +4,8 @@ using System.Globalization; namespace Avalonia.Markup.Xaml.Converters { - using System.ComponentModel; + using System.ComponentModel; + using Avalonia.Utilities; public class PointsListTypeConverter : TypeConverter { @@ -15,15 +16,17 @@ namespace Avalonia.Markup.Xaml.Converters public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { - string strValue = (string)value; - string[] pointStrs = strValue.Split(new[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); - var result = new List(pointStrs.Length); - foreach (var pointStr in pointStrs) + var points = new List(); + + using (var tokenizer = new StringTokenizer((string)value, CultureInfo.InvariantCulture, exceptionMessage: "Invalid PointsList.")) { - result.Add(Point.Parse(pointStr)); + while (tokenizer.TryReadDouble(out double x)) + { + points.Add(new Point(x, tokenizer.ReadDouble())); + } } - return result; + return points; } } } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs new file mode 100644 index 0000000000..b060905f38 --- /dev/null +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using Avalonia.Controls.Shapes; +using Avalonia.Markup.Xaml.Converters; +using Xunit; + +namespace Avalonia.Markup.Xaml.UnitTests.Converters +{ + public class PointsListTypeConverterTests + { + [Theory] + [InlineData("1,2 3,4")] + [InlineData("1 2 3 4")] + [InlineData("1 2,3 4")] + [InlineData("1,2,3,4")] + public void TypeConverter_Should_Parse(string input) + { + var conv = new PointsListTypeConverter(); + + var points = (IList)conv.ConvertFrom(input); + + Assert.Equal(2, points.Count); + Assert.Equal(new Point(1, 2), points[0]); + Assert.Equal(new Point(3, 4), points[1]); + } + + [Theory] + [InlineData("1,2 3,4")] + [InlineData("1 2 3 4")] + [InlineData("1 2,3 4")] + [InlineData("1,2,3,4")] + public void Should_Parse_Points_in_Xaml(string input) + { + var xaml = $""; + var loader = new AvaloniaXamlLoader(); + var polygon = (Polygon)loader.Load(xaml); + + var points = polygon.Points; + + Assert.Equal(2, points.Count); + Assert.Equal(new Point(1, 2), points[0]); + Assert.Equal(new Point(3, 4), points[1]); + } + } +}