Ejemplo n.º 1
0
        internal override void ProcessXamlResource(XamlResourceInfo resource)
        {
            if (resource.IsDeferred)
            {
                return;
            }

            var resourceDictionary = resource.EnsureResourceDictionary();

            if (resourceDictionary == null)
            {
                return;
            }

            if (ProcessedResourceDictionaries.Contains(resourceDictionary))
            {
                return;
            }

            var skinResourceDictionary = resource.ResourceDictionary as ThemeSkinResourceDictionary;

            if (skinResourceDictionary != null)
            {
                ProcessSkinResourceDictionary(skinResourceDictionary);
            }
        }
Ejemplo n.º 2
0
 internal override bool ShouldProcessXamlResource(XamlResourceInfo resource)
 {
     return(base.ShouldProcessXamlResource(resource) || MasterTheme.ShouldProcessXamlResource(resource));
 }
Ejemplo n.º 3
0
 internal override void ProcessXamlResource(XamlResourceInfo resource)
 {
     SkinnedTheme.ProcessXamlResource(resource);
 }
Ejemplo n.º 4
0
 internal override bool IsThemeResource(XamlResourceInfo resource)
 {
     return(resource.ThemeType == GetType() || resource.ThemeType == BaseThemeCore?.GetType());
 }
Ejemplo n.º 5
0
        private void LoadThemeAssembly(Assembly assembly, List <XamlResourceInfo> newXamlResources)
        {
            if (assembly.HasAttribute <ThemeAssemblyAttribute>(false) == false)
            {
                return;
            }

            var resourceGroups = new List <ResourceGroup>();

            foreach (var themeAssemblyAttribute in assembly.GetAttributes <ThemeAssemblyAttribute>())
            {
                var resourcePath = themeAssemblyAttribute.Source;

                if (resourcePath.EndsWith(".zip", StringComparison.OrdinalIgnoreCase))
                {
#if !SILVERLIGHT
                    var stream = assembly.GetResourceStream(resourcePath);

                    using var archive = new ZipArchive(stream);

                    foreach (var entry in archive.Entries)
                    {
                        if (!entry.Name.EndsWith(".dll", StringComparison.OrdinalIgnoreCase))
                        {
                            continue;
                        }

                        using var entryStream = entry.Open();
                        using var ms          = new MemoryStream();

                        entryStream.CopyTo(ms);

                        var themeAssembly = Assembly.Load(ms.ToArray());

                        LoadThemeAssemblies(new[] { themeAssembly });
                    }
#endif
                }
                else
                {
                    var themeUri = ResourceDictionaryUtils.CreateAbsoluteUri(assembly.GetResourcePathUri(resourcePath));

                    resourceGroups.Add(new ResourceGroup(themeAssemblyAttribute.ThemeType, themeUri));
                }
            }

            foreach (var resourceUri in assembly.EnumerateEmbeddedResources().Select(assembly.GetResourceUri).Where(ResourceDictionaryUtils.IsXamlOrBamlResource))
            {
                var absoluteResourceUri = ResourceDictionaryUtils.CreateAbsoluteUri(resourceUri);

                foreach (var resourceGroup in resourceGroups)
                {
                    if (resourceGroup.BaseUri.IsBaseOf(absoluteResourceUri) == false)
                    {
                        continue;
                    }

                    resourceGroup.Resources.Add(resourceUri);

                    break;
                }
            }

            foreach (var resourceGroup in resourceGroups)
            {
                var deferredDictionary = new Dictionary <string, Uri>(StringComparer.OrdinalIgnoreCase);

                foreach (var uri in resourceGroup.Resources.WhereNot(ExcludeResource))
                {
                    if (IsDeferredResourceDictionary(uri))
                    {
                        deferredDictionary[GetNonDeferredUri(uri).OriginalString] = uri;
                    }
                }

                foreach (var uri in resourceGroup.Resources.WhereNot(ExcludeResource))
                {
                    if (IsDeferredResourceDictionary(uri))
                    {
                        continue;
                    }

                    var deferredUri = deferredDictionary.GetValueOrDefault(uri.OriginalString);

                    var deferredResourceDictionary = deferredUri != null?UpdateResourceDictionaryMetadata(ResourceDictionaryUtils.LoadResourceDictionary(deferredUri), deferredUri, true) : null;

                    var xamlResourceInfo = new XamlResourceInfo(assembly, resourceGroup.ThemeType, uri, CacheLoadResourceDictionary, deferredResourceDictionary);

                    newXamlResources.Add(xamlResourceInfo);
                    _xamlResources.Add(xamlResourceInfo);
                }
            }
        }