Browse Source

initial implementation of type converters

donandren 8 years ago
parent
commit
3e3285c497
21 changed files with 516 additions and 51 deletions
  1. 38 2
      src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaListTypeConverter.cs
  2. 23 2
      src/Markup/Avalonia.Markup.Xaml/Converters/ClassesTypeConverter.cs
  3. 23 1
      src/Markup/Avalonia.Markup.Xaml/Converters/ColorTypeConverter.cs
  4. 22 1
      src/Markup/Avalonia.Markup.Xaml/Converters/ColumnDefinitionsTypeConverter.cs
  5. 24 3
      src/Markup/Avalonia.Markup.Xaml/Converters/CursorTypeConverter.cs
  6. 6 1
      src/Markup/Avalonia.Markup.Xaml/Converters/DateTimeTypeConverter.cs
  7. 6 1
      src/Markup/Avalonia.Markup.Xaml/Converters/FontWeightConverter.cs
  8. 27 3
      src/Markup/Avalonia.Markup.Xaml/Converters/GeometryTypeConverter.cs
  9. 22 1
      src/Markup/Avalonia.Markup.Xaml/Converters/GridLengthTypeConverter.cs
  10. 60 7
      src/Markup/Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs
  11. 25 1
      src/Markup/Avalonia.Markup.Xaml/Converters/KeyGestureConverter.cs
  12. 25 1
      src/Markup/Avalonia.Markup.Xaml/Converters/MemberSelectorTypeConverter.cs
  13. 22 1
      src/Markup/Avalonia.Markup.Xaml/Converters/PointTypeConverter.cs
  14. 30 1
      src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs
  15. 22 1
      src/Markup/Avalonia.Markup.Xaml/Converters/RelativePointTypeConverter.cs
  16. 22 1
      src/Markup/Avalonia.Markup.Xaml/Converters/RelativeRectTypeConverter.cs
  17. 22 1
      src/Markup/Avalonia.Markup.Xaml/Converters/RowDefinitionsTypeConverter.cs
  18. 22 1
      src/Markup/Avalonia.Markup.Xaml/Converters/SizeTypeConverter.cs
  19. 22 1
      src/Markup/Avalonia.Markup.Xaml/Converters/ThicknessTypeConverter.cs
  20. 31 2
      src/Markup/Avalonia.Markup.Xaml/Converters/TimeSpanTypeConverter.cs
  21. 22 18
      src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaDefaultTypeConverters.cs

+ 38 - 2
src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaListTypeConverter.cs

@@ -3,13 +3,48 @@
 
 using System;
 using System.Globalization;
-using System.Linq;
-using OmniXaml.TypeConversion;
 using Avalonia.Collections;
 using Avalonia.Utilities;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class AvaloniaListTypeConverter<T> : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            var result = new AvaloniaList<T>();
+            var values = ((string)value).Split(',');
+
+            foreach (var s in values)
+            {
+                object v;
+
+                if (TypeUtilities.TryConvert(typeof(T), s, culture, out v))
+                {
+                    result.Add((T)v);
+                }
+                else
+                {
+                    throw new InvalidCastException($"Could not convert '{s}' to {typeof(T)}.");
+                }
+            }
+
+            return result;
+        }
+    }
+
+#else
+    using OmniXaml.TypeConversion;
+
     public class AvaloniaListTypeConverter<T> : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -49,4 +84,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 23 - 2
src/Markup/Avalonia.Markup.Xaml/Converters/ClassesTypeConverter.cs

@@ -3,12 +3,31 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 using Avalonia.Controls;
-using Avalonia.Styling;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class ClassesTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return new Classes(((string)value).Split(' '));
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class ClassesTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -31,4 +50,6 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+
+#endif
 }

+ 23 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/ColorTypeConverter.cs

@@ -3,11 +3,31 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 using Avalonia.Media;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class ColorTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return Color.Parse((string)value);
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class ColorTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -30,4 +50,6 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+
+#endif
 }

+ 22 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/ColumnDefinitionsTypeConverter.cs

