File: ResourceDictionaryHelpers.cs
Web Access
Project: src\src\Controls\src\Xaml\Controls.Xaml.csproj (Microsoft.Maui.Controls.Xaml)
using System;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Xml;
 
namespace Microsoft.Maui.Controls.Xaml
{
	[EditorBrowsable(EditorBrowsableState.Never)]
	[RequiresUnreferencedCode(TrimmerConstants.XamlRuntimeParsingNotSupportedWarning)]
#if !NETSTANDARD
	[RequiresDynamicCode(TrimmerConstants.XamlRuntimeParsingNotSupportedWarning)]
#endif
	public static class ResourceDictionaryHelpers
	{
		// Called from XamlC generated code when the ResourceDictionary is not compiled
		[EditorBrowsable(EditorBrowsableState.Never)]
		public static void LoadFromSource(ResourceDictionary rd, Uri source, string resourcePath, Assembly assembly, IXmlLineInfo lineInfo)
		{
			var sourceInstance = CreateFromResource(resourcePath, assembly, lineInfo);
			rd.SetSource(source, sourceInstance);
		}
 
		// Called from XamlParser
		internal static void LoadFromSource(ResourceDictionary rd, string value, Type rootType, IXmlLineInfo lineInfo)
		{
			(value, var assembly) = ResourceDictionary.RDSourceTypeConverter.SplitUriAndAssembly(value, rootType.Assembly);
 
			var rootTargetPath = XamlResourceIdAttribute.GetPathForType(rootType);
			var resourcePath = ResourceDictionary.RDSourceTypeConverter.GetResourcePath(new Uri(value, UriKind.Relative), rootTargetPath);
			var sourceUri = ResourceDictionary.RDSourceTypeConverter.CombineUriAndAssembly(value, assembly);
 
			SetAndLoadSource(rd, sourceUri, resourcePath, assembly, lineInfo);
		}
 
		// Called from Hot Reload
		internal static void SetAndLoadSource(ResourceDictionary rd, Uri value, string resourcePath, Assembly assembly, IXmlLineInfo lineInfo)
		{
			var type = XamlResourceIdAttribute.GetTypeForPath(assembly, resourcePath);
			var sourceInstance = type is not null
				? ResourceDictionary.GetOrCreateInstance(type)
				: CreateFromResource(resourcePath, assembly, lineInfo);
 
			rd.SetSource(value, sourceInstance);
		}
 
		static ResourceDictionary CreateFromResource(string resourcePath, Assembly assembly, IXmlLineInfo lineInfo)
		{
			var rd = new ResourceDictionary();
 
			var resourceLoadingResponse = Maui.Controls.Internals.ResourceLoader.ResourceProvider2?.Invoke(new Maui.Controls.Internals.ResourceLoader.ResourceLoadingQuery
			{
				AssemblyName = assembly.GetName(),
				ResourcePath = resourcePath,
				Instance = rd,
			});
 
			var alternateResource = resourceLoadingResponse?.ResourceContent;
			if (alternateResource != null)
			{
				XamlLoader.Load(rd, alternateResource, resourceLoadingResponse.UseDesignProperties);
				return rd;
			}
 
			var resourceId = XamlResourceIdAttribute.GetResourceIdForPath(assembly, resourcePath);
			if (resourceId == null)
				throw new XamlParseException($"Resource '{resourcePath}' not found.", lineInfo);
 
			using (var stream = assembly.GetManifestResourceStream(resourceId))
			{
				if (stream == null)
					throw new XamlParseException($"No resource found for '{resourceId}'.", lineInfo);
				using (var reader = new StreamReader(stream))
				{
					rd.LoadFromXaml(reader.ReadToEnd(), assembly);
					return rd;
				}
			}
		}
	}
 
#if !NETSTANDARD
	internal static class ResourceDictionaryHotReloadHelper
	{
#pragma warning disable CA2255 // The 'ModuleInitializer' attribute should not be used in libraries
		[ModuleInitializer]
#pragma warning restore CA2255
		internal static void Init()
		{
			// This code will be trimmed in production builds
			if (HotReload.MauiHotReloadHelper.IsSupported)
			{
#pragma warning disable IL2026, IL3050
				ResourceDictionary.s_setAndLoadSource = ResourceDictionaryHelpers.SetAndLoadSource;
#pragma warning restore IL2026, IL3050
			}
		}
	}
#endif
}