Пример #1
0
        private void GenerateStyles(TUIElement styleResourceReferenceHolder, StyleSheet styleSheet, TUIElement startFrom, List <StyleMatchInfo> styleMatchInfos)
        {
            applicationResourcesService.EnsureResources();

            foreach (var styleMatchInfo in styleMatchInfos)
            {
                var matchedElementType = styleMatchInfo.MatchedType;

                var resourceKey = nativeStyleService.GetStyleResourceKey(matchedElementType, styleMatchInfo.Rule.SelectorString);

                if (applicationResourcesService.Contains(resourceKey))
                {
                    continue;
                }

                var propertyStyleValues = CreateStyleDictionaryFromDeclarationBlock(
                    styleSheet.Namespaces,
                    styleMatchInfo.Rule.DeclarationBlock,
                    matchedElementType,
                    startFrom ?? styleResourceReferenceHolder);

                if (propertyStyleValues.Keys.Count == 0)
                {
                    continue;
                }

                var style = nativeStyleService.CreateFrom(propertyStyleValues, matchedElementType);

                applicationResourcesService.SetResource(resourceKey, style);
            }
        }
Пример #2
0
        private void GenerateStyles(TUIElement styleResourceReferenceHolder, StyleSheet styleSheet, TUIElement startFrom, List <StyleMatchInfo> styleMatchInfos)
        {
            applicationResourcesService.EnsureResources();

            foreach (var styleMatchInfo in styleMatchInfos)
            {
                var matchedElementType = styleMatchInfo.MatchedType;

                var resourceKey = nativeStyleService.GetStyleResourceKey(styleSheet.Id, matchedElementType, styleMatchInfo.Rule.SelectorString);

                if (applicationResourcesService.Contains(resourceKey))
                {
                    continue;
                }

                CreateStyleDictionaryFromDeclarationBlockResult <TDependencyProperty> result = null;
                try
                {
                    result = CreateStyleDictionaryFromDeclarationBlock(
                        styleSheet.Namespaces,
                        styleMatchInfo.Rule.DeclarationBlock,
                        matchedElementType,
                        startFrom ?? styleResourceReferenceHolder);

                    var propertyStyleValues = result.PropertyStyleValues;

                    foreach (var error in result.Errors)
                    {
                        styleSheet.AddError($@"ERROR in Selector ""{styleMatchInfo.Rule.SelectorString}"": {error}");
                    }

                    var nativeTriggers = styleMatchInfo.Rule.DeclarationBlock.Triggers
                                         .Select(x => nativeStyleService.CreateTrigger(styleSheet, x, styleMatchInfo.MatchedType, styleResourceReferenceHolder));

                    if (propertyStyleValues.Keys.Count == 0)
                    {
                        continue;
                    }

                    var style = nativeStyleService.CreateFrom(propertyStyleValues, nativeTriggers, matchedElementType);

                    applicationResourcesService.SetResource(resourceKey, style);
                }
                catch (Exception e)
                {
                    styleSheet.AddError($@"ERROR in Selector ""{styleMatchInfo.Rule.SelectorString}"": {e.Message}");
                }
            }
        }
