diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/BitmapTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/BitmapTypeConverter.cs index 583874bdd0..957ecfae23 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/BitmapTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/BitmapTypeConverter.cs @@ -3,12 +3,53 @@ using System; using System.Globalization; -using OmniXaml.TypeConversion; using Avalonia.Media.Imaging; using Avalonia.Platform; namespace Avalonia.Markup.Xaml.Converters { +#if !OMNIXAML + + using Portable.Xaml.ComponentModel; + + public class BitmapTypeConverter : TypeConverter + { + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + { + return sourceType == typeof(string); + } + + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + { + var uri = new Uri((string)value, UriKind.RelativeOrAbsolute); + var baseUri = GetBaseUri(context, value as string); + var scheme = uri.IsAbsoluteUri ? uri.Scheme : "file"; + + switch (scheme) + { + case "file": + return new Bitmap((string)value); + + default: + var assets = AvaloniaLocator.Current.GetService(); + return new Bitmap(assets.Open(uri, baseUri)); + } + } + + private Uri GetBaseUri(ITypeDescriptorContext context, string value) + { + return (Uri)TypeDescriptor.GetConverter(typeof(Uri)).ConvertFrom(value); + //TODO: + //object result; + //context.ParsingDictionary.TryGetValue("Uri", out result); + //return result as Uri; + } + } + +#else + + using OmniXaml.TypeConversion; + public class BitmapTypeConverter : ITypeConverter { public bool CanConvertFrom(IValueContext context, Type sourceType) @@ -31,6 +72,7 @@ namespace Avalonia.Markup.Xaml.Converters { case "file": return new Bitmap((string)value); + default: var assets = AvaloniaLocator.Current.GetService(); return new Bitmap(assets.Open(uri, baseUri)); @@ -49,4 +91,5 @@ namespace Avalonia.Markup.Xaml.Converters return result as Uri; } } +#endif } \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/UriTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/UriTypeConverter.cs index 64ae367397..523e928943 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/UriTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/UriTypeConverter.cs @@ -7,6 +7,7 @@ using OmniXaml.TypeConversion; namespace Avalonia.Markup.Xaml.Converters { +#if OMNIXAML public class UriTypeConverter : ITypeConverter { public bool CanConvertFrom(IValueContext context, Type sourceType) @@ -29,4 +30,5 @@ namespace Avalonia.Markup.Xaml.Converters throw new NotImplementedException(); } } +#endif } \ 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 e92b84b041..d135d0e4c4 100644 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaDefaultTypeConverters.cs +++ b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaDefaultTypeConverters.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Reflection; using Avalonia.Markup.Xaml.Converters; using Avalonia.Media; using Avalonia.Media.Imaging; using Avalonia.Styling; +using Portable.Xaml.ComponentModel; namespace Avalonia.Markup.Xaml.PortableXaml { @@ -12,6 +14,7 @@ namespace Avalonia.Markup.Xaml.PortableXaml { private static Dictionary _defaultConverters = new Dictionary() { + //avalonia default converters { typeof(IBitmap), typeof(BitmapTypeConverter)}, { typeof(IBrush), typeof(BrushTypeConverter) }, //{ typeof(Color), typeof(ColorTypeConverter) }, @@ -31,7 +34,7 @@ namespace Avalonia.Markup.Xaml.PortableXaml //{ typeof(RowDefinitions), typeof(RowDefinitionsTypeConverter) }, //{ typeof(Size), typeof(SizeTypeConverter) }, { typeof(Selector), typeof(SelectorTypeConverter)}, - //{ typeof(SolidColorBrush), typeof(BrushTypeConverter) }, + { typeof(SolidColorBrush), typeof(BrushTypeConverter) }, //{ typeof(Thickness), typeof(ThicknessTypeConverter) }, //{ typeof(TimeSpan), typeof(TimeSpanTypeConverter) }, //{ typeof(Uri), typeof(Converters.UriTypeConverter) }, @@ -44,26 +47,33 @@ namespace Avalonia.Markup.Xaml.PortableXaml { Type converterType; - Type curType = type; - - while (curType != null) + if (_defaultConverters.TryGetValue(type, out converterType)) { - if (_defaultConverters.TryGetValue(curType, out converterType)) - { - if (curType != type) - { - _defaultConverters[curType] = converterType; - } + return converterType; + } + + //TODO: probably a smarter way to handle types + //is it needed ?? + //Type curType = type; + + //while (curType != null) + //{ + // if (_defaultConverters.TryGetValue(curType, out converterType)) + // { + // if (curType != type) + // { + // _defaultConverters[curType] = converterType; + // } + // return converterType; + // } + // else + // { + // _defaultConverters[curType] = null; + // } + // curType = curType.GetTypeInfo().BaseType; + //} - return converterType; - } - else - { - _defaultConverters[curType] = null; - } - curType = curType.GetTypeInfo().BaseType; - } return null; }