public override IEnumerable <DependencyObject> GetTriggersAsList(Style style) { return(style.Triggers.Select(x => { var serialized = Css.GetSerializedTrigger(x); if (serialized == null) { //serialized = "XamlWriter.Save(x)".Measure(() => XamlWriter.Save(x)); serialized = SerializeObject(x); } //if (x is System.Windows.DataTrigger d) //{ // var dt = new System.Windows.DataTrigger() // { // Binding = d.Binding, // Value = d.Value // }; // d.EnterActions.ToList().ForEach(y => dt.EnterActions.Add(y)); // d.ExitActions.ToList().ForEach(y => dt.ExitActions.Add(y)); // d.Setters.ToList().ForEach(y => dt.Setters.Add(y)); // return dt; //} //if (x is System.Windows.Trigger t) //{ // var tt = new System.Windows.Trigger() // { // Property = t.Property, // SourceName = t.SourceName, // Value = t.Value // }; // t.EnterActions.ToList().ForEach(y => tt.EnterActions.Add(y)); // t.ExitActions.ToList().ForEach(y => tt.ExitActions.Add(y)); // t.Setters.ToList().ForEach(y => tt.Setters.Add(y)); // return tt; //} //if (x is System.Windows.EventTrigger e) //{ // var et = new System.Windows.EventTrigger() // { // SourceName = e.SourceName, // RoutedEvent = e.RoutedEvent // }; // e.Actions.ToList().ForEach(y => et.Actions.Add(y)); // e.EnterActions.ToList().ForEach(y => et.EnterActions.Add(y)); // e.ExitActions.ToList().ForEach(y => et.ExitActions.Add(y)); // return et; //} var trigger = (DependencyObject)XamlReader.Parse(serialized); Css.SetSerializedTrigger(trigger, serialized); return trigger; }).ToList()); }
public override DependencyObject CreateTrigger(StyleSheet styleSheet, ITrigger trigger, Type targetType, DependencyObject styleResourceReferenceHolder) { if (trigger == null) { throw new ArgumentNullException(nameof(trigger)); } if (trigger is Trigger) { var propertyTrigger = trigger as Trigger; var nativeTrigger = new System.Windows.Trigger(); var dependencyProperty = dependencyService.GetDependencyProperty(targetType, propertyTrigger.Property); if (dependencyProperty == null) { throw new NullReferenceException($"Property '{propertyTrigger.Property}' may not be null (targetType '{targetType.Name}')!"); } nativeTrigger.Property = dependencyProperty; nativeTrigger.Value = dependencyService.GetDependencyPropertyValue(targetType, nativeTrigger.Property.Name, nativeTrigger.Property, propertyTrigger.Value); foreach (var styleDeclaration in propertyTrigger.StyleDeclarationBlock) { var propertyInfo = typeNameResolver.GetDependencyPropertyInfo(styleSheet.Namespaces, targetType, styleDeclaration.Property); if (propertyInfo == null) { continue; } try { var value = typeNameResolver.GetPropertyValue(propertyInfo.DeclaringType, styleResourceReferenceHolder, propertyInfo.Name, styleDeclaration.Value, propertyInfo.Property, styleSheet.Namespaces); if (value == null) { } nativeTrigger.Setters.Add(new Setter { Property = propertyInfo.Property, Value = value }); } catch (Exception e) { styleSheet.Errors.Add($@"ERROR in property trigger ""{propertyTrigger.Property} {propertyTrigger.Value} - {styleDeclaration.Property}: {styleDeclaration.Value}"": {e.Message}"); } } foreach (var action in propertyTrigger.EnterActions) { try { var nativeTriggerAction = CreateTriggerAction(styleSheet, styleResourceReferenceHolder, action); nativeTrigger.EnterActions.Add(nativeTriggerAction); } catch (Exception e) { styleSheet.Errors.Add($@"ERROR in property trigger ""{propertyTrigger.Property} {propertyTrigger.Value}"" enter action: {e.Message}"); } } foreach (var action in propertyTrigger.ExitActions) { try { var nativeTriggerAction = CreateTriggerAction(styleSheet, styleResourceReferenceHolder, action); nativeTrigger.ExitActions.Add(nativeTriggerAction); } catch (Exception e) { styleSheet.Errors.Add($@"ERROR in property trigger ""{propertyTrigger.Property} {propertyTrigger.Value}"" exit action: {e.Message}"); } } var serialized = SerializeObject(nativeTrigger); //serialized = $"pre XamlWriter.Save({nativeTrigger.GetType().Name})".Measure(() => XamlWriter.Save(nativeTrigger)); Css.SetSerializedTrigger(nativeTrigger, serialized); return(nativeTrigger); } else if (trigger is DataTrigger) { var dataTrigger = trigger as DataTrigger; var nativeTrigger = new System.Windows.DataTrigger(); string expression = null; if (typeNameResolver.IsMarkupExtension(dataTrigger.Binding)) { expression = typeNameResolver.CreateMarkupExtensionExpression(dataTrigger.Binding); } else { expression = "{Binding " + dataTrigger.Binding + "}"; } var binding = (System.Windows.Data.BindingBase)markupExtensionParser.ProvideValue(expression, null, styleSheet.Namespaces); nativeTrigger.Binding = binding; nativeTrigger.Value = GetBasicValue(dataTrigger); foreach (var styleDeclaration in dataTrigger.StyleDeclarationBlock) { try { var propertyInfo = typeNameResolver.GetDependencyPropertyInfo(styleSheet.Namespaces, targetType, styleDeclaration.Property); if (propertyInfo == null) { continue; } var value = typeNameResolver.GetPropertyValue(propertyInfo.DeclaringType, styleResourceReferenceHolder, propertyInfo.Name, styleDeclaration.Value, propertyInfo.Property, styleSheet.Namespaces); if (value == null) { } nativeTrigger.Setters.Add(new Setter { Property = propertyInfo.Property, Value = value }); } catch (Exception e) { styleSheet.Errors.Add($@"ERROR in data trigger ""{dataTrigger.Binding} {dataTrigger.Value} - {styleDeclaration.Property}: {styleDeclaration.Value}"": {e.Message}"); } } foreach (var action in dataTrigger.EnterActions) { try { System.Windows.TriggerAction nativeTriggerAction = null; nativeTriggerAction = CreateTriggerAction(styleSheet, styleResourceReferenceHolder, action); nativeTrigger.EnterActions.Add(nativeTriggerAction); } catch (Exception e) { styleSheet.Errors.Add($@"ERROR in data trigger ""{dataTrigger.Binding} {dataTrigger.Value} - {action}"" enter action: {e.Message}"); } } foreach (var action in dataTrigger.ExitActions) { try { var nativeTriggerAction = CreateTriggerAction(styleSheet, styleResourceReferenceHolder, action); nativeTrigger.ExitActions.Add(nativeTriggerAction); } catch (Exception e) { styleSheet.Errors.Add($@"ERROR in data trigger ""{dataTrigger.Binding} {dataTrigger.Value} - {action}"" exit action: {e.Message}"); } } var serialized = SerializeObject(nativeTrigger); //serialized = $"pre XamlWriter.Save({nativeTrigger.GetType().Name})".Measure(() => XamlWriter.Save(nativeTrigger)); Css.SetSerializedTrigger(nativeTrigger, serialized); return(nativeTrigger); } else if (trigger is EventTrigger) { var eventTrigger = trigger as EventTrigger; var nativeTrigger = new System.Windows.EventTrigger(); nativeTrigger.RoutedEvent = (RoutedEvent)TypeHelpers.GetFieldValue(targetType, eventTrigger.Event + "Event"); foreach (var action in eventTrigger.Actions) { try { var nativeTriggerAction = CreateTriggerAction(styleSheet, styleResourceReferenceHolder, action); nativeTrigger.Actions.Add(nativeTriggerAction); } catch (Exception e) { styleSheet.Errors.Add($@"ERROR in event trigger ""{eventTrigger.Event} {action.Action}"": {e.Message}"); } } var serialized = SerializeObject(nativeTrigger); //serialized = $"pre XamlWriter.Save({nativeTrigger.GetType().Name})".Measure(() => XamlWriter.Save(nativeTrigger)); Css.SetSerializedTrigger(nativeTrigger, serialized); return(nativeTrigger); } throw new NotSupportedException($"Trigger '{trigger.GetType().FullName}' is not supported!"); }