Пример #3
0
        private static void GenerateStyles(StyleSheet styleSheet,
                                           IDictionary <TDependencyObject, StyleUpdateInfo> styleMatchInfos,
                                           IStyleResourcesService applicationResourcesService,
                                           IDependencyPropertyService <TDependencyObject, TStyle, TDependencyProperty> dependencyPropertyService,
                                           INativeStyleService <TStyle, TDependencyObject, TDependencyProperty> nativeStyleService,
                                           CssTypeHelper <TDependencyObject, TDependencyProperty, TStyle> cssTypeHelper)
        {
            applicationResourcesService.EnsureResources();

            foreach (var styleMatchInfoKeyValue in styleMatchInfos)
            {
                var styleMatchInfo = styleMatchInfoKeyValue.Value;

                var matchedElementType = styleMatchInfo.MatchedType;

                for (var i = 0; i < styleMatchInfo.CurrentMatchedSelectors.Count; i++)
                {
                    var selector    = styleMatchInfo.CurrentMatchedSelectors.ElementAt(i);
                    var resourceKey = styleMatchInfo.CurrentMatchedResourceKeys.ElementAt(i);

                    if (applicationResourcesService.Contains(resourceKey))
                    {
                        // Debug.WriteLine($"GenerateStyles: Already contains '{s}' ({matchedElementType.Name})");
                        continue;
                    }

                    // Debug.WriteLine($"GenerateStyles: Generating '{s}' ({matchedElementType.Name})");

                    var rule = styleMatchInfo.CurrentStyleSheet.Rules.Where(x => x.SelectorString == selector.Value).First();

                    CreateStyleDictionaryFromDeclarationBlockResult <TDependencyProperty> result = null;
                    try
                    {
                        result = CreateStyleDictionaryFromDeclarationBlock(
                            styleSheet.Namespaces,
                            rule.DeclarationBlock,
                            matchedElementType,
                            (TDependencyObject)styleSheet.AttachedTo,
                            cssTypeHelper);

                        var propertyStyleValues = result.PropertyStyleValues;

                        foreach (var error in result.Errors)
                        {
                            // Debug.WriteLine($@" ERROR (normal) in Selector ""{rule.SelectorString}"": {error}");
                            styleSheet.AddError($@"ERROR in Selector ""{rule.SelectorString}"": {error}");
                        }

                        var nativeTriggers = rule.DeclarationBlock.Triggers
                                             .Select(x => nativeStyleService.CreateTrigger(styleSheet, x, styleMatchInfo.MatchedType, (TDependencyObject)styleSheet.AttachedTo))
                                             .ToList();

                        var initalStyle = dependencyPropertyService.GetInitialStyle(styleMatchInfoKeyValue.Key);
                        if (initalStyle != null)
                        {
                            var subDict = nativeStyleService.GetStyleAsDictionary(initalStyle as TStyle);

                            foreach (var item in subDict)
                            {
                                // only set not-overridden properties
                                if (!propertyStyleValues.ContainsKey(item.Key))
                                {
                                    propertyStyleValues[item.Key] = item.Value;
                                }
                            }

                            var triggers = nativeStyleService.GetTriggersAsList(initalStyle as TStyle);
                            nativeTriggers.InsertRange(0, triggers);
                        }
                        //Debug.WriteLine("    Values: " + string.Join(", ", propertyStyleValues.Select(x => ((dynamic)x.Key).PropertyName + ": " + x.Value.ToString())));
                        var style = nativeStyleService.CreateFrom(propertyStyleValues, nativeTriggers, matchedElementType);

                        applicationResourcesService.SetResource(resourceKey, style);

                        // Debug.WriteLine("Finished generate Style " + resourceKey);
                    }
                    catch (Exception e)
                    {
                        // Debug.WriteLine($@" ERROR (exception) in Selector ""{rule.SelectorString}"": {e.Message}");
                        styleSheet.AddError($@"ERROR in Selector ""{rule.SelectorString}"": {e.Message}");
                    }
                }
            }
        }
Пример #4
0
        private static void ApplyMatchingStylesNode(IDomElement <TDependencyObject, TDependencyProperty> domElement,
                                                    IStyleResourcesService applicationResourcesService,
                                                    INativeStyleService <TStyle, TDependencyObject, TDependencyProperty> nativeStyleService)
        {
            var visualElement = domElement.Element;

            var matchingStyles        = domElement.StyleInfo.CurrentMatchedSelectors;
            var appliedMatchingStyles = domElement.StyleInfo.OldMatchedSelectors;
            var matchingResourceKeys  = domElement.StyleInfo.CurrentMatchedResourceKeys;

            if (!AppliedStyleIdsAreMatchedStyleIds(appliedMatchingStyles, matchingStyles))
            {
                object styleToApply = null;

                if (matchingResourceKeys == null)
                {
                    // RemoveOutdatedStylesFromElementInternal(visualElement, styleSheet, true, true);
                }
                else if (matchingResourceKeys.Count == 1)
                {
                    if (applicationResourcesService.Contains(matchingResourceKeys.First()) == true)
                    {
                        styleToApply = applicationResourcesService.GetResource(matchingResourceKeys.First());
                    }

                    if (styleToApply != null)
                    {
                        nativeStyleService.SetStyle(visualElement, (TStyle)styleToApply);
                    }
                    else
                    {
                        nativeStyleService.SetStyle(visualElement, null);
                        // Debug.WriteLine("    Style not found! " + matchingResourceKeys[0]);
                    }
                }
                else if (matchingResourceKeys.Count > 1)
                {
                    var resourceKey = string.Join(", ", matchingResourceKeys);
                    if (applicationResourcesService.Contains(resourceKey))
                    {
                        nativeStyleService.SetStyle(visualElement, (TStyle)applicationResourcesService.GetResource(resourceKey));
                    }
                    else
                    {
                        var dict         = new Dictionary <TDependencyProperty, object>();
                        var listTriggers = new List <TDependencyObject>();

                        foreach (var matchingResourceKey in matchingResourceKeys)
                        {
                            TStyle s = null;
                            if (applicationResourcesService.Contains(matchingResourceKey) == true)
                            {
                                s = (TStyle)applicationResourcesService.GetResource(matchingResourceKey);
                            }
                            else
                            {
                                // Debug.WriteLine("    Style not found! " + matchingStyle);
                            }

                            if (s != null)
                            {
                                var subDict = nativeStyleService.GetStyleAsDictionary(s as TStyle);

                                foreach (var i in subDict)
                                {
                                    dict[i.Key] = i.Value;
                                }

                                var triggers = nativeStyleService.GetTriggersAsList(s as TStyle);
                                listTriggers.AddRange(triggers);
                            }
                        }

                        if (dict.Keys.Count > 0 ||
                            listTriggers.Count > 0)
                        {
                            styleToApply = nativeStyleService.CreateFrom(dict, listTriggers, visualElement.GetType());
                        }

                        if (styleToApply != null)
                        {
                            applicationResourcesService.SetResource(resourceKey, styleToApply);
                            nativeStyleService.SetStyle(visualElement, (TStyle)styleToApply);
                        }
                        else
                        {
                            nativeStyleService.SetStyle(visualElement, null);
                        }
                    }
                }

                domElement.StyleInfo.OldMatchedSelectors = matchingStyles.ToLinkedHashSet();
            }
        }
