[New Control] Descriptions (#791)

* feat: add ColumnWrapPanel.

* feat: add Descriptions and DescriptionsItem controls

* WIP: extract a LabeledContentControl for this particular need.

* wip.

* feat: setup demo. fix various initial status issue.

* fix: fix a layout issue.

* feat: improve demo.

* feat: update demo.

* fix: remove a redundant calculation.

* feat: update per copilot feedback.

* feat: add tests, fix a calculation issue.

* feat: refactor to change the default label and value binding assignment logic.

* feat: introduce orientation.

* misc: format codes.

* feat: clarify LabelPosition property.

* feat: extract Font resources.

* revert AvatarDemo.

* feat: assign specific value to Font resources for testing.

* misc: resolve copilot comment.

---------

Co-authored-by: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
This commit is contained in:
Dong Bin
2025-10-22 20:49:02 +08:00
committed by GitHub
parent c6ac019a4e
commit dcaef1c8ed
22 changed files with 1076 additions and 32 deletions

View File

@@ -0,0 +1,183 @@
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Headless.XUnit;
using Avalonia.LogicalTree;
using Ursa.Common;
using Ursa.Controls;
namespace HeadlessTest.Ursa.Controls.DescriptionTests;
public class Test
{
[AvaloniaFact]
public void Descriptions_LabelPosition_Propagates_To_DescriptionItems()
{
var descriptions = new Descriptions
{
LabelPosition = Position.Left,
ItemsSource = new[]
{
new { Label = "Name", Content = "John Doe" },
new { Label = "Age", Content = "30" }
},
LabelMemberBinding = new Binding("Label"),
};
var window = new Window
{
Content = descriptions
};
window.Show();
var items = descriptions.GetLogicalChildren().OfType<DescriptionsItem>().ToList();
foreach (var item in items)
{
Assert.Equal(Position.Left, item.LabelPosition);
}
descriptions.LabelPosition = Position.Top;
foreach (var item in items)
{
Assert.Equal(Position.Top, item.LabelPosition);
}
}
[AvaloniaFact]
public void Inline_Descriptions_LabelPosition_Overrides_Parent_Descriptions()
{
var descriptions = new Descriptions
{
LabelPosition = Position.Left,
Items =
{
new DescriptionsItem()
{
Label = "Name",
Content = "John Doe",
LabelPosition = Position.Top
},
new DescriptionsItem()
{
Label = "Age",
Content = "30",
}
}
};
var window = new Window
{
Content = descriptions
};
window.Show();
var items = descriptions.GetLogicalChildren().OfType<DescriptionsItem>().ToList();
Assert.Equal(Position.Top, items[0].LabelPosition);
Assert.Equal(Position.Left, items[1].LabelPosition);
descriptions.LabelPosition = Position.Top;
Assert.Equal(Position.Top, items[0].LabelPosition);
Assert.Equal(Position.Top, items[1].LabelPosition);
}
[AvaloniaFact]
public void Descriptions_ItemAlignment_Propagates_To_DescriptionItems()
{
var descriptions = new Descriptions
{
LabelPosition = Position.Left,
ItemsSource = new[]
{
new { Label = "Name", Content = "John Doe" },
new { Label = "Age", Content = "30" }
},
ItemAlignment = ItemAlignment.Center,
LabelMemberBinding = new Binding("Label"),
};
var window = new Window
{
Content = descriptions
};
window.Show();
var items = descriptions.GetLogicalChildren().OfType<DescriptionsItem>().ToList();
foreach (var item in items)
{
Assert.Equal(ItemAlignment.Center, item.ItemAlignment);
}
descriptions.ItemAlignment = ItemAlignment.Justify;
foreach (var item in items)
{
Assert.Equal(ItemAlignment.Justify, item.ItemAlignment);
}
}
[AvaloniaFact]
public void Inline_Descriptions_ItemAlignment_Overrides_Parent_Descriptions()
{
var descriptions = new Descriptions
{
ItemAlignment = ItemAlignment.Center,
Items =
{
new DescriptionsItem()
{
Label = "Name",
Content = "John Doe",
ItemAlignment = ItemAlignment.Justify
},
new DescriptionsItem()
{
Label = "Age",
Content = "30",
}
}
};
var window = new Window
{
Content = descriptions
};
window.Show();
var items = descriptions.GetLogicalChildren().OfType<DescriptionsItem>().ToList();
Assert.Equal(ItemAlignment.Justify, items[0].ItemAlignment);
Assert.Equal(ItemAlignment.Center, items[1].ItemAlignment);
descriptions.ItemAlignment = ItemAlignment.Left;
Assert.Equal(ItemAlignment.Justify, items[0].ItemAlignment);
Assert.Equal(ItemAlignment.Left, items[1].ItemAlignment);
}
[AvaloniaFact]
public void Descriptions_LabelWidth_Propagates_To_DescriptionItems()
{
var descriptions = new Descriptions
{
LabelWidth = new GridLength(100),
ItemsSource = new[]
{
new { Label = "Name", Content = "John Doe" },
new { Label = "Age", Content = "30" }
},
LabelMemberBinding = new Binding("Label"),
};
var window = new Window
{
Content = descriptions
};
window.Show();
var items = descriptions.GetLogicalChildren().OfType<DescriptionsItem>().ToList();
foreach (var item in items)
{
Assert.Equal(100, item.LabelWidth);
}
descriptions.LabelWidth = new GridLength(150);
foreach (var item in items)
{
Assert.Equal(150, item.LabelWidth);
}
}
}