3 using Tizen.NUI.StyleSheets;
4 using System.Reflection;
6 using Tizen.NUI.Binding;
7 using System.ComponentModel;
9 namespace Tizen.NUI.Xaml
11 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
12 [EditorBrowsable(EditorBrowsableState.Never)]
13 [ContentProperty(nameof(Style))]
14 [ProvideCompiled("Tizen.NUI.Core.XamlC.StyleSheetProvider")]
15 public sealed class StyleSheetExtension : IValueProvider
17 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
18 [EditorBrowsable(EditorBrowsableState.Never)]
19 public string Style { get; set; }
21 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
22 [EditorBrowsable(EditorBrowsableState.Never)]
23 public Uri Source { get; set; }
25 object IValueProvider.ProvideValue(IServiceProvider serviceProvider)
27 IXmlLineInfo lineInfo;
29 if (!string.IsNullOrEmpty(Style) && Source != null)
31 lineInfo = (serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo;
32 throw new XamlParseException($"StyleSheet can not have both a Source and a content", lineInfo);
37 lineInfo = (serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo;
38 if (Source.IsAbsoluteUri)
39 throw new XamlParseException($"Source only accepts Relative URIs", lineInfo);
41 var rootObjectType = (serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider)?.RootObject.GetType();
42 if (rootObjectType == null)
44 var rootTargetPath = XamlResourceIdAttribute.GetPathForType(rootObjectType);
45 var resourcePath = ResourceDictionary.RDSourceTypeConverter.GetResourcePath(Source, rootTargetPath);
46 var resString = DependencyService.Get<IResourcesLoader>()?.GetResource(resourcePath, rootObjectType.GetTypeInfo().Assembly, lineInfo);
47 return StyleSheet.FromString(resString);
50 if (!string.IsNullOrEmpty(Style))
52 using (var reader = new StringReader(Style))
53 return StyleSheet.FromReader(reader);
56 lineInfo = (serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo;
57 throw new XamlParseException($"StyleSheet require either a Source or a content", lineInfo);