Пример #5
0
        private static void ApplyMatchingStylesNode(IDomElement <TDependencyObject, TDependencyProperty> domElement,
                                                    IStyleResourcesService applicationResourcesService,
                                                    INativeStyleService <TStyle, TDependencyObject, TDependencyProperty> nativeStyleService)
        {
            var visualElement = domElement.Element;

            var matchingStyles        = domElement.StyleInfo.CurrentMatchedSelectors;
            var appliedMatchingStyles = domElement.StyleInfo.OldMatchedSelectors;
            var matchingResourceKeys  = domElement.StyleInfo.CurrentMatchedResourceKeys;

            if (!AppliedStyleIdsAreMatchedStyleIds(appliedMatchingStyles, matchingStyles))
            {
                object styleToApply = null;

                if (matchingResourceKeys == null)
                {
                }
                else if (matchingResourceKeys.Count == 1)
                {
                    if (applicationResourcesService.Contains(matchingResourceKeys.First()) == true)
                    {
                        styleToApply = applicationResourcesService.GetResource(matchingResourceKeys.First());
                    }

                    try
                    {
                        if (styleToApply != null)
                        {
                            nativeStyleService.SetStyle(visualElement, (TStyle)styleToApply);
                            domElement.StyleInfo.OldMatchedSelectors = matchingStyles.ToList();
                        }
                        else
                        {
                            nativeStyleService.SetStyle(visualElement, null);
                            domElement.StyleInfo.OldMatchedSelectors = emptySelectorList;
                            // Debug.WriteLine("    Style not found! " + matchingResourceKeys[0]);
                        }
                    }
                    catch (Exception exc)
                    {
                        applicationResourcesService.RemoveResource(matchingResourceKeys.First());
                        domElement.StyleInfo.OldMatchedSelectors = emptySelectorList;
                        domElement.XamlCssStyleSheets.First().AddError($"Cannot apply style to an element matching {string.Join(", ", matchingStyles.Select(x => x.Value))}: {exc.Message}");
                        nativeStyleService.SetStyle(visualElement, null);
                        return;
                    }
                }
                else if (matchingResourceKeys.Count > 1)
                {
                    var resourceKey = string.Join(", ", matchingResourceKeys);
                    if (applicationResourcesService.Contains(resourceKey))
                    {
                        try
                        {
                            nativeStyleService.SetStyle(visualElement, (TStyle)applicationResourcesService.GetResource(resourceKey));
                            domElement.StyleInfo.OldMatchedSelectors = matchingStyles.ToList();
                        }
                        catch (Exception exc)
                        {
                            applicationResourcesService.RemoveResource(resourceKey);
                            domElement.StyleInfo.OldMatchedSelectors = emptySelectorList;
                            domElement.XamlCssStyleSheets.First().AddError($"Cannot apply style to an element matching {string.Join(", ", matchingStyles.Select(x => x.Value))}: {exc.Message}");
                            nativeStyleService.SetStyle(visualElement, null);
                            return;
                        }
                    }
                    else
                    {
                        var dict         = new Dictionary <TDependencyProperty, object>();
                        var listTriggers = new List <TDependencyObject>();

                        foreach (var matchingResourceKey in matchingResourceKeys)
                        {
                            TStyle s = null;
                            if (applicationResourcesService.Contains(matchingResourceKey) == true)
                            {
                                s = (TStyle)applicationResourcesService.GetResource(matchingResourceKey);
                            }
                            else
                            {
                                // Debug.WriteLine("    Style not found! " + matchingStyle);
                            }

                            if (s != null)
                            {
                                var subDict = nativeStyleService.GetStyleAsDictionary(s as TStyle);

                                foreach (var i in subDict)
                                {
                                    dict[i.Key] = i.Value;
                                }

                                var triggers = nativeStyleService.GetTriggersAsList(s as TStyle);
                                listTriggers.AddRange(triggers);
                            }
                        }

                        if (dict.Keys.Count > 0 ||
                            listTriggers.Count > 0)
                        {
                            styleToApply = nativeStyleService.CreateFrom(dict, listTriggers, visualElement.GetType());
                        }

                        try
                        {
                            if (styleToApply != null)
                            {
                                nativeStyleService.SetStyle(visualElement, (TStyle)styleToApply);
                                applicationResourcesService.SetResource(resourceKey, styleToApply);
                            }
                            else
                            {
                                nativeStyleService.SetStyle(visualElement, null);
                            }
                            domElement.StyleInfo.OldMatchedSelectors = matchingStyles.ToList();
                        }
                        catch (Exception exc)
                        {
                            applicationResourcesService.RemoveResource(resourceKey);
                            domElement.StyleInfo.OldMatchedSelectors = emptySelectorList;
                            nativeStyleService.SetStyle(visualElement, null);
                            domElement.XamlCssStyleSheets.First().AddError($"Cannot apply style to an element matching {string.Join(", ", matchingStyles.Select(x => x.Value))}: {exc.Message}");
                            return;
                        }
                    }
                }
                else
                {
                    domElement.StyleInfo.OldMatchedSelectors = matchingStyles.ToList();
                }
            }
        }
