| File: MarkupExtensions\StyleSheetExtension.cs | Web Access |
| Project: src\src\Controls\src\Xaml\Controls.Xaml.csproj (Microsoft.Maui.Controls.Xaml) |
using System; using System.IO; using System.Reflection; using System.Xml; using Microsoft.Maui.Controls.StyleSheets; namespace Microsoft.Maui.Controls.Xaml { [ContentProperty(nameof(Style))] [ProvideCompiled("Microsoft.Maui.Controls.XamlC.StyleSheetProvider")] [RequireService([typeof(IXmlLineInfoProvider), typeof(IRootObjectProvider)])] public sealed class StyleSheetExtension : IValueProvider { public string Style { get; set; } [System.ComponentModel.TypeConverter(typeof(UriTypeConverter))] public Uri Source { get; set; } object IValueProvider.ProvideValue(IServiceProvider serviceProvider) { IXmlLineInfo lineInfo; if (!string.IsNullOrEmpty(Style) && Source != null) throw new XamlParseException($"StyleSheet cannot have both a Source and a content", serviceProvider); if (Source != null) { lineInfo = (serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo; if (Source.IsAbsoluteUri) throw new XamlParseException($"Source only accepts Relative URIs", lineInfo); var rootObjectType = (serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider)?.RootObject.GetType(); if (rootObjectType == null) return null; var rootTargetPath = XamlResourceIdAttribute.GetPathForType(rootObjectType); var resourcePath = ResourceDictionary.RDSourceTypeConverter.GetResourcePath(Source, rootTargetPath); var assembly = rootObjectType.Assembly; return StyleSheet.FromResource(resourcePath, assembly, lineInfo); } if (!string.IsNullOrEmpty(Style)) { using (var reader = new StringReader(Style)) return StyleSheet.FromReader(reader); } throw new XamlParseException($"StyleSheet require either a Source or a content", serviceProvider); } } }