diff --git a/src/Markup/Perspex.Markup.Xaml/Converters/BrushConverter.cs b/src/Markup/Perspex.Markup.Xaml/Converters/BrushConverter.cs index cd55031cf7..63efc9f5c1 100644 --- a/src/Markup/Perspex.Markup.Xaml/Converters/BrushConverter.cs +++ b/src/Markup/Perspex.Markup.Xaml/Converters/BrushConverter.cs @@ -8,6 +8,7 @@ namespace Perspex.Markup.Xaml.Converters { using System; using System.Globalization; + using System.Reflection; using System.Text; using Media; using Media.Imaging; @@ -32,10 +33,24 @@ namespace Perspex.Markup.Xaml.Converters var color = DecodeColor(colorString); - return new SolidColorBrush(color); + if (color != null) + { + return new SolidColorBrush(color.Value); + } + else + { + var member = typeof(Brushes).GetTypeInfo().GetDeclaredProperty(colorString); + + if (member != null) + { + return (Brush)member.GetValue(null); + } + } + + throw new InvalidOperationException("Invalid color string."); } - private static Color DecodeColor(string colorString) + private static Color? DecodeColor(string colorString) { if (colorString[0] == '#') { @@ -49,6 +64,7 @@ namespace Perspex.Markup.Xaml.Converters var b = Convert.ToByte(restOfValue.Substring(8, 2), 16); return Color.FromArgb(a, r, g, b); } + if (restOfValue.Length == 6) { var r = Convert.ToByte(restOfValue.Substring(0, 2), 16); @@ -59,26 +75,8 @@ namespace Perspex.Markup.Xaml.Converters throw new InvalidOperationException("The color code format cannot be parsed"); } - else - { - return DecodeFromNamedColor(colorString); - } - - throw new InvalidOperationException($"The color cannot be decoded from the string \"{colorString}\""); - } - private static Color DecodeFromNamedColor(string colorString) - { - if (colorString == "Crimson") - { - return DecodeColor("#DC143C"); - } - if (colorString == "Coral") - { - return DecodeColor("#FF7F50"); - } - - throw new NotImplementedException(); + return null; } public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType) diff --git a/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs b/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs index 061618f55f..d1fc66f16f 100644 --- a/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs +++ b/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs @@ -27,35 +27,26 @@ namespace Perspex.Markup.Xaml.Converters private static Thickness ConvertFromString(string s) { - var parts = s.Split(',') - .Take(4) - .Select(part => part.Trim()); + var parts = s.Split(',', ' '); - if (parts.Count() == 1) + switch (parts.Length) { - var uniformLength = double.Parse(parts.First()); - return new Thickness(uniformLength); + 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); } - double left = 0, top = 0, right = 0, bottom = 0; - - IList> setValue = new List> - { - val => left = val, - val => top = val, - val => right = val, - val => bottom = val, - }; - - var i = 0; - foreach (var part in parts) - { - var v = double.Parse(part); - setValue[i](v); - i++; - } - - return new Thickness(left, top, right, bottom); + throw new InvalidOperationException("Invalid Thickness."); } public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType) diff --git a/src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/ObservablePropertyBranch.cs b/src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/ObservablePropertyBranch.cs index d1bf21a8b4..2df9a766f3 100644 --- a/src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/ObservablePropertyBranch.cs +++ b/src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/ObservablePropertyBranch.cs @@ -66,7 +66,11 @@ namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking var currentObjectTypeInfo = current.GetType().GetTypeInfo(); var nextProperty = currentObjectTypeInfo.GetDeclaredProperty(nextPropertyName); var nextInstance = nextProperty.GetValue(current); - subscriptions.AddRange(this.GetSubscriptionsRecursive(nextInstance, propertyPath, i + 1)); + + if (i < this.propertyPath.Chunks.Length - 1) + { + subscriptions.AddRange(this.GetSubscriptionsRecursive(nextInstance, propertyPath, i + 1)); + } } return subscriptions; diff --git a/src/Perspex.Themes.Default/ButtonStyle.cs b/src/Perspex.Themes.Default/ButtonStyle.cs index 0c5db083a7..33f284ed39 100644 --- a/src/Perspex.Themes.Default/ButtonStyle.cs +++ b/src/Perspex.Themes.Default/ButtonStyle.cs @@ -29,16 +29,6 @@ namespace Perspex.Themes.Default this.AddRange(new[] { new Style(x => x.OfType