RelativeControl.Avalonia 1.0.2

There is a newer version of this package available.
See the version list below for details.
dotnet add package RelativeControl.Avalonia --version 1.0.2
                    
NuGet\Install-Package RelativeControl.Avalonia -Version 1.0.2
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="RelativeControl.Avalonia" Version="1.0.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="RelativeControl.Avalonia" Version="1.0.2" />
                    
Directory.Packages.props
<PackageReference Include="RelativeControl.Avalonia" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add RelativeControl.Avalonia --version 1.0.2
                    
#r "nuget: RelativeControl.Avalonia, 1.0.2"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package RelativeControl.Avalonia@1.0.2
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=RelativeControl.Avalonia&version=1.0.2
                    
Install as a Cake Addin
#tool nuget:?package=RelativeControl.Avalonia&version=1.0.2
                    
Install as a Cake Tool

RelativeControl.Avalonia

This provides some relative units and features for Avalonia.

中文

See Usages in Demo

More Info

Get Started

Add NuGet package:

dotnet add package RelativeControl.Avalonia

Set a property whose value is double

<CONTROL r:Relative.Width="20pw"/>

This will set the CONTROL's width to 20% of its logical parent's width.

You can also add / subtract the values:

<CONTROL r:Relative.Width="20pw+10ph"/>

This will set the CONTROL's width to :

20% logical parent width + 10% logical parent height.

You can also add / subtract / multiply / divide the value at code behind.

  • Multiply() and Divide() will affect the instance and all its references.
  • * or / operation will create a light copy and will not affect the instance.

Relative.SetOneTimeWidth and Relative.SetOneTimeHeight will update only once when the control is attached to visual tree.

Other properties using RelativeLength / RelativeLengthMerge:

  • Relative.Height
  • Relative.MinWidth
  • Relative.MinHeight
  • Relative.MaxWidth
  • Relative.MaxHeight
  • Relative.SetOneTimeWidth
  • Relative.SetOneTimeHeight

Set a property whose value is CornerRadius

<CONTROL r:Relative.CornerRadius="10sw 10sw+5sh 10sh-5sw 10sh"/>

This will set the CONTROL's CornerRadius to:

TopLeft = 10% width,

TopRight = 10% width + 5% height,

BottomRight = 10% height - 5% width,

BottomLeft = 10% height

Set a property whose value is Thickness

<CONTROL r:Relative.BorderThickness="1em 2em-5px"/>

This will set the CONTROL's BorderThickness to:

Horizontal(Left,Right) = 1x FontSize,

Vertical(Top,Bottom) = 2x FontSize - 5px

Other properties using RelativeThickness:

  • Relative.Margin
  • Relative.Padding

Bind any property

<CONTROL PROPERTY="{r:RelativeBinding {Binding SOURCE_PROPERTY},50%}"/>

This will set the PROPERTY's value to 50% of SOURCE_PROPERTY's value.

A valid SourceProperty's value must be:

  • a double
  • any value that can convert to double (like a number string)
  • any custom structs or classes that inherits IMulDiv<RelativeScale> or IMulDiv<double>.

RelativeBindOneTime will update only once when the control is attached to visual tree.

Use Relatives in your custom property:

StyledProperty:
public static readonly StyledProperty<IRelative<T>> XXXProperty = 
    AvaloniaProperty.Register<..., IRelative<T>>(nameof(XXX));
DirectProperty:
public static readonly DirectProperty<..., IRelative<T>> XXXProperty = 
    AvaloniaProperty.RegisterDirect<..., IRelative<T>>(...);
AttachedProperty:
public static readonly AttachedProperty<IRelative<T>> XXXProperty = 
    AvaloniaProperty.RegisterAttached<...,...,IRelative<T>>(...);

Units

Absolute Units:
px: Device-independent Pixel(1/96th of an inch)
cm: Centimeter
mm: Millimeter
in: Inch
Relative Units:
      tpw: TemplatedParent's width
      tph: TemplatedParent's height
lpw or pw: LogicalParent's width
lph or ph: LogicalParent's height
      vpw: VisualParent's width
      vph: VisualParent's height
       sw: The control itself's width
       sh: The control itself's height
       em: The control's FontSize
       vw: Window's width
       vh: Window's height
        %: Represents percentage. Only used for custom bindings. 

Minimum Available Version of an API

0.0.5

  • Width
  • Height
  • MinWidth
  • MinHeight
  • MaxWidth
  • MaxHeight
  • BorderThickness
  • CornerRadius

0.1.0

  • Margin
  • Padding

1.0.0-alpha

  • RelativeBinding

You can bind any property! How to bind a custom property?

1.0.0-beta

  • SetOneTimeWidth
  • SetOneTimeHeight
  • RelativeBindOneTime

These will update only once when the control is attached to visual tree!

Breaking Changes

0.2.1:

Relative units are using percentages (Excepts em). To make it more like css.

- <Button r:Relative.Width="0.5vw"/>
+ <Button r:Relative.Width="50vw"/>

1.0.0-alpha:

Move all relative length from Units.cs to RelativeLength.cs

RelativeLength.cs:
+ public abstract class RelativeLengthBase

- RelativeLength.RelativeLengthChanged (Rename)
+ RelativeLengthBase.RelativeLengthChanged

- RelativeLengthBase.OnRelativeLengthChanged (Rename)
+ RelativeLengthBase.RelativeLengthChanged

- RelativeMerge.Multiplier (Rename)
+ RelativeLengthCollection.Scaler

- SetTarget
RelativeThickness.cs:
- RelativeThicknessChanged (Rename)
+ RelativeThicknessChangedHandler

- OnRelativeThicknessChanged (Rename)
+ RelativeThicknessChanged

- SetTarget
RelativeSize.cs:
- RelativeSizeChanged (Rename)
+ RelativeSizeChangedHandler

- OnRelativeSizeChanged (Rename)
+ RelativeSizeChanged

- SetTarget
RelativeCornerRadius.cs:
- RelativeCornerRadiusChanged (Rename)
+ RelativeCornerRadiusChangedHandler

- OnRelativeCornerRadiusChanged (Rename)
+ RelativeCornerRadiusChanged

- SetTarget

1.0.0-beta:

- public event RelativeXXXChanged(T oldValue,T newValue);
+ public event RelativeChanged<T>(IRelative<T> sender,RelativeChangedEventArgs<T> args);
+ public class RelativeChangedEventArgs<T>(T oldValue, T newValue) : RelativeChangedEventArgs {
+     public readonly T OldValue = oldValue;
+     public readonly T NewValue = newValue;
+ }
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on RelativeControl.Avalonia:

Package Downloads
RelativeControl.Avalonia.DataGrid

Enable Relative Units and Features for Avalonia DataGrid

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.3.3 303 10/23/2025
1.3.2 209 10/22/2025
1.3.1 197 10/22/2025
1.2.2 207 10/13/2025
1.2.1 197 10/13/2025
1.0.2 212 7/8/2025
1.0.0 169 6/8/2025
0.2.1 284 5/16/2025
0.2.0 267 5/15/2025
0.1.0 286 5/15/2025