diff --git a/Tests/Perspex.SceneGraph.UnitTests/ThicknessTests.cs b/Tests/Perspex.SceneGraph.UnitTests/ThicknessTests.cs
new file mode 100644
index 0000000000..2844bc007e
--- /dev/null
+++ b/Tests/Perspex.SceneGraph.UnitTests/ThicknessTests.cs
@@ -0,0 +1,45 @@
+// -----------------------------------------------------------------------
+//
+// Copyright 2015 MIT Licence. See licence.md for more information.
+//
+// -----------------------------------------------------------------------
+
+namespace Perspex.SceneGraph.UnitTests.Media
+{
+ using Xunit;
+
+ public class ThicknessTests
+ {
+ [Fact]
+ public void Parse_Parses_Single_Uniform_Size()
+ {
+ var result = Thickness.Parse("1.2");
+
+ Assert.Equal(new Thickness(1.2), result);
+ }
+
+ [Fact]
+ public void Parse_Parses_Horizontal_Vertical()
+ {
+ var result = Thickness.Parse("1.2,3.4");
+
+ Assert.Equal(new Thickness(1.2, 3.4), result);
+ }
+
+ [Fact]
+ public void Parse_Parses_Left_Top_Right_Bottom()
+ {
+ var result = Thickness.Parse("1.2, 3.4, 5, 6");
+
+ Assert.Equal(new Thickness(1.2, 3.4, 5, 6), result);
+ }
+
+ [Fact]
+ public void Parse_Accepts_Spaces()
+ {
+ var result = Thickness.Parse("1.2 3.4 5 6");
+
+ Assert.Equal(new Thickness(1.2, 3.4, 5, 6), result);
+ }
+ }
+}
diff --git a/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs b/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs
index d1fc66f16f..c37de53933 100644
--- a/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs
+++ b/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs
@@ -7,66 +7,29 @@
namespace Perspex.Markup.Xaml.Converters
{
using System;
- using System.Collections.Generic;
using System.Globalization;
- using System.Linq;
using OmniXaml.TypeConversion;
public class ThicknessConverter : ITypeConverter
{
- public object ConvertFrom(IXamlTypeConverterContext context, CultureInfo culture, object value)
+ public bool CanConvertFrom(IXamlTypeConverterContext context, Type sourceType)
{
- var s = value as string;
- if (s != null)
- {
- return ConvertFromString(s);
- }
-
- return null;
+ return sourceType == typeof(string);
}
- private static Thickness ConvertFromString(string s)
+ public bool CanConvertTo(IXamlTypeConverterContext context, Type destinationType)
{
- var parts = s.Split(',', ' ');
-
- switch (parts.Length)
- {
- case 1:
- var uniform = double.Parse(parts[0]);
- return new Thickness(uniform);
- case 2:
- var horizontal = double.Parse(parts[0]);
- var vertical = double.Parse(parts[1]);
- return new Thickness(horizontal, vertical);
- case 4:
- var left = double.Parse(parts[0]);
- var top = double.Parse(parts[1]);
- var right = double.Parse(parts[2]);
- var bottom = double.Parse(parts[3]);
- return new Thickness(left, top, right, bottom);
- }
-
- throw new InvalidOperationException("Invalid Thickness.");
+ return false;
}
- public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType)
+ public object ConvertFrom(IXamlTypeConverterContext context, CultureInfo culture, object value)
{
- throw new System.NotImplementedException();
+ return Thickness.Parse((string)value);
}
- public bool CanConvertTo(IXamlTypeConverterContext context, Type destinationType)
+ public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType)
{
throw new NotImplementedException();
}
-
- public bool CanConvertFrom(IXamlTypeConverterContext context, Type sourceType)
- {
- if (sourceType == typeof(string))
- {
- return true;
- }
-
- return false;
- }
}
}
\ No newline at end of file
diff --git a/src/Perspex.SceneGraph/Thickness.cs b/src/Perspex.SceneGraph/Thickness.cs
index 7673c239e8..e890092ef4 100644
--- a/src/Perspex.SceneGraph/Thickness.cs
+++ b/src/Perspex.SceneGraph/Thickness.cs
@@ -7,6 +7,7 @@
namespace Perspex
{
using System;
+ using System.Linq;
///
/// Describes the thickness of a frame around a rectangle.
@@ -155,6 +156,37 @@ namespace Perspex
a.Bottom + b.Bottom);
}
+ ///
+ /// Parses a string.
+ ///
+ /// The string.
+ /// The .
+ public static Thickness Parse(string s)
+ {
+ var parts = s.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)
+ .Select(x => x.Trim())
+ .ToList();
+
+ switch (parts.Count)
+ {
+ case 1:
+ var uniform = double.Parse(parts[0]);
+ return new Thickness(uniform);
+ case 2:
+ var horizontal = double.Parse(parts[0]);
+ var vertical = double.Parse(parts[1]);
+ return new Thickness(horizontal, vertical);
+ case 4:
+ var left = double.Parse(parts[0]);
+ var top = double.Parse(parts[1]);
+ var right = double.Parse(parts[2]);
+ var bottom = double.Parse(parts[3]);
+ return new Thickness(left, top, right, bottom);
+ }
+
+ throw new FormatException("Invalid Thickness.");
+ }
+
///
/// Checks for equality between a thickness and an object.
///
diff --git a/tests/Perspex.SceneGraph.UnitTests/Perspex.SceneGraph.UnitTests.csproj b/tests/Perspex.SceneGraph.UnitTests/Perspex.SceneGraph.UnitTests.csproj
index ff8383a1b0..818af19064 100644
--- a/tests/Perspex.SceneGraph.UnitTests/Perspex.SceneGraph.UnitTests.csproj
+++ b/tests/Perspex.SceneGraph.UnitTests/Perspex.SceneGraph.UnitTests.csproj
@@ -80,6 +80,7 @@
+