Beispiel #1
0
        private static Uri GetNonDeferredUri(Uri uri)
        {
            if (ResourceDictionaryUtils.IsXamlResource(uri))
            {
                return(new Uri(uri.OriginalString.RemoveFromEnd(".deferred.xaml") + ".xaml", UriKind.RelativeOrAbsolute));
            }

            if (ResourceDictionaryUtils.IsBamlResource(uri))
            {
                return(new Uri(uri.OriginalString.RemoveFromEnd(".deferred.baml") + ".baml", UriKind.RelativeOrAbsolute));
            }

            throw new InvalidOperationException("Non Xaml or Baml resource");
        }
Beispiel #2
0
        private ResourceDictionary CacheLoadResourceDictionary(Uri uri)
        {
            var resourceDictionary = _dictionaryCache.GetValueOrDefault(uri.OriginalString);

            if (resourceDictionary != null)
            {
                return(resourceDictionary);
            }

            resourceDictionary = ResourceDictionaryUtils.LoadResourceDictionary(uri);

            if (resourceDictionary == null)
            {
                return(null);
            }

            if (resourceDictionary is ResourceDictionaryBase resourceDictionaryBase)
            {
                resourceDictionaryBase.LoadUri = uri;
            }

            try
            {
                ResourceDictionaryTreeAdvisor.Instance.Visit(resourceDictionary, (dictionary, enumerator) =>
                {
                    var parent     = enumerator.Enumerate().FirstOrDefault();
                    var currentUri = uri;

                    if (parent != null && dictionary.Source != null)
                    {
                        currentUri = ResourceDictionaryUtils.CreateRelativeUri(_dictionaryUriCache[parent], dictionary);
                    }

                    CacheResourceDictionary(dictionary, currentUri);
                });
            }
            catch (Exception e)
            {
                LogService.LogError(e);
            }

            return(resourceDictionary);
        }
Beispiel #3
0
 public static IEnumerable <Uri> EnumerateReferencedDictionaries(this ResourceDictionary resourceDictionary, Uri baseUri)
 {
     return(ResourceDictionaryUtils.EnumerateReferencedDictionaries(resourceDictionary, baseUri));
 }
Beispiel #4
0
 public static IEnumerable <ResourceDictionary> EnumerateDictionaries(this ResourceDictionary resourceDictionary)
 {
     return(ResourceDictionaryUtils.EnumerateDictionaries(resourceDictionary));
 }
Beispiel #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);
                }
            }
        }
Beispiel #6
0
        public Uri GetSource(ResourceDictionary resourceDictionary)
        {
            var uri = _dictionaryUriCache.GetValueOrDefault(resourceDictionary);

            return(uri != null?ResourceDictionaryUtils.RebuildBamlUri(uri) : null);
        }