diff --git a/.gitmodules b/.gitmodules index 057007f213..daef52a069 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,3 +8,6 @@ [submodule "src/Markup/Perspex.Markup.Xaml/OmniXAML"] path = src/Markup/Perspex.Markup.Xaml/OmniXAML url = https://github.com/Perspex/OmniXAML.git +[submodule "src/Markup/Perspex.Markup.Xaml/glass"] + path = src/Markup/Perspex.Markup.Xaml/glass + url = https://github.com/SuperJMN/glass diff --git a/Perspex.sln b/Perspex.sln index 62c59b8aed..c081e1ed22 100644 --- a/Perspex.sln +++ b/Perspex.sln @@ -60,9 +60,6 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Perspex.Markup.Xaml", "src\Markup\Perspex.Markup.Xaml\Perspex.Markup.Xaml.csproj", "{3E53A01A-B331-47F3-B828-4A5717E77A24}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{9B9E3891-2366-4253-A952-D08BCEB71098}" - ProjectSection(SolutionItems) = preProject - samples\ControlCatalog\ControlCatalog.csproj = samples\ControlCatalog\ControlCatalog.csproj - EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApplication", "samples\TestApplication\TestApplication.csproj", "{E3A1060B-50D0-44E8-88B6-F44EF2E5BD72}" ProjectSection(ProjectDependencies) = postProject diff --git a/samples/ControlCatalog.Desktop/Program.cs b/samples/ControlCatalog.Desktop/Program.cs index 3fa5d32ae3..3a6f466b9e 100644 --- a/samples/ControlCatalog.Desktop/Program.cs +++ b/samples/ControlCatalog.Desktop/Program.cs @@ -6,24 +6,6 @@ using Perspex; using System.Reflection; using Perspex.Platform; - -// Not sure where the best home for this is -namespace Perspex -{ - public static class SharedApplicationExtensions - { - // For true Portable apps we need to select the PCL assembly NOT the host platform exe. Unfortunately - // Win32 subsystem registers one by default (the wrong one) and so this can override that. - // - public static AppT UseAssetAssembly(this AppT app, Assembly assembly) where AppT : Application - { - // Asset loading searches our own assembly? - PerspexLocator.CurrentMutable.GetService().SetDefaultAssembly(assembly); - return app; - } - } -} - namespace ControlCatalog { internal class Program @@ -34,7 +16,6 @@ namespace ControlCatalog new App() .ConfigureRenderSystem(args) - .UseAssetAssembly(typeof(App).Assembly) .LoadFromXaml() .RunWithMainWindow(); } diff --git a/src/Markup/Perspex.Markup.Xaml/Context/PerspexObjectAssembler.cs b/src/Markup/Perspex.Markup.Xaml/Context/PerspexObjectAssembler.cs index d8f40b3fe4..7e4320be93 100644 --- a/src/Markup/Perspex.Markup.Xaml/Context/PerspexObjectAssembler.cs +++ b/src/Markup/Perspex.Markup.Xaml/Context/PerspexObjectAssembler.cs @@ -7,6 +7,8 @@ using OmniXaml.ObjectAssembler; using OmniXaml.ObjectAssembler.Commands; using OmniXaml.TypeConversion; using Perspex.Markup.Xaml.Templates; +using System.Collections.Generic; +using System.Collections.ObjectModel; namespace Perspex.Markup.Xaml.Context { @@ -27,7 +29,8 @@ namespace Perspex.Markup.Xaml.Context mapping.Map(x => x.Content, new TemplateLoader()); mapping.Map(x => x.Content, new TemplateLoader()); - var valueContext = new ValueContext(typeSource, topDownValueContext); + var parsingDictionary = GetDictionary(settings); + var valueContext = new ValueContext(typeSource, topDownValueContext, parsingDictionary); assembler = new ObjectAssembler(typeSource, valueContext, settings); objectAssembler = new TemplateHostingObjectAssembler(assembler, mapping); } @@ -55,5 +58,21 @@ namespace Perspex.Markup.Xaml.Context { objectAssembler.OverrideInstance(instance); } + + private static IReadOnlyDictionary GetDictionary(Settings settings) + { + IReadOnlyDictionary dict; + + if (settings != null) + { + dict = settings.ParsingContext; + } + else + { + dict = new ReadOnlyDictionary(new Dictionary()); + } + + return dict; + } } } \ No newline at end of file diff --git a/src/Markup/Perspex.Markup.Xaml/Converters/BitmapTypeConverter.cs b/src/Markup/Perspex.Markup.Xaml/Converters/BitmapTypeConverter.cs index 3f908aa2ce..9fb58c2a73 100644 --- a/src/Markup/Perspex.Markup.Xaml/Converters/BitmapTypeConverter.cs +++ b/src/Markup/Perspex.Markup.Xaml/Converters/BitmapTypeConverter.cs @@ -24,6 +24,7 @@ namespace Perspex.Markup.Xaml.Converters public object ConvertFrom(IValueContext context, CultureInfo culture, object value) { var uri = new Uri((string)value, UriKind.RelativeOrAbsolute); + var baseUri = GetBaseUri(context); var scheme = uri.IsAbsoluteUri ? uri.Scheme : "file"; switch (scheme) @@ -32,7 +33,7 @@ namespace Perspex.Markup.Xaml.Converters return new Bitmap((string)value); default: var assets = PerspexLocator.Current.GetService(); - return new Bitmap(assets.Open(uri)); + return new Bitmap(assets.Open(uri, baseUri)); } } @@ -40,5 +41,12 @@ namespace Perspex.Markup.Xaml.Converters { throw new NotImplementedException(); } + + private Uri GetBaseUri(IValueContext context) + { + object result; + context.ParsingDictionary.TryGetValue("Uri", out result); + return result as Uri; + } } } \ No newline at end of file diff --git a/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/StaticExtension.cs b/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/StaticExtension.cs index 11b0296d1e..ff01f8a461 100644 --- a/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/StaticExtension.cs +++ b/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/StaticExtension.cs @@ -24,7 +24,7 @@ namespace Perspex.Markup.Xaml.MarkupExtensions public override object ProvideValue(MarkupExtensionContext markupExtensionContext) { - var typeRepository = markupExtensionContext.TypeRepository; + var typeRepository = markupExtensionContext.ValueContext.TypeRepository; var typeAndMember = GetTypeAndMember(Identifier); var prefixAndType = GetPrefixAndType(typeAndMember.Item1); var xamlType = typeRepository.GetByPrefix(prefixAndType.Item1, prefixAndType.Item2); diff --git a/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/TypeExtension.cs b/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/TypeExtension.cs index 83d951fece..65373e55cb 100644 --- a/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/TypeExtension.cs +++ b/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/TypeExtension.cs @@ -43,7 +43,7 @@ namespace Perspex.Markup.Xaml.MarkupExtensions return Type; } - return ResolveFromString(TypeName, markupExtensionContext.TypeRepository); + return ResolveFromString(TypeName, markupExtensionContext.ValueContext.TypeRepository); } } } \ No newline at end of file diff --git a/src/Markup/Perspex.Markup.Xaml/OmniXAML b/src/Markup/Perspex.Markup.Xaml/OmniXAML index 75e0dc32fe..b122549406 160000 --- a/src/Markup/Perspex.Markup.Xaml/OmniXAML +++ b/src/Markup/Perspex.Markup.Xaml/OmniXAML @@ -1 +1 @@ -Subproject commit 75e0dc32fe9a6d97f5b59d2b7d689db2475f444f +Subproject commit b122549406107170bbe6e67c0d6a1a4252beef77 diff --git a/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj b/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj index 0d694d2841..a1567c3862 100644 --- a/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj +++ b/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj @@ -82,22 +82,22 @@ + + + + + + + + + + - - - - - - - - - - @@ -276,6 +276,7 @@ + @@ -317,6 +318,10 @@ + + ..\..\..\packages\Glass.1.6.0.113\lib\portable45-net45+win8\Glass.dll + True + ..\..\..\packages\Sprache.2.0.0.50\lib\portable-net4+netcore45+win8+wp8+sl5+MonoAndroid+Xamarin.iOS10+MonoTouch\Sprache.dll True @@ -334,6 +339,9 @@ ..\..\..\packages\Rx-PlatformServices.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.PlatformServices.dll + + +