@@ -3,11 +3,31 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 using Avalonia.Controls;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class ColumnDefinitionsTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return new ColumnDefinitions((string)value);
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class ColumnDefinitionsTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -30,4 +50,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 24 - 3
src/Markup/Avalonia.Markup.Xaml/Converters/CursorTypeConverter.cs

@@ -3,13 +3,32 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 using Avalonia.Input;
-using Avalonia.Media.Imaging;
-using Avalonia.Platform;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class CursorTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            var cursor = (StandardCursorType)Enum.Parse(typeof(StandardCursorType), ((string)value).Trim(), true);
+            return new Cursor(cursor);
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class CursorTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -33,4 +52,6 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+
+#endif
 }

+ 6 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/DateTimeTypeConverter.cs

@@ -1,9 +1,13 @@
-using OmniXaml.TypeConversion;
+// 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;
+using OmniXaml.TypeConversion;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if OMNIXAML
     public class DateTimeTypeConverter : ITypeConverter
     {
         public object ConvertFrom(IValueContext context, CultureInfo culture, object value)
@@ -55,4 +59,5 @@ namespace Avalonia.Markup.Xaml.Converters
             return sourceType == typeof(string);
         }
     }
+#endif
 }

+ 6 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/FontWeightConverter.cs

@@ -1,5 +1,9 @@
-namespace Avalonia.Markup.Xaml.Converters
+// 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.
+
+namespace Avalonia.Markup.Xaml.Converters
 {
+#if OMNIXAML
     using Avalonia.Media;
     using OmniXaml.TypeConversion;
     using System;
@@ -36,4 +40,5 @@
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 27 - 3
src/Markup/Avalonia.Markup.Xaml/Converters/GeometryTypeConverter.cs

@@ -1,8 +1,31 @@
+// 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;
+using Avalonia.Media;
+
 namespace Avalonia.Markup.Xaml.Converters
 {
-    using System;
-    using System.Globalization;
-    using Media;
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class GeometryTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return StreamGeometry.Parse((string)value);
+        }
+    }
+
+#else
+
     using OmniXaml.TypeConversion;
 
     public class GeometryTypeConverter : ITypeConverter
@@ -27,4 +50,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 22 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/GridLengthTypeConverter.cs

@@ -3,11 +3,31 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 using Avalonia.Controls;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class GridLengthTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return GridLength.Parse((string)value, culture);
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class GridLengthTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -30,4 +50,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 60 - 7
src/Markup/Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs

@@ -1,17 +1,69 @@
-using System;
-using System.Collections.Generic;
+// 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;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-using System.Threading.Tasks;
 using Avalonia.Controls;
 using Avalonia.Media.Imaging;
 using Avalonia.Platform;
-using OmniXaml.TypeConversion;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class IconTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            var path = value as string;
+            if (path != null)
+            {
+                return CreateIconFromPath(context, path);
+            }
+            var bitmap = value as IBitmap;
+            if (bitmap != null)
+            {
+                return new WindowIcon(bitmap);
+            }
+            throw new NotSupportedException();
+        }
+
+        private WindowIcon CreateIconFromPath(ITypeDescriptorContext context, string path)
+        {
+            var uri = new Uri(path, UriKind.RelativeOrAbsolute);
+            var baseUri = GetBaseUri(context);
+            var scheme = uri.IsAbsoluteUri ? uri.Scheme : "file";
+
+            switch (scheme)
+            {
+                case "file":
+                    return new WindowIcon(path);
+                default:
+                    var assets = AvaloniaLocator.Current.GetService<IAssetLoader>();
+                    return new WindowIcon(assets.Open(uri, baseUri));
+            }
+        }
+
+        private Uri GetBaseUri(ITypeDescriptorContext context)
+        {
+            throw new NotImplementedException();
+            //object result;
+            //context.ParsingDictionary.TryGetValue("Uri", out result);
+            //return result as Uri;
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     class IconTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -67,4 +119,5 @@ namespace Avalonia.Markup.Xaml.Converters
             return result as Uri;
         }
     }