Пример #6
0
        private static void GenerateStyles(StyleSheet styleSheet,
                                           IDictionary <TDependencyObject, StyleUpdateInfo> styleMatchInfos,
                                           IStyleResourcesService applicationResourcesService,
                                           IDependencyPropertyService <TDependencyObject, TStyle, TDependencyProperty> dependencyPropertyService,
                                           INativeStyleService <TStyle, TDependencyObject, TDependencyProperty> nativeStyleService,
                                           CssTypeHelper <TDependencyObject, TDependencyProperty, TStyle> cssTypeHelper)
        {
            applicationResourcesService.EnsureResources();

            foreach (var styleMatchInfoKeyValue in styleMatchInfos)
            {
                var styleMatchInfo = styleMatchInfoKeyValue.Value;

                var matchedElementType = styleMatchInfo.MatchedType;

                foreach (var resourceKey in styleMatchInfo.CurrentMatchedSelectors)
                {
                    if (applicationResourcesService.Contains(resourceKey))
                    {
                        continue;
                    }

                    var s = resourceKey.Split('{')[1];

                    var rule = styleMatchInfo.CurrentStyleSheet.Rules.Where(x => x.SelectorString == s).First();
                    // // Debug.WriteLine("Generate Style " + resourceKey);

                    CreateStyleDictionaryFromDeclarationBlockResult <TDependencyProperty> result = null;
                    try
                    {
                        result = "CreateStyleDictionaryFromDeclarationBlock".Measure(() => CreateStyleDictionaryFromDeclarationBlock(
                                                                                         styleSheet.Namespaces,
                                                                                         rule.DeclarationBlock,
                                                                                         matchedElementType,
                                                                                         (TDependencyObject)styleSheet.AttachedTo,
                                                                                         cssTypeHelper));

                        var propertyStyleValues = result.PropertyStyleValues;

                        foreach (var error in result.Errors)
                        {
                            Debug.WriteLine($@" ERROR (normal) in Selector ""{rule.SelectorString}"": {error}");
                            styleSheet.AddError($@"ERROR in Selector ""{rule.SelectorString}"": {error}");
                        }

                        var nativeTriggers = $"CreateTriggers ({rule.DeclarationBlock.Triggers.Count})".Measure(() => rule.DeclarationBlock.Triggers
                                                                                                                .Select(x => nativeStyleService.CreateTrigger(styleSheet, x, styleMatchInfo.MatchedType, (TDependencyObject)styleSheet.AttachedTo))
                                                                                                                .ToList());


                        var initalStyle = dependencyPropertyService.GetInitialStyle(styleMatchInfoKeyValue.Key);
                        if (initalStyle != null)
                        {
                            var subDict = nativeStyleService.GetStyleAsDictionary(initalStyle as TStyle);

                            foreach (var i in subDict)
                            {
                                propertyStyleValues[i.Key] = i.Value;
                            }

                            var triggers = nativeStyleService.GetTriggersAsList(initalStyle as TStyle);
                            nativeTriggers.AddRange(triggers);
                        }

                        foreach (var item in propertyStyleValues)
                        {
                            if (item.Value == null)
                            {
                            }
                        }

                        var style = "Create Style".Measure(() => nativeStyleService.CreateFrom(propertyStyleValues, nativeTriggers, matchedElementType));

                        applicationResourcesService.SetResource(resourceKey, style);

                        // // Debug.WriteLine("Finished generate Style " + resourceKey);
                    }
                    catch (Exception e)
                    {
                        Debug.WriteLine($@" ERROR (exception) in Selector ""{rule.SelectorString}"": {e.Message}");
                        styleSheet.AddError($@"ERROR in Selector ""{rule.SelectorString}"": {e.Message}");
                    }
                }
            }
        }
