From 26caf01092a9161d73eff5ff348fc2328cfca024 Mon Sep 17 00:00:00 2001 From: chinboy Date: Thu, 9 Jul 2026 17:27:51 +0800 Subject: [PATCH] fix(Avatar): clip image content to avatar shape --- .../Avatar/Themes/AvatarTheme.axaml | 44 ++++++++++++------- .../Avatar/AvatarGroupFoldInfoTests.cs | 33 ++++++++++++++ 2 files changed, 62 insertions(+), 15 deletions(-) diff --git a/src/AtomUI.Desktop.Controls/Avatar/Themes/AvatarTheme.axaml b/src/AtomUI.Desktop.Controls/Avatar/Themes/AvatarTheme.axaml index c00951c2a..c8635c82c 100644 --- a/src/AtomUI.Desktop.Controls/Avatar/Themes/AvatarTheme.axaml +++ b/src/AtomUI.Desktop.Controls/Avatar/Themes/AvatarTheme.axaml @@ -20,20 +20,34 @@ IsVisible="False" HorizontalAlignment="Center" VerticalAlignment="Center" /> - - + + + + + + - \ No newline at end of file + diff --git a/tests/AtomUI.Desktop.Controls.Tests/Avatar/AvatarGroupFoldInfoTests.cs b/tests/AtomUI.Desktop.Controls.Tests/Avatar/AvatarGroupFoldInfoTests.cs index 4d0dbad12..6f272a6ca 100644 --- a/tests/AtomUI.Desktop.Controls.Tests/Avatar/AvatarGroupFoldInfoTests.cs +++ b/tests/AtomUI.Desktop.Controls.Tests/Avatar/AvatarGroupFoldInfoTests.cs @@ -3,7 +3,9 @@ using AtomUI.Controls; using Avalonia; using Avalonia.Controls; using Avalonia.LogicalTree; +using Avalonia.Media.Imaging; using Avalonia.Threading; +using Avalonia.VisualTree; using Shouldly; using Xunit; @@ -212,6 +214,37 @@ public class AvatarGroupFoldInfoTests avatar.SizeType.ShouldBe(CustomizableSizeType.Large); } + [Fact] + public void Avatar_BitmapSrc_Content_Is_Clipped_By_Circle_Shape() + { + using var bitmap = new RenderTargetBitmap(new PixelSize(4, 4), new Vector(96, 96)); + var avatar = new DesktopAvatar + { + Size = 64, + Shape = AvatarShape.Circle, + BitmapSrc = bitmap + }; + + ShowInWindow(avatar, () => + { + var imagePresenter = avatar.GetVisualDescendants() + .OfType() + .Single(image => image.Name == "ImagePresenter"); + + imagePresenter.IsVisible.ShouldBeTrue(); + + var clippingFrame = imagePresenter.GetVisualAncestors() + .OfType() + .FirstOrDefault(border => border.ClipToBounds); + + clippingFrame.ShouldNotBeNull(); + clippingFrame.CornerRadius.TopLeft.ShouldBe(32); + clippingFrame.CornerRadius.TopRight.ShouldBe(32); + clippingFrame.CornerRadius.BottomRight.ShouldBe(32); + clippingFrame.CornerRadius.BottomLeft.ShouldBe(32); + }); + } + private static AvatarGroup CreateFoldedGroup() { return new AvatarGroup