+#endif
 }

+ 25 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/KeyGestureConverter.cs

@@ -1,10 +1,33 @@
+// 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;
-using OmniXaml.TypeConversion;
 using Avalonia.Input;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class KeyGestureConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return KeyGesture.Parse((string)value);
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     class KeyGestureConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -27,4 +50,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 25 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/MemberSelectorTypeConverter.cs

@@ -3,11 +3,34 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 using Avalonia.Markup.Xaml.Templates;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class MemberSelectorTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return new MemberSelector
+            {
+                MemberName = (string)value,
+            };
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class MemberSelectorTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -33,4 +56,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 22 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/PointTypeConverter.cs

@@ -3,10 +3,30 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class PointTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return Point.Parse((string)value, culture);
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class PointTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -29,4 +49,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 30 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs

@@ -4,10 +4,38 @@
 using System;
 using System.Collections.Generic;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class PointsListTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        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<Point>(pointStrs.Length);
+            foreach (var pointStr in pointStrs)
+            {
+                result.Add(Point.Parse(pointStr, culture));
+            }
+
+            return result;
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class PointsListTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -37,4 +65,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 22 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/RelativePointTypeConverter.cs

@@ -3,10 +3,30 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class RelativePointTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return RelativePoint.Parse((string)value, culture);
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class RelativePointTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -29,4 +49,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 22 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/RelativeRectTypeConverter.cs

@@ -3,10 +3,30 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class RelativeRectTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return RelativeRect.Parse((string)value, culture);
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class RelativeRectTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -29,4 +49,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 22 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/RowDefinitionsTypeConverter.cs

@@ -3,11 +3,31 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 using Avalonia.Controls;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class RowDefinitionsTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return new RowDefinitions((string)value);
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class RowDefinitionsTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -30,4 +50,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 22 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/SizeTypeConverter.cs

@@ -3,10 +3,30 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class SizeTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return Size.Parse((string)value, culture);
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class SizeTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -29,4 +49,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 22 - 1
src/Markup/Avalonia.Markup.Xaml/Converters/ThicknessTypeConverter.cs

@@ -3,10 +3,30 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class ThicknessTypeConverter : TypeConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return sourceType == typeof(string);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            return Thickness.Parse((string)value, culture);
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+
     public class ThicknessTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -29,4 +49,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 31 - 2
src/Markup/Avalonia.Markup.Xaml/Converters/TimeSpanTypeConverter.cs

@@ -3,11 +3,39 @@
 
 using System;
 using System.Globalization;
-using OmniXaml.TypeConversion;
-using Avalonia.Media;
 
 namespace Avalonia.Markup.Xaml.Converters
 {
+#if !OMNIXAML
+
+    using Portable.Xaml.ComponentModel;
+
+    public class TimeSpanTypeConverter : Portable.Xaml.ComponentModel.TimeSpanConverter
+    {
+        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+        {
+            return base.CanConvertFrom(context, sourceType);
+        }
+
+        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+        {
+            var valueStr = (string)value;
+            if (!valueStr.Contains(":"))
+            {
+                // shorthand seconds format (ie. "0.25")
+                var secs = double.Parse(valueStr, CultureInfo.InvariantCulture);
+                return TimeSpan.FromSeconds(secs);
+            }
+
+            return base.ConvertFrom(context, culture, value);
+        }
+    }
+
+#else
+
+    using OmniXaml.TypeConversion;
+    using Avalonia.Media;
+
     public class TimeSpanTypeConverter : ITypeConverter
     {
         public bool CanConvertFrom(IValueContext context, Type sourceType)
@@ -38,4 +66,5 @@ namespace Avalonia.Markup.Xaml.Converters
             throw new NotImplementedException();
         }
     }
+#endif
 }

+ 22 - 18
src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaDefaultTypeConverters.cs

