15 KiB
Card 使用文档
本文档介绍 AtomUI Card 控件的各种使用方式,示例代码摘自 Gallery 演示程序。
📖 Gallery 源码位置:
controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/CardShowCase.axaml
前置准备
在 AXAML 中使用 Card,需要引入以下命名空间:
xmlns:atom="https://atomui.net"
xmlns:antdicons="https://atomui.net/icons/antdesign"
在 C# 代码中引入:
using AtomUI.Desktop.Controls; // Card, CardMetaContent, CardTabsContent 等
using AtomUI.Controls; // SizeType 等共享类型
1. 基本卡片
最基本的卡片,包含标题、内容和额外区域。支持三种尺寸。
<WrapPanel ItemSpacing="20" LineSpacing="20">
<atom:Card Header="Large size card" SizeType="Large" Width="300">
<atom:Card.Extra>
<atom:HyperLinkButton>More</atom:HyperLinkButton>
</atom:Card.Extra>
<StackPanel Orientation="Vertical" Spacing="3">
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
</StackPanel>
</atom:Card>
<atom:Card Header="Default size card" SizeType="Middle" Width="300">
<atom:Card.Extra>
<atom:HyperLinkButton>More</atom:HyperLinkButton>
</atom:Card.Extra>
<StackPanel Orientation="Vertical" Spacing="3">
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
</StackPanel>
</atom:Card>
<atom:Card Header="Small size card" SizeType="Small" Width="300">
<atom:Card.Extra>
<atom:HyperLinkButton>More</atom:HyperLinkButton>
</atom:Card.Extra>
<StackPanel Orientation="Vertical" Spacing="3">
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
</StackPanel>
</atom:Card>
</WrapPanel>
使用场景指引:
- 默认使用
Middle尺寸 - 页面级概览卡片使用
Large - 紧凑布局或辅助信息使用
Small
2. 简洁卡片(无标题)
不设置 Header 和 Extra,卡片将不显示头部区域(:headerless 伪类激活):
<atom:Card Width="300" HorizontalAlignment="Left">
<StackPanel Orientation="Vertical" Spacing="3">
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
</StackPanel>
</atom:Card>
3. 无边框卡片
在灰色或有色背景上使用无边框风格,通过阴影划定卡片边界:
<Border Padding="20" Background="#F0F2F5">
<atom:Card Header="Card title" Width="300" StyleVariant="Borderless"
HorizontalAlignment="Left">
<atom:Card.Extra>
<atom:HyperLinkButton>More</atom:HyperLinkButton>
</atom:Card.Extra>
<StackPanel Orientation="Vertical" Spacing="3">
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
</StackPanel>
</atom:Card>
</Border>
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/CardShowCase.axaml中 "No border" 示例。
4. 卡片列布局
多张卡片在网格中排列,常用于概览页面:
<Border Padding="20" Background="#F0F2F5">
<Grid RowDefinitions="*" ColumnDefinitions="*, *, *" ColumnSpacing="20">
<atom:Card Header="Card title" StyleVariant="Borderless"
Grid.Row="0" Grid.Column="0" HorizontalAlignment="Stretch">
<StackPanel Orientation="Vertical" Spacing="3">
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
</StackPanel>
</atom:Card>
<atom:Card Header="Card title" StyleVariant="Borderless"
Grid.Row="0" Grid.Column="1" HorizontalAlignment="Stretch">
<StackPanel Orientation="Vertical" Spacing="3">
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
</StackPanel>
</atom:Card>
<atom:Card Header="Card title" StyleVariant="Borderless"
Grid.Row="0" Grid.Column="2" HorizontalAlignment="Stretch">
<StackPanel Orientation="Vertical" Spacing="3">
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
</StackPanel>
</atom:Card>
</Grid>
</Border>
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/CardShowCase.axaml中 "Card in column" 示例。
5. 悬浮阴影卡片
通过 IsHoverable 启用鼠标悬浮效果,卡片在悬浮时「升起」:
<atom:Card Width="240" IsHoverable="True" HorizontalAlignment="Left">
<atom:Card.Cover>
<Image Source="/Assets/CardShowCase/Cover1.png" />
</atom:Card.Cover>
<atom:CardMetaContent Header="Europe Street beat"
Content="www.instagram.com" />
</atom:Card>
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/CardShowCase.axaml中 "Customized content" 示例。
6. 带封面和 Meta 内容
使用 Cover 属性设置封面图片,CardMetaContent 展示结构化信息:
<atom:Card Width="300" HorizontalAlignment="Left">
<atom:Card.Cover>
<Image Source="/Assets/CardShowCase/Cover2.png" />
</atom:Card.Cover>
<atom:CardMetaContent Header="Card title"
Content="This is the description">
<atom:CardMetaContent.Avatar>
<atom:Avatar Src="avares://AtomUIGallery/Assets/AvatarShowCase/PeopleAvatar1.svg" />
</atom:CardMetaContent.Avatar>
</atom:CardMetaContent>
<atom:Card.Actions>
<atom:CardActionButton Icon="{antdicons:AntDesignIconProvider Kind=EditOutlined}" />
<atom:CardActionButton Icon="{antdicons:AntDesignIconProvider Kind=SettingOutlined}" />
<atom:CardActionButton Icon="{antdicons:AntDesignIconProvider Kind=EllipsisOutlined}" />
</atom:Card.Actions>
</atom:Card>
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/CardShowCase.axaml中 "Support more content configuration" 示例。
7. 加载状态
通过 IsLoading 控制骨架屏加载占位,适用于异步数据加载场景:
静态加载状态
<atom:Card MinWidth="300" IsLoading="True" HorizontalAlignment="Left">
<atom:CardMetaContent Header="Card title">
<atom:CardMetaContent.Avatar>
<atom:Avatar Src="avares://AtomUIGallery/Assets/AvatarShowCase/PeopleAvatar1.svg" />
</atom:CardMetaContent.Avatar>
<StackPanel Orientation="Vertical" Spacing="3">
<atom:TextBlock>This is the description</atom:TextBlock>
<atom:TextBlock>This is the description</atom:TextBlock>
</StackPanel>
</atom:CardMetaContent>
<atom:Card.Actions>
<atom:CardActionButton Icon="{antdicons:AntDesignIconProvider Kind=EditOutlined}" />
<atom:CardActionButton Icon="{antdicons:AntDesignIconProvider Kind=SettingOutlined}" />
<atom:CardActionButton Icon="{antdicons:AntDesignIconProvider Kind=EllipsisOutlined}" />
</atom:Card.Actions>
</atom:Card>
动态加载状态(数据绑定)
<StackPanel Orientation="Vertical" Spacing="20">
<atom:ToggleSwitch IsChecked="{Binding IsLoading, Mode=TwoWay}" />
<atom:Card MinWidth="300" IsLoading="{Binding IsLoading}" HorizontalAlignment="Left">
<atom:CardMetaContent Header="Card title">
<StackPanel Orientation="Vertical" Spacing="3">
<atom:TextBlock>This is the description</atom:TextBlock>
</StackPanel>
</atom:CardMetaContent>
</atom:Card>
</StackPanel>
// ViewModel
public class CardViewModel : ReactiveObject
{
[Reactive]
public bool IsLoading { get; set; } = true;
}
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/CardShowCase.axaml中 "Loading card" 示例。
8. Grid 网格卡片
使用 CardGridContent 和 CardGridItem 创建网格布局:
<atom:Card HorizontalAlignment="Stretch" Header="Card Title" SizeType="Large">
<atom:CardGridContent ColumnDefinitions="*, *, *, *"
RowDefinitions="Auto, Auto">
<atom:CardGridItem Row="0" Column="0">Content</atom:CardGridItem>
<atom:CardGridItem Row="0" Column="1" IsHoverable="False">Content</atom:CardGridItem>
<atom:CardGridItem Row="0" Column="2">Content</atom:CardGridItem>
<atom:CardGridItem Row="0" Column="3">Content</atom:CardGridItem>
<atom:CardGridItem Row="1" Column="0">Content</atom:CardGridItem>
<atom:CardGridItem Row="1" Column="1">Content</atom:CardGridItem>
<atom:CardGridItem Row="1" Column="2">Content</atom:CardGridItem>
</atom:CardGridContent>
</atom:Card>
特点:
ColumnDefinitions和RowDefinitions的语法与 AvaloniaGrid一致- 每个
CardGridItem通过Row和Column定位 - 可通过
IsHoverable="False"禁用单个格子的悬浮效果 - 网格内容模式下头部底部边框自动隐藏
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/CardShowCase.axaml中 "Grid card" 示例。
9. 内嵌卡片
通过 IsInnerMode 实现卡片嵌套,内层卡片头部自动变色以区分层级:
<atom:Card Header="Card title" HorizontalAlignment="Stretch" SizeType="Large">
<StackPanel Orientation="Vertical" Spacing="20">
<atom:Card Header="Card title" HorizontalAlignment="Stretch" IsInnerMode="True">
<atom:Card.Extra>
<atom:HyperLinkButton>More</atom:HyperLinkButton>
</atom:Card.Extra>
<StackPanel Orientation="Vertical" Spacing="3">
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
</StackPanel>
</atom:Card>
<atom:Card Header="Card title" HorizontalAlignment="Stretch" IsInnerMode="True">
<atom:Card.Extra>
<atom:HyperLinkButton>More</atom:HyperLinkButton>
</atom:Card.Extra>
<StackPanel Orientation="Vertical" Spacing="3">
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
<atom:TextBlock>Card content</atom:TextBlock>
</StackPanel>
</atom:Card>
</StackPanel>
</atom:Card>
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/CardShowCase.axaml中 "Inner card" 示例。
10. 内嵌标签页
使用 CardTabsContent 在卡片中嵌入标签页:
标题 + Tabs
<atom:Card Header="Card title" HorizontalAlignment="Stretch" SizeType="Large">
<atom:Card.Extra>
<atom:HyperLinkButton>More</atom:HyperLinkButton>
</atom:Card.Extra>
<atom:CardTabsContent>
<atom:TabItem Header="Tab1">content1</atom:TabItem>
<atom:TabItem Header="Tab2">content2</atom:TabItem>
</atom:CardTabsContent>
</atom:Card>
Tabs + 标签栏额外内容(无标题)
<atom:Card HorizontalAlignment="Stretch">
<atom:CardTabsContent>
<atom:CardTabsContent.TabBarExtraContent>
<atom:HyperLinkButton>More</atom:HyperLinkButton>
</atom:CardTabsContent.TabBarExtraContent>
<atom:TabItem Header="article">article content</atom:TabItem>
<atom:TabItem Header="app">app content</atom:TabItem>
<atom:TabItem Header="project">project content</atom:TabItem>
</atom:CardTabsContent>
</atom:Card>
📖 参考:
controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/CardShowCase.axaml中 "With tabs" 示例。
11. 操作区按钮
通过 Card.Actions 添加操作按钮,操作区自动等分布局:
<atom:Card Width="300">
<atom:CardMetaContent Header="Card title" Content="Description text">
<atom:CardMetaContent.Avatar>
<atom:Avatar Src="avares://AtomUIGallery/Assets/AvatarShowCase/PeopleAvatar1.svg" />
</atom:CardMetaContent.Avatar>
</atom:CardMetaContent>
<atom:Card.Actions>
<atom:CardActionButton Icon="{antdicons:AntDesignIconProvider Kind=EditOutlined}" />
<atom:CardActionButton Icon="{antdicons:AntDesignIconProvider Kind=SettingOutlined}" />
<atom:CardActionButton Icon="{antdicons:AntDesignIconProvider Kind=EllipsisOutlined}" />
</atom:Card.Actions>
</atom:Card>
特点:
- 操作区使用
UniformGrid等分布局 - 操作按钮之间自动绘制分割线
- 操作区与内容区之间自动绘制顶部分割线
- 图标悬浮时变为主色(
ColorPrimary)
12. 控制动画行为
<!-- 禁用过渡动画(BoxShadow 悬浮切换时不再平滑过渡) -->
<atom:Card Header="Card Title" IsHoverable="True" IsMotionEnabled="False" Width="300">
<atom:TextBlock>No animation transition</atom:TextBlock>
</atom:Card>
常见组合模式
信息展示卡片
<atom:Card Header="用户信息" SizeType="Large" Width="350">
<atom:Card.Extra>
<atom:HyperLinkButton>编辑</atom:HyperLinkButton>
</atom:Card.Extra>
<atom:CardMetaContent Header="张三" Content="前端工程师 · 杭州">
<atom:CardMetaContent.Avatar>
<atom:Avatar Text="张" />
</atom:CardMetaContent.Avatar>
</atom:CardMetaContent>
</atom:Card>
产品卡片
<atom:Card Width="280" IsHoverable="True">
<atom:Card.Cover>
<Image Source="/Assets/product.png" />
</atom:Card.Cover>
<atom:CardMetaContent Header="产品名称" Content="产品描述信息" />
<atom:Card.Actions>
<atom:CardActionButton Icon="{antdicons:AntDesignIconProvider Kind=HeartOutlined}" />
<atom:CardActionButton Icon="{antdicons:AntDesignIconProvider Kind=ShoppingCartOutlined}" />
<atom:CardActionButton Icon="{antdicons:AntDesignIconProvider Kind=ShareAltOutlined}" />
</atom:Card.Actions>
</atom:Card>
功能入口网格
<atom:Card Header="快捷操作" HorizontalAlignment="Stretch">
<atom:CardGridContent ColumnDefinitions="*, *, *" RowDefinitions="Auto">
<atom:CardGridItem Row="0" Column="0">操作一</atom:CardGridItem>
<atom:CardGridItem Row="0" Column="1">操作二</atom:CardGridItem>
<atom:CardGridItem Row="0" Column="2">操作三</atom:CardGridItem>
</atom:CardGridContent>
</atom:Card>
多维度信息展示
<atom:Card HorizontalAlignment="Stretch">
<atom:CardTabsContent>
<atom:CardTabsContent.TabBarExtraContent>
<atom:HyperLinkButton>更多</atom:HyperLinkButton>
</atom:CardTabsContent.TabBarExtraContent>
<atom:TabItem Header="概览">概览内容</atom:TabItem>
<atom:TabItem Header="详情">详情内容</atom:TabItem>
<atom:TabItem Header="日志">日志内容</atom:TabItem>
</atom:CardTabsContent>
</atom:Card>