diff --git a/demo/Ursa.Demo/Models/MenuKeys.cs b/demo/Ursa.Demo/Models/MenuKeys.cs index 8faf23a..fdf1286 100644 --- a/demo/Ursa.Demo/Models/MenuKeys.cs +++ b/demo/Ursa.Demo/Models/MenuKeys.cs @@ -7,6 +7,7 @@ public static class MenuKeys public const string MenuKeyButtonGroup = "ButtonGroup"; public const string MenuKeyDivider = "Divider"; public const string MenuKeyDualBadge = "DualBadge"; + public const string MenuKeyElasticWrapPanel = "ElasticWrapPanel"; public const string MenuKeyIpBox = "IPv4Box"; public const string MenuKeyKeyGestureInput = "KeyGestureInput"; public const string MenuKeyLoading = "Loading"; diff --git a/demo/Ursa.Demo/Pages/ElasticWrapPanelDemo.axaml b/demo/Ursa.Demo/Pages/ElasticWrapPanelDemo.axaml new file mode 100644 index 0000000..cbe4dfc --- /dev/null +++ b/demo/Ursa.Demo/Pages/ElasticWrapPanelDemo.axaml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/demo/Ursa.Demo/Pages/ElasticWrapPanelDemo.axaml.cs b/demo/Ursa.Demo/Pages/ElasticWrapPanelDemo.axaml.cs new file mode 100644 index 0000000..fde0e8e --- /dev/null +++ b/demo/Ursa.Demo/Pages/ElasticWrapPanelDemo.axaml.cs @@ -0,0 +1,13 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace Ursa.Demo.Pages; + +public partial class ElasticWrapPanelDemo : UserControl +{ + public ElasticWrapPanelDemo() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/demo/Ursa.Demo/ViewModels/ElasticWrapPanelDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/ElasticWrapPanelDemoViewModel.cs new file mode 100644 index 0000000..9910657 --- /dev/null +++ b/demo/Ursa.Demo/ViewModels/ElasticWrapPanelDemoViewModel.cs @@ -0,0 +1,7 @@ +using CommunityToolkit.Mvvm.ComponentModel; + +namespace Ursa.Demo.ViewModels; + +public class ElasticWrapPanelDemoViewModel : ObservableObject +{ +} \ No newline at end of file diff --git a/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs b/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs index 8487910..559e53d 100644 --- a/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs +++ b/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs @@ -29,6 +29,7 @@ public class MainViewViewModel : ViewModelBase MenuKeys.MenuKeyButtonGroup => new ButtonGroupDemoViewModel(), MenuKeys.MenuKeyDivider => new DividerDemoViewModel(), MenuKeys.MenuKeyDualBadge => new DualBadgeDemoViewModel(), + MenuKeys.MenuKeyElasticWrapPanel => new ElasticWrapPanelDemoViewModel(), MenuKeys.MenuKeyIpBox => new IPv4BoxDemoViewModel(), MenuKeys.MenuKeyKeyGestureInput => new KeyGestureInputDemoViewModel(), MenuKeys.MenuKeyLoading => new LoadingDemoViewModel(), diff --git a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs index f55365f..57aa4f4 100644 --- a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs +++ b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs @@ -16,6 +16,7 @@ public class MenuViewModel: ViewModelBase new() { MenuHeader = "ButtonGroup", Key = MenuKeys.MenuKeyButtonGroup }, new() { MenuHeader = "Divider", Key = MenuKeys.MenuKeyDivider }, new() { MenuHeader = "DualBadge", Key = MenuKeys.MenuKeyDualBadge }, + new() { MenuHeader = "ElasticWrapPanel", Key = MenuKeys.MenuKeyElasticWrapPanel }, new() { MenuHeader = "IPv4Box", Key = MenuKeys.MenuKeyIpBox }, new() { MenuHeader = "KeyGestureInput", Key = MenuKeys.MenuKeyKeyGestureInput }, new() { MenuHeader = "Loading", Key = MenuKeys.MenuKeyLoading }, diff --git a/src/Ursa.Themes.Semi/Controls/ElasticWrapPanel.axaml b/src/Ursa.Themes.Semi/Controls/ElasticWrapPanel.axaml new file mode 100644 index 0000000..fecc72d --- /dev/null +++ b/src/Ursa.Themes.Semi/Controls/ElasticWrapPanel.axaml @@ -0,0 +1,3 @@ + + diff --git a/src/Ursa.Themes.Semi/Controls/_index.axaml b/src/Ursa.Themes.Semi/Controls/_index.axaml index 2038cd0..75c025d 100644 --- a/src/Ursa.Themes.Semi/Controls/_index.axaml +++ b/src/Ursa.Themes.Semi/Controls/_index.axaml @@ -6,6 +6,7 @@ + diff --git a/src/Ursa/Controls/ElasticWrapPanel.cs b/src/Ursa/Controls/ElasticWrapPanel.cs new file mode 100644 index 0000000..285235e --- /dev/null +++ b/src/Ursa/Controls/ElasticWrapPanel.cs @@ -0,0 +1,33 @@ +using Avalonia; +using Avalonia.Controls; + +namespace Ursa.Controls; + +public class ElasticWrapPanel : Panel +{ + protected override Size MeasureOverride(Size availableSize) + { + var panelDesiredSize = new Size(); + + foreach (var child in Children) + { + child.Measure(availableSize); + panelDesiredSize = child.DesiredSize; + } + + return panelDesiredSize; + } + + protected override Size ArrangeOverride(Size finalSize) + { + foreach (var child in Children) + { + const double x = 50; + const double y = 50; + + child.Arrange(new Rect(new Point(x, y), child.DesiredSize)); + } + + return finalSize; + } +} \ No newline at end of file