Git Product home page Git Product logo

Comments (3)

dif-sam avatar dif-sam commented on May 22, 2024

As workaround, try add this code before use triggers somewhere in applications initialization:

if (!TypeDescriptor.GetAttributes(typeof(Avalonia.Thickness)).Cast<Attribute>().Any(x => x is TypeConverterAttribute))
{
    TypeDescriptor.AddAttributes(typeof(Avalonia.Thickness), new TypeConverterAttribute(typeof(ThicknessTypeConverter)));
}

/*...*/

    public class ThicknessTypeConverter : TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)
        {
            return sourceType == typeof(string) || sourceType == typeof(double) || sourceType == typeof(int);
        }

        public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
        {
            return value switch
            {
                string stringValue => new Avalonia.Thickness(double.Parse(stringValue, culture)),
                double doubleValue => new Avalonia.Thickness(doubleValue),
                int intValue => new Avalonia.Thickness(intValue),
                _ => base.ConvertFrom(context, culture, value)
            };
        }
    }

ChangePropertyAction internally uses a heuristic way of converting types (e.g. string->Avalonia.Thickness and string->Avalonia.Brush in your case) and it falldown to call TypeDescriptor.GetConverter. Using reflection it tries to find custom TypeConverter for destynation type. There is no default converter today, but you can do it yourself.

from avalonia.xaml.behaviors.

sam-wheat avatar sam-wheat commented on May 22, 2024

Same problem but with padding:

<i:Interaction.Behaviors>
	<ia:DataTriggerBehavior Binding="{Binding IsExpanded}" ComparisonCondition="Equal" Value="true">
		<ia:ChangePropertyAction TargetObject="{Binding #btn}" PropertyName="Content" Value="&#xE936;"/>
		<ia:ChangePropertyAction TargetObject="{Binding #btn}" PropertyName="Padding" Value="5,7,5,3"/>
		
	</ia:DataTriggerBehavior>
	<ia:DataTriggerBehavior Binding="{Binding IsExpanded}" ComparisonCondition="Equal" Value="false">
		<ia:ChangePropertyAction TargetObject="{Binding #btn}" PropertyName="Padding" Value="9,4,1,6"/>
		<ia:ChangePropertyAction TargetObject="{Binding #btn}" PropertyName="Content" Value="&#xE937;"/>
	</ia:DataTriggerBehavior>
</i:Interaction.Behaviors>

When trying to implement the suggested workaround I can cannot find class Avalonia.Padding. Seems like it would be a pretty low leve object and included in the Avalonia library(?):

public class PaddingTypeConverter : TypeConverter
{
	public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)
	{
		return sourceType == typeof(string) || sourceType == typeof(double) || sourceType == typeof(int);
	}

	public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
	{
		return value switch
		{
			string stringValue => new Avalonia.Padding(double.Parse(stringValue, culture)), // error:  .Padding(...) not found
		};
	}
}

from avalonia.xaml.behaviors.

maxkatz6 avatar maxkatz6 commented on May 22, 2024

Instead, it should be parsed compile time. But for that some attributes-hints should be created.

from avalonia.xaml.behaviors.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.