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"); }
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); }
public static IEnumerable <Uri> EnumerateReferencedDictionaries(this ResourceDictionary resourceDictionary, Uri baseUri) { return(ResourceDictionaryUtils.EnumerateReferencedDictionaries(resourceDictionary, baseUri)); }
public static IEnumerable <ResourceDictionary> EnumerateDictionaries(this ResourceDictionary resourceDictionary) { return(ResourceDictionaryUtils.EnumerateDictionaries(resourceDictionary)); }
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); } } }
public Uri GetSource(ResourceDictionary resourceDictionary) { var uri = _dictionaryUriCache.GetValueOrDefault(resourceDictionary); return(uri != null?ResourceDictionaryUtils.RebuildBamlUri(uri) : null); }