Uno add-sample
Create a SamplesApp sample page with correct registration, theming, and attributes. Use when adding UI samples for controls.
git clone https://github.com/unoplatform/uno
T=$(mktemp -d) && git clone --depth=1 https://github.com/unoplatform/uno "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/add-sample" ~/.claude/skills/unoplatform-uno-add-sample && rm -rf "$T"
.claude/skills/add-sample/SKILL.mdUser Input
$ARGUMENTS
You MUST consider the user input before proceeding (if not empty).
Overview
You are executing the Add Sample Skill. This skill creates a SamplesApp sample page with correct XAML, code-behind, attribute setup, and — critically — the manual registration in
UITests.Shared.projitems that is required because EnableAutomaticXamlPageInclusion is false.
The #1 silent failure when adding samples is forgetting the projitems registration. This skill ensures it never happens.
Execution Workflow
Phase 0: Determine Location & Names
-
Parse user input for:
- Control name: The control being demonstrated (e.g.,
,Button
,TreeView
)NavigationView - Scenario: What the sample demonstrates (e.g.,
,BasicUsage
,CustomStyle
)DataBinding
- Control name: The control being demonstrated (e.g.,
-
Find existing folder under
matching the control's namespace:src/SamplesApp/UITests.Shared/- WinUI controls:
(e.g.,Microsoft_UI_Xaml_Controls/
)Microsoft_UI_Xaml_Controls/NavigationViewTests/ - XAML framework:
(e.g.,Windows_UI_Xaml_Controls/
)Windows_UI_Xaml_Controls/Button/ - Shapes:
Windows_UI_Xaml_Shapes/ - Media:
Windows_UI_Xaml_Media/ - Search for existing samples of the same control to find the right folder
- WinUI controls:
-
Generate file names:
andControlName_Scenario.xamlControlName_Scenario.xaml.cs- Follow the naming convention of nearby existing samples
- Use PascalCase with underscores separating control from scenario
Phase 1: Create XAML Page
Create the XAML file with:
- Standard
root elementPage - Correct namespace declarations for the control
for Background (NOT hardcoded colors — supports light/dark theme){ThemeResource ApplicationPageBackgroundThemeBrush}- The control being demonstrated with meaningful property settings
- Follow patterns from nearby existing samples in the same folder
Template:
<Page x:Class="UITests.FolderNamespace.ControlName_Scenario" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel Spacing="8" Padding="16"> <!-- Sample content here --> </StackPanel> </Page>
Phase 2: Create Code-Behind
Create the code-behind file with:
- Namespace matching the folder structure:
UITests.<FolderNamespace>
attribute from[Sample("CategoryName")]Uno.UI.Samples.Controls
inheriting fromsealed partial classPage
in constructorthis.InitializeComponent()
Template:
using Uno.UI.Samples.Controls; namespace UITests.FolderNamespace; [Sample("CategoryName", Description = "Brief description of what this sample demonstrates")] public sealed partial class ControlName_Scenario : Page { public ControlName_Scenario() { this.InitializeComponent(); } }
Available
attribute properties:[Sample]
| Property | Type | Usage |
|---|---|---|
| Constructor parameter | | Category name (required) — displayed in sample browser |
| | Display name (defaults to class name) |
| | Expected behavior explanation |
| | For animations, external dependencies |
| | Skip in automated screenshot tests |
| | Auto-set as DataContext |
Phase 3: Register in projitems (CRITICAL)
File:
src/SamplesApp/UITests.Shared/UITests.Shared.projitems
This step is MANDATORY —
EnableAutomaticXamlPageInclusion is false, so without manual registration the sample will silently not appear.
-
Add
entry in the appropriate<Page>
:<ItemGroup><Page Include="$(MSBuildThisFileDirectory)FolderName\SampleName.xaml"> <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> </Page> -
Add
entry in the appropriate<Compile>
:<ItemGroup><Compile Include="$(MSBuildThisFileDirectory)FolderName\SampleName.xaml.cs"> <DependentUpon>SampleName.xaml</DependentUpon> </Compile> -
Insert in alphabetical order within the existing
entries for the same folder.<ItemGroup> -
Verify the entries are correctly placed by checking nearby entries in the projitems file.
Phase 4: Format XAML
Run XamlStyler on the new XAML file to ensure it matches the project's formatting standards:
dotnet xstyler -f src/SamplesApp/UITests.Shared/FolderName/SampleName.xaml
Phase 5: Verification
-
Build to verify compilation:
dotnet build src/SamplesApp/SamplesApp.Skia.Generic/SamplesApp.Skia.Generic.csproj -f net10.0 -
Remind the user:
"Run SamplesApp and search for 'ControlName_Scenario' in the sample browser to verify the sample appears and renders correctly."
Key File References
- Sample attribute source:
src/SamplesApp/SamplesApp.UnitTests.Shared/Controls/UITests/Views/Controls/SampleAttribute.cs - Registration file:
src/SamplesApp/UITests.Shared/UITests.Shared.projitems - Example samples: Browse
for patternssrc/SamplesApp/UITests.Shared/Windows_UI_Xaml_Controls/
Common Mistakes to Avoid
- Forgetting projitems registration — the sample will compile but not appear in the browser
- Hardcoding Background colors — use
instead{ThemeResource ApplicationPageBackgroundThemeBrush} - Wrong namespace in code-behind — must match the folder structure under
UITests. - Missing
call — XAML won't be loadedInitializeComponent() - Wrong
in XAML — must match the fully qualified class name in code-behindx:Class