Пример #7
0
        private static void ApplyMatchingStyles(IDomElement <TDependencyObject> domElement, StyleSheet styleSheet,
                                                IStyleResourcesService applicationResourcesService,
                                                INativeStyleService <TStyle, TDependencyObject, TDependencyProperty> nativeStyleService)
        {
            var visualElement = domElement.Element;

            if (domElement.StyleInfo == null)
            {
                throw new Exception($"StyleInfo null {domElement.GetType().Name.Replace("DomElement", "")} {domElement.GetPath()}");
            }

            var matchingStyles        = domElement.StyleInfo.CurrentMatchedSelectors;
            var appliedMatchingStyles = domElement.StyleInfo.OldMatchedSelectors;

            var styledBy = domElement.StyleInfo.CurrentStyleSheet;

            if (styledBy != null &&
                styledBy != styleSheet)
            {
                // Debug.WriteLine("    Another Stylesheet");
                return;
            }

            domElement.StyleInfo.CurrentStyleSheet = styleSheet;

            if (!AppliedStyleIdsAreMatchedStyleIds(appliedMatchingStyles, matchingStyles))
            {
                object styleToApply = null;

                if (matchingStyles == null)
                {
                    // RemoveOutdatedStylesFromElementInternal(visualElement, styleSheet, true, true);
                }
                else if (matchingStyles?.Count == 1)
                {
                    if (applicationResourcesService.Contains(matchingStyles[0]) == true)
                    {
                        styleToApply = applicationResourcesService.GetResource(matchingStyles[0]);
                    }

                    if (styleToApply != null)
                    {
                        nativeStyleService.SetStyle(visualElement, (TStyle)styleToApply);
                    }
                    else
                    {
                        nativeStyleService.SetStyle(visualElement, null);
                        // Debug.WriteLine("    Style not found! " + matchingStyles[0]);
                    }
                }
                else if (matchingStyles?.Count > 1)
                {
                    var dict         = new Dictionary <TDependencyProperty, object>();
                    var listTriggers = new List <TDependencyObject>();

                    foreach (var matchingStyle in matchingStyles)
                    {
                        TStyle s = null;
                        if (applicationResourcesService.Contains(matchingStyle) == true)
                        {
                            s = (TStyle)applicationResourcesService.GetResource(matchingStyle);
                        }
                        else
                        {
                            // Debug.WriteLine("    Style not found! " + matchingStyle);
                        }

                        if (s != null)
                        {
                            var subDict = nativeStyleService.GetStyleAsDictionary(s as TStyle);

                            foreach (var i in subDict)
                            {
                                dict[i.Key] = i.Value;
                            }

                            var triggers = nativeStyleService.GetTriggersAsList(s as TStyle);
                            listTriggers.AddRange(triggers);
                        }
                    }

                    if (dict.Keys.Count > 0 ||
                        listTriggers.Count > 0)
                    {
                        styleToApply = nativeStyleService.CreateFrom(dict, listTriggers, visualElement.GetType());
                    }

                    if (styleToApply != null)
                    {
                        nativeStyleService.SetStyle(visualElement, (TStyle)styleToApply);
                    }
                    else
                    {
                        nativeStyleService.SetStyle(visualElement, null);
                    }
                }

                domElement.StyleInfo.OldMatchedSelectors = matchingStyles.ToList();
            }

            foreach (var child in domElement.ChildNodes)
            {
                ApplyMatchingStyles(child, styleSheet, applicationResourcesService, nativeStyleService);
            }
        }