Пример #1
0
        public object GetClrValue(Type propertyType, string propertyValueString)
        {
            if (!(propertyType.GetTypeInfo()
                  .IsAssignableFrom(propertyValueString.GetType().GetTypeInfo())))
            {
                TypeConverter converter = null;

                converter = typeConverterProvider.GetConverterFromProperty(propertyValueString, propertyType);

                if (converter == null)
                {
                    converter = typeConverterProvider.GetConverter(propertyType);
                }
                if (converter != null)
                {
                    return(converter.ConvertFromInvariantString(propertyValueString));
                }

                else if (propertyType == typeof(bool))
                {
                    return(propertyValueString.Equals("true"));
                }
                else if (propertyType == typeof(Color))
                {
                    return(Color.FromHex(propertyValueString as string));
                }
                else if (propertyType == typeof(LayoutOptions))
                {
                    return(propertyType.GetFieldReliable(propertyValueString).GetValue(null));
                }
                else if (propertyType.GetTypeInfo().IsEnum)
                {
                    return(Enum.Parse(propertyType, propertyValueString as string));
                }
                else
                {
                    return(Convert.ChangeType(propertyValueString, propertyType));
                }
            }

            return(propertyValueString);
        }
Пример #2
0
        private Xamarin.Forms.TriggerAction CreateTriggerAction(StyleSheet styleSheet, BindableObject styleResourceReferenceHolder, TriggerAction action)
        {
            var actionTypeName      = typeNameResolver.ResolveFullTypeName(styleSheet.Namespaces, action.Action);
            var actionType          = Type.GetType(actionTypeName);
            var nativeTriggerAction = (Xamarin.Forms.TriggerAction)Activator.CreateInstance(actionType);

            foreach (var parameter in action.Parameters)
            {
                var parameterName = parameter.Property;

                object           value = null;
                var              parameterValueExpression = parameter.Value.Trim(); //.Substring(parameterName.Length + 1).Trim();
                BindableProperty depProp;
                var              type = typeNameResolver.GetClrPropertyType(styleSheet.Namespaces, nativeTriggerAction, parameterName);

                if (typeNameResolver.IsMarkupExtension(parameterValueExpression))
                {
                    value = typeNameResolver.GetMarkupExtensionValue(styleResourceReferenceHolder, parameterValueExpression, styleSheet.Namespaces);
                }
                else if ((depProp = typeNameResolver.GetDependencyProperty(styleSheet.Namespaces, actionType, parameterName)) != null)
                {
                    value = typeNameResolver.GetPropertyValue(actionType, styleResourceReferenceHolder, parameterValueExpression, depProp, styleSheet.Namespaces);
                }
                else
                {
                    value = parameterValueExpression;
                }

                if (value is string valueString)
                {
                    value = typeConverterProvider.GetConverter(type)?.ConvertFromInvariantString(valueString) ?? value;
                }

                nativeTriggerAction.GetType().GetRuntimeProperty(parameterName).SetValue(nativeTriggerAction, value);
            }

            return(nativeTriggerAction);
        }
Пример #3
0
        public override BindableObject CreateTrigger(StyleSheet styleSheet, ITrigger trigger, Type targetType, BindableObject styleResourceReferenceHolder)
        {
            if (trigger == null)
            {
                throw new ArgumentNullException(nameof(trigger));
            }

            if (trigger is Trigger)
            {
                var propertyTrigger = trigger as Trigger;
                var nativeTrigger   = new Xamarin.Forms.Trigger(targetType);

                var bindableProperty = dependencyService.GetBindableProperty(targetType, propertyTrigger.Property);
                if (bindableProperty == null)
                {
                    throw new NullReferenceException($"Property '{propertyTrigger.Property}' may not be null (targetType '{targetType.Name}')!");
                }

                nativeTrigger.Property = bindableProperty;
                nativeTrigger.Value    = dependencyService.GetBindablePropertyValue(targetType, nativeTrigger.Property, propertyTrigger.Value);

                foreach (var styleDeclaration in propertyTrigger.StyleDeclaraionBlock)
                {
                    var property = typeNameResolver.GetDependencyProperty(styleSheet.Namespaces, targetType, styleDeclaration.Property);
                    if (property == null)
                    {
                        continue;
                    }
                    var value = typeNameResolver.GetPropertyValue(targetType, styleResourceReferenceHolder, styleDeclaration.Value, property);

                    nativeTrigger.Setters.Add(new Setter {
                        Property = property, Value = value
                    });
                }

                return(nativeTrigger);
            }
            else if (trigger is DataTrigger)
            {
                var dataTrigger   = trigger as DataTrigger;
                var nativeTrigger = new Xamarin.Forms.DataTrigger(targetType);

                var expression = "{Binding " + dataTrigger.Binding + "}";

                var binding = (Binding)markupExtensionParser.ProvideValue(expression, null);
                nativeTrigger.Binding = binding;

                nativeTrigger.Value = GetBasicValue(dataTrigger);

                foreach (var styleDeclaration in dataTrigger.StyleDeclarationBlock)
                {
                    var property = typeNameResolver.GetDependencyProperty(styleSheet.Namespaces, targetType, styleDeclaration.Property);
                    if (property == null)
                    {
                        continue;
                    }
                    var value = typeNameResolver.GetPropertyValue(targetType, styleResourceReferenceHolder, styleDeclaration.Value, property);

                    nativeTrigger.Setters.Add(new Setter {
                        Property = property, Value = value
                    });
                }

                return(nativeTrigger);
            }
            else if (trigger is EventTrigger)
            {
                var eventTrigger  = trigger as EventTrigger;
                var nativeTrigger = new Xamarin.Forms.EventTrigger();

                nativeTrigger.Event = eventTrigger.Event;

                foreach (var action in eventTrigger.Actions)
                {
                    var actionTypeName = typeNameResolver.ResolveFullTypeName(styleSheet.Namespaces, action.Action);
                    var actionType     = Type.GetType(actionTypeName);
                    var triggerAction  = (Xamarin.Forms.TriggerAction)Activator.CreateInstance(actionType);

                    var parameters = action.Parameters.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                                     .Select(x => x.Trim())
                                     .ToList();

                    foreach (var parameter in parameters)
                    {
                        var parameterName = parameter.Split(' ')[0];

                        object           value = null;
                        var              parameterValueExpression = parameter.Substring(parameterName.Length + 1).Trim();
                        BindableProperty depProp;
                        var              type = typeNameResolver.GetClrPropertyType(styleSheet.Namespaces, triggerAction, parameterName);

                        if (typeNameResolver.IsMarkupExtension(parameterValueExpression))
                        {
                            value = typeNameResolver.GetMarkupExtensionValue(styleResourceReferenceHolder, parameterValueExpression);
                        }
                        else if ((depProp = typeNameResolver.GetDependencyProperty(styleSheet.Namespaces, actionType, parameterName)) != null)
                        {
                            value = typeNameResolver.GetPropertyValue(actionType, styleResourceReferenceHolder, parameterValueExpression, depProp);
                        }
                        else
                        {
                            value = parameterValueExpression;
                        }

                        if (value is string valueString)
                        {
                            value = typeConverterProvider.GetConverter(type)?.ConvertFromInvariantString(valueString) ?? value;
                        }

                        triggerAction.GetType().GetRuntimeProperty(parameterName).SetValue(triggerAction, value);
                    }

                    nativeTrigger.Actions.Add(triggerAction);
                }

                return(nativeTrigger);
            }

            throw new NotSupportedException($"Trigger '{trigger.GetType().FullName}' is not supported!");
        }