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); } }