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