From 2d70c979f1071e5792ab8e3d89b9e80b1e22e01f Mon Sep 17 00:00:00 2001 From: Sebastian Klatte Date: Sat, 28 Mar 2026 22:42:08 +0100 Subject: [PATCH 1/5] Add expander functionality to define custom header height. --- .../Pages/ExpandersDemo.axaml | 2 ++ Material.Styles/Assists/ExpanderAssist.cs.cs | 16 ++++++++++++++ .../Converters/BottomMarginConverter.cs | 17 ++++++++++++++ .../Converters/LeftMarginConverter.cs | 17 ++++++++++++++ .../Converters/RightMarginConverter.cs | 17 ++++++++++++++ .../Converters/TopMarginConverter.cs | 17 ++++++++++++++ .../Resources/Themes/Expander.axaml | 22 ++++++++++++++----- 7 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 Material.Styles/Assists/ExpanderAssist.cs.cs create mode 100644 Material.Styles/Converters/BottomMarginConverter.cs create mode 100644 Material.Styles/Converters/LeftMarginConverter.cs create mode 100644 Material.Styles/Converters/RightMarginConverter.cs create mode 100644 Material.Styles/Converters/TopMarginConverter.cs diff --git a/Material.Avalonia.Demo/Pages/ExpandersDemo.axaml b/Material.Avalonia.Demo/Pages/ExpandersDemo.axaml index e090c677..2216dffb 100644 --- a/Material.Avalonia.Demo/Pages/ExpandersDemo.axaml +++ b/Material.Avalonia.Demo/Pages/ExpandersDemo.axaml @@ -2,6 +2,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:assists="clr-namespace:Material.Styles.Assists;assembly=Material.Styles" xmlns:viewModels="clr-namespace:Material.Avalonia.Demo.ViewModels" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Material.Avalonia.Demo.Pages.ExpandersDemo" @@ -34,6 +35,7 @@ diff --git a/Material.Styles/Assists/ExpanderAssist.cs.cs b/Material.Styles/Assists/ExpanderAssist.cs.cs new file mode 100644 index 00000000..49e907f6 --- /dev/null +++ b/Material.Styles/Assists/ExpanderAssist.cs.cs @@ -0,0 +1,16 @@ +using Avalonia; +using Avalonia.Controls; + +namespace Material.Styles.Assists; + +public static class ExpanderAssist { + public static readonly AttachedProperty HeaderHeightProperty = + AvaloniaProperty.RegisterAttached( + "HeaderHeight", typeof(Expander), 48); + + public static void SetHeaderHeight(AvaloniaObject element, double value) => + element.SetValue(HeaderHeightProperty, value); + + public static double GetHeaderHeight(AvaloniaObject element) => + element.GetValue(HeaderHeightProperty); +} \ No newline at end of file diff --git a/Material.Styles/Converters/BottomMarginConverter.cs b/Material.Styles/Converters/BottomMarginConverter.cs new file mode 100644 index 00000000..ff5abc6a --- /dev/null +++ b/Material.Styles/Converters/BottomMarginConverter.cs @@ -0,0 +1,17 @@ +using System; +using System.Globalization; +using Avalonia; +using Avalonia.Data; +using Avalonia.Data.Converters; + +namespace Material.Styles.Converters; + +public class BottomMarginConverter : IValueConverter { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + double bottom = value is double d ? d : 0; + return new Thickness(0, 0, 0, bottom); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + => BindingOperations.DoNothing; +} \ No newline at end of file diff --git a/Material.Styles/Converters/LeftMarginConverter.cs b/Material.Styles/Converters/LeftMarginConverter.cs new file mode 100644 index 00000000..587bc94e --- /dev/null +++ b/Material.Styles/Converters/LeftMarginConverter.cs @@ -0,0 +1,17 @@ +using System; +using System.Globalization; +using Avalonia; +using Avalonia.Data; +using Avalonia.Data.Converters; + +namespace Material.Styles.Converters; + +public class LeftMarginConverter : IValueConverter { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + double left = value is double d ? d : 0; + return new Thickness(left, 0, 0, 0); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + => BindingOperations.DoNothing; +} \ No newline at end of file diff --git a/Material.Styles/Converters/RightMarginConverter.cs b/Material.Styles/Converters/RightMarginConverter.cs new file mode 100644 index 00000000..703c0adf --- /dev/null +++ b/Material.Styles/Converters/RightMarginConverter.cs @@ -0,0 +1,17 @@ +using System; +using System.Globalization; +using Avalonia; +using Avalonia.Data; +using Avalonia.Data.Converters; + +namespace Material.Styles.Converters; + +public class RightMarginConverter : IValueConverter { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + double right = value is double d ? d : 0; + return new Thickness(0, 0, right, 0); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + => BindingOperations.DoNothing; +} \ No newline at end of file diff --git a/Material.Styles/Converters/TopMarginConverter.cs b/Material.Styles/Converters/TopMarginConverter.cs new file mode 100644 index 00000000..b882e7b9 --- /dev/null +++ b/Material.Styles/Converters/TopMarginConverter.cs @@ -0,0 +1,17 @@ +using System; +using System.Globalization; +using Avalonia; +using Avalonia.Data; +using Avalonia.Data.Converters; + +namespace Material.Styles.Converters; + +public class TopMarginConverter : IValueConverter { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + double top = value is double d ? d : 0; + return new Thickness(0, top, 0, 0); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + => BindingOperations.DoNothing; +} \ No newline at end of file diff --git a/Material.Styles/Resources/Themes/Expander.axaml b/Material.Styles/Resources/Themes/Expander.axaml index 81641fa7..3cfe0383 100644 --- a/Material.Styles/Resources/Themes/Expander.axaml +++ b/Material.Styles/Resources/Themes/Expander.axaml @@ -1,12 +1,18 @@ + xmlns:controls="clr-namespace:Material.Styles.Controls" + xmlns:converters="clr-namespace:Material.Styles.Converters"> + + + + + - + @@ -180,7 +186,8 @@ - + - + + - - + - - + - - + - @@ -256,4 +239,4 @@ - + \ No newline at end of file From d7cf9d90f1b30dd61a3599099ea8b8dd76151c06 Mon Sep 17 00:00:00 2001 From: Sebastian Klatte Date: Sun, 29 Mar 2026 17:21:53 +0200 Subject: [PATCH 4/5] Remove unused imports. --- Material.Avalonia.Demo/Pages/ExpandersDemo.axaml | 1 - Material.Styles/Resources/Themes/Expander.axaml | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Material.Avalonia.Demo/Pages/ExpandersDemo.axaml b/Material.Avalonia.Demo/Pages/ExpandersDemo.axaml index 7c7fd93c..e090c677 100644 --- a/Material.Avalonia.Demo/Pages/ExpandersDemo.axaml +++ b/Material.Avalonia.Demo/Pages/ExpandersDemo.axaml @@ -2,7 +2,6 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:assists="clr-namespace:Material.Styles.Assists;assembly=Material.Styles" xmlns:viewModels="clr-namespace:Material.Avalonia.Demo.ViewModels" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Material.Avalonia.Demo.Pages.ExpandersDemo" diff --git a/Material.Styles/Resources/Themes/Expander.axaml b/Material.Styles/Resources/Themes/Expander.axaml index eebdc349..a2a1980b 100644 --- a/Material.Styles/Resources/Themes/Expander.axaml +++ b/Material.Styles/Resources/Themes/Expander.axaml @@ -1,8 +1,7 @@ + xmlns:controls="clr-namespace:Material.Styles.Controls"> From 53893e1b9829b22f167423d538d30531d5d689eb Mon Sep 17 00:00:00 2001 From: Sebastian Klatte Date: Mon, 30 Mar 2026 00:17:50 +0200 Subject: [PATCH 5/5] Add dynamic header height demo. --- Material.Avalonia.Demo/Pages/ExpandersDemo.axaml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Material.Avalonia.Demo/Pages/ExpandersDemo.axaml b/Material.Avalonia.Demo/Pages/ExpandersDemo.axaml index e090c677..91c03396 100644 --- a/Material.Avalonia.Demo/Pages/ExpandersDemo.axaml +++ b/Material.Avalonia.Demo/Pages/ExpandersDemo.axaml @@ -32,10 +32,16 @@ Content="{Binding }" ContentTemplate="{StaticResource LoremContentTemplate}"/> - + ContentTemplate="{StaticResource LoremContentTemplate}"> + + + + + + +