@@ -7,6 +7,10 @@ using Avalonia.Media;
 using Avalonia.Media.Imaging;
 using Avalonia.Styling;
 using Portable.Xaml.ComponentModel;
+using Avalonia.Controls;
+using Avalonia.Input;
+using Avalonia.Collections;
+using Avalonia.Controls.Templates;
 
 namespace Avalonia.Markup.Xaml.PortableXaml
 {
@@ -17,29 +21,29 @@ namespace Avalonia.Markup.Xaml.PortableXaml
             //avalonia default converters
             { typeof(IBitmap), typeof(BitmapTypeConverter)},
             { typeof(IBrush), typeof(BrushTypeConverter) },
-            //{ typeof(Color), typeof(ColorTypeConverter) },
-            //{ typeof(Classes), typeof(ClassesTypeConverter) },
-            //{ typeof(ColumnDefinitions), typeof(ColumnDefinitionsTypeConverter) },
+            { typeof(Color), typeof(ColorTypeConverter) },
+            { typeof(Classes), typeof(ClassesTypeConverter) },
+            { typeof(ColumnDefinitions), typeof(ColumnDefinitionsTypeConverter) },
             //{ typeof(DateTime), typeof(DateTimeTypeConverter) },
-            //{ typeof(Geometry), typeof(GeometryTypeConverter) },
-            //{ typeof(GridLength), typeof(GridLengthTypeConverter) },
-            //{ typeof(KeyGesture), typeof(KeyGestureConverter) },
-            //{ typeof(AvaloniaList<double>), typeof(AvaloniaListTypeConverter<double>) },
-            //{ typeof(IMemberSelector), typeof(MemberSelectorTypeConverter) },
-            //{ typeof(Point), typeof(PointTypeConverter) },
-            //{ typeof(IList<Point>), typeof(PointsListTypeConverter) },
+            { typeof(Geometry), typeof(GeometryTypeConverter) },
+            { typeof(GridLength), typeof(GridLengthTypeConverter) },
+            { typeof(KeyGesture), typeof(KeyGestureConverter) },
+            { typeof(AvaloniaList<double>), typeof(AvaloniaListTypeConverter<double>) },
+            { typeof(IMemberSelector), typeof(MemberSelectorTypeConverter) },
+            { typeof(Point), typeof(PointTypeConverter) },
+            { typeof(IList<Point>), typeof(PointsListTypeConverter) },
             { typeof(AvaloniaProperty), typeof(AvaloniaPropertyTypeConverter) },
-            //{ typeof(RelativePoint), typeof(RelativePointTypeConverter) },
-            //{ typeof(RelativeRect), typeof(RelativeRectTypeConverter) },
-            //{ typeof(RowDefinitions), typeof(RowDefinitionsTypeConverter) },
-            //{ typeof(Size), typeof(SizeTypeConverter) },
+            { typeof(RelativePoint), typeof(RelativePointTypeConverter) },
+            { typeof(RelativeRect), typeof(RelativeRectTypeConverter) },
+            { typeof(RowDefinitions), typeof(RowDefinitionsTypeConverter) },
+            { typeof(Size), typeof(SizeTypeConverter) },
             { typeof(Selector), typeof(SelectorTypeConverter)},
             { typeof(SolidColorBrush), typeof(BrushTypeConverter) },
-            //{ typeof(Thickness), typeof(ThicknessTypeConverter) },
-            //{ typeof(TimeSpan), typeof(TimeSpanTypeConverter) },
+            { typeof(Thickness), typeof(ThicknessTypeConverter) },
+            { typeof(TimeSpan), typeof(TimeSpanTypeConverter) },
             //{ typeof(Uri), typeof(Converters.UriTypeConverter) },
-            //{ typeof(Cursor), typeof(CursorTypeConverter) },
-            //{ typeof(WindowIcon), typeof(IconTypeConverter) },
+            { typeof(Cursor), typeof(CursorTypeConverter) },
+            { typeof(WindowIcon), typeof(IconTypeConverter) },
             //{ typeof(FontWeight), typeof(FontWeightConverter) },
         };