feat: Source & HoverMask.

This commit is contained in:
Zhang Dian
2024-06-19 00:18:56 +08:00
parent 8cbe044953
commit 395d67500a
3 changed files with 51 additions and 5 deletions

View File

@@ -12,13 +12,24 @@
<Setter Property="Template">
<ControlTemplate TargetType="{x:Type u:Avatar}">
<Panel>
<Ellipse Fill="{TemplateBinding Background}" />
<Ellipse
Fill="{TemplateBinding Background}"
IsVisible="{TemplateBinding Source,Converter={x:Static ObjectConverters.IsNull}}" />
<ContentPresenter
Name="PART_ContentPresenter"
IsVisible="{TemplateBinding Source,Converter={x:Static ObjectConverters.IsNull}}"
CornerRadius="{TemplateBinding CornerRadius}"
Content="{TemplateBinding Content}"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center" />
<ContentPresenter
Name="{x:Static u:Avatar.PART_HoverMask}"
IsVisible="False"
Content="{TemplateBinding HoverMask}"
CornerRadius="{TemplateBinding CornerRadius}"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center" />
<Image Source="{TemplateBinding Source}" />
<DockPanel>
<ContentPresenter DockPanel.Dock="Top" />
<ContentPresenter DockPanel.Dock="Bottom" />
@@ -26,6 +37,9 @@
</Panel>
</ControlTemplate>
</Setter>
<Style Selector="^:pointerover /template/ ContentPresenter#PART_HoverMask">
<Setter Property="IsVisible" Value="True" />
</Style>
</ControlTheme>
<ControlTheme x:Key="{x:Type u:AvatarGroup}" TargetType="{x:Type u:AvatarGroup}" />
</ResourceDictionary>

View File

@@ -1,8 +1,12 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Presenters;
using Avalonia.Media;
namespace Ursa.Controls;
[TemplatePart(PART_HoverMask, typeof(ContentPresenter))]
public class Avatar : Button
{
public const string PART_TopPresenter = "PART_TopPresenter";
@@ -15,9 +19,12 @@ public class Avatar : Button
public static readonly StyledProperty<double> GapProperty = AvaloniaProperty.Register<Avatar, double>(
nameof(Gap));
public static readonly StyledProperty<string> SourceProperty = AvaloniaProperty.Register<Avatar, string>(
public static readonly StyledProperty<IImage?> SourceProperty = AvaloniaProperty.Register<Avatar, IImage?>(
nameof(Source));
public static readonly StyledProperty<object?> HoverMaskProperty = AvaloniaProperty.Register<Avatar, object?>(
nameof(HoverMask));
public bool ContentMotion
{
get => GetValue(ContentMotionProperty);
@@ -30,9 +37,15 @@ public class Avatar : Button
set => SetValue(GapProperty, value);
}
public string Source
public IImage? Source
{
get => GetValue(SourceProperty);
set => SetValue(SourceProperty, value);
}
public object? HoverMask
{
get => GetValue(HoverMaskProperty);
set => SetValue(HoverMaskProperty, value);
}
}