Skip to main content

uno-toolkit-card

Use CardContentControl for elevated, filled, or outlined card containers.

跳到安装

来源信息

仓库
unoplatform/studio
最近来源活动
2026年6月9日 19:39
检测到的 SKILL.md 语言
英语
星标
10
分支
1

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
uno-toolkit-card
description
Use CardContentControl for elevated, filled, or outlined card containers.
when_to_use
ALWAYS use this skill when building any card-like UI — elevated, filled, or outlined containers. ALWAYS use `CardContentControl` — never use `Card` (it has rigid predefined slots that limit layout flexibility). ALWAYS use this skill instead of creating a `Border` used as a card (with `CornerRadius` combined with `Background`, `Padding`, or `BorderBrush`) — `CardContentControl` provides proper styling, elevation, and theming out of the box. Custom card layouts with full control over content via `ContentTemplate`.
metadata
{"author":"uno-platform","version":"3.6","category":"toolkit"}
# Uno Toolkit CardContentControl — Agent Skill ## Critical Rules - **NEVER use `Card`** — always use `CardContentControl`. The `Card` control has rigid predefined slots (HeaderContent, SubHeaderContent, AvatarContent, etc.) that constrain layout. `CardContentControl` gives full layout freedom via `ContentTemplate`. - **NEVER use `Border` with `CornerRadius` to wrap content.** This is the most common Border anti-pattern in generated XAML and the parser flags it as `GRD1102`. Always use `CardContentControl` instead — it provides correct elevation, corner radius, theming, and accessibility automatically. ### Anti-pattern detection (matches `GRD1102`) If you find yourself writing a `<Border>` that meets **all** of the following, stop and rewrite it as `utu:CardContentControl`: 1. The `Border` has children (it is **not** self-closing). 2. It sets `CornerRadius` to a non-zero value. 3. It sets at least one of: `Background`, `BorderBrush` (with non-zero `BorderThickness`), or non-zero `Padding`. That's a card. `<Border CornerRadius="8" Background="..." Padding="16">…</Border>` is a card written the wrong way. ```xml <!-- WRONG: Border-as-card (the parser will report GRD1102) --> <Border CornerRadius="8" Background="{ThemeResource SurfaceBrush}" Padding="16"> <StackPanel Spacing="8"> <TextBlock Text="Title"/> <TextBlock Text="Body"/> </StackPanel> </Border> <!-- CORRECT: utu:CardContentControl --> <utu:CardContentControl Style="{StaticResource ElevatedCardContentControlStyle}"> <utu:CardContentControl.ContentTemplate> <DataTemplate> <StackPanel Padding="16" Spacing="8"> <TextBlock Text="Title"/> <TextBlock Text="Body"/> </StackPanel> </DataTemplate> </utu:CardContentControl.ContentTemplate> </utu:CardContentControl> ``` ### When `Border` is still correct `Border` is the right choice for: dividers (`<Border Height="1" Background="..."/>`), thin separators, simple background fills with no rounded corners, image/content clipping with `CornerRadius` alone (no `Background`/`Padding`/`BorderBrush+BorderThickness`), and layout primitives **inside** a `ControlTemplate`. The grader specifically targets the *card-shaped* combination above; plain layout borders are unaffected. ## Workflow > **Docs lookup:** call `uno_platform_docs_search(...)` first, then `uno_platform_docs_fetch(sourcePath="…")` using the `sourcePath` field from a result (a relative `.md` path; add the result's `anchor` for a section). Never pass a URL, a `.html` link, or a hand-built path. ### Step 1: Fetch the CardContentControl Documentation ``` uno_platform_docs_search("Uno Toolkit CardContentControl elevated filled outlined") ``` Primary documentation page: - **Card & CardContentControl**: `external/uno.toolkit.ui/doc/controls/CardAndCardContentControl.md` Fetch the page: ``` uno_platform_docs_fetch(sourcePath="external/uno.toolkit.ui/doc/controls/CardAndCardContentControl.md") ``` ### Step 2: For How-To / Walkthrough ``` uno_platform_docs_search("CardContentControl howto walkthrough custom template") ``` Key page: - **Card How-To**: `external/uno.toolkit.ui/doc/controls/walkthroughs/Card-and-CardContentControl.howto.md` ## Key Principles (Stable) - **`CardContentControl`** — fully custom layout via `ContentTemplate`. This is the only card control you should use. - XAML namespace: `xmlns:utu="using:Uno.Toolkit.UI"` - Do NOT use `Card` — it has predefined slots that limit layout flexibility - Do NOT use `Border` as a card (`CornerRadius` + `Background`/`Padding`/`BorderBrush`) — the parser reports this as `GRD1102`; use `CardContentControl` instead ## Critical: Content Binding in DataTemplates When `CardContentControl` is used **inside** an `ItemsRepeater`, `ListView`, or any other `DataTemplate`, you **MUST** set `Content="{Binding}"` on the `CardContentControl`. Without this, the inner `ContentTemplate > DataTemplate` has **no DataContext** and all bindings inside it resolve to null (rendering the card empty/invisible). ### Rules - **ALWAYS** set `Content="{Binding}"` on `CardContentControl` when it appears inside a `DataTemplate` - **NEVER** use indexed bindings (e.g. `{Binding Items[0].Label}`) inside card templates — use `ItemsSource` with a nested `ItemsRepeater` instead - The `ContentTemplate`'s inner `DataTemplate` inherits its DataContext **only** from the `Content` property — if `Content` is not bound, the inner template has no data ### Correct pattern ```xml <DataTemplate x:DataType="local:MenuItem"> <utu:CardContentControl Style="{StaticResource FilledCardContentControlStyle}" Content="{Binding}"> <utu:CardContentControl.ContentTemplate> <DataTemplate> <TextBlock Text="{Binding Label}" /> </DataTemplate> </utu:CardContentControl.ContentTemplate> </utu:CardContentControl> </DataTemplate> ``` ### Wrong pattern (missing Content binding) ```xml <!-- ❌ WRONG: No Content="{Binding}" — inner DataTemplate has no DataContext --> <DataTemplate x:DataType="local:MenuItem"> <utu:CardContentControl Style="{StaticResource FilledCardContentControlStyle}"> <utu:CardContentControl.ContentTemplate> <DataTemplate> <TextBlock Text="{Binding Label}" /> <!-- This resolves to null! --> </DataTemplate> </utu:CardContentControl.ContentTemplate> </utu:CardContentControl> </DataTemplate> ``` ## Sizing — `CardContentControl` does NOT stretch by default `CardContentControl` sizes to its content. It will **not** fill the available width or height of its parent on its own, even inside a `Grid` cell or `StackPanel` slot that has space to spare. If you need the card to take all available space (a hero card, a full-width row, a column-filling pane), set the alignment **explicitly** on the `CardContentControl` itself: ```xml <!-- Card fills its grid cell horizontally and vertically --> <utu:CardContentControl Grid.Row="0" Style="{StaticResource ElevatedCardContentControlStyle}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <utu:CardContentControl.ContentTemplate> <DataTemplate> <Grid Padding="16"> <!-- ... --> </Grid> </DataTemplate> </utu:CardContentControl.ContentTemplate> </utu:CardContentControl> ``` Rules of thumb: - **Full-width row card** (e.g. summary card across a page): `HorizontalAlignment="Stretch"`. - **Column- or pane-filling card** (e.g. a card that should fill a `*` row in a `Grid`): `HorizontalAlignment="Stretch"` **and** `VerticalAlignment="Stretch"`. - **Card inside an `ItemsRepeater`/`ListView` item template that should fill the item slot**: `HorizontalAlignment="Stretch"`. - **Compact / chip-style card sized to its content**: leave alignment unset (default behavior). Setting `Width`/`Height` on the inner content of the `ContentTemplate` will not stretch the card — the alignment must be set on the `CardContentControl` element. ## Style Variants `CardContentControl` exposes three semantic style keys. Each design-theme provides its own concrete look; the key names are shared across themes. | Style | When to use | |-------|-------------| | `ElevatedCardContentControlStyle` | Subtle z-axis elevation; default choice for surfaced content | | `FilledCardContentControlStyle` | Background tint, no elevation; use on busy backgrounds | | `OutlinedCardContentControlStyle` | Stroke instead of fill/elevation; secondary content | ## Related Skills - [[uno-toolkit-shadowcontainer]] — Custom shadow effects - [[uno-toolkit-lightweight-styling]] — Resource key overrides for cards
在 GitHub 查看