Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
80c675c
[sample] TableView-in-Reactor demo (native split-binary control, WinA…
hiteshkrmsft Jun 21, 2026
c740b56
[sample] Promote TableView to a first-class Reactor control + fix CPM
hiteshkrmsft Jun 21, 2026
d31b7df
[sample] Package the native TableView control as a NuGet (Microsoft.U…
hiteshkrmsft Jun 21, 2026
e2af978
[sample] Render the native TableView in the code-only Reactor host
hiteshkrmsft Jun 21, 2026
db66680
[sample] selftest also asserts the TableView renders (not just activa…
hiteshkrmsft Jun 22, 2026
103240d
[sample] Integrate native TableView gallery into Reactor.TestApp (dro…
hiteshkrmsft Jun 22, 2026
707bab7
[sample] TableView = consumable first-class Reactor control in TestAp…
hiteshkrmsft Jun 22, 2026
4ab7ab6
[sample] Port full TableView gallery + control into Reactor.TestApp, …
hiteshkrmsft Jun 23, 2026
89b4cc5
[sample] Convert the interop gallery to a FIRST-CLASS Reactor TableVi…
hiteshkrmsft Jun 23, 2026
0aac904
[sample] First-class TableView gallery mimics the real sample + ship …
hiteshkrmsft Jun 23, 2026
592f8ee
[sample] Make the first-class gallery match the reference TableViewSa…
hiteshkrmsft Jun 23, 2026
83d4a25
[sample] Match each gallery page's Options panel to the reference Tab…
hiteshkrmsft Jun 23, 2026
fc3283e
[sample] Refresh native Advanced.dll (chk+fre) with latest advanced-p…
hiteshkrmsft Jun 23, 2026
fe4edd5
[sample] TableView gallery refinements: stretch-to-fill, hierarchy, l…
hiteshkrmsft Jun 23, 2026
b519bfc
[sample] Thorough walkthrough: stretch every table, real Hierarchy pa…
hiteshkrmsft Jun 23, 2026
41a2a77
[sample] Gallery: page-level scrolling + expand hierarchy first level…
hiteshkrmsft Jun 23, 2026
6cad897
[sample] Add a "Source code (C#)" section to every gallery page
hiteshkrmsft Jun 23, 2026
07944e1
[sample] Address PR review feedback (control correctness + x64 gating…
hiteshkrmsft Jun 24, 2026
13fe4f2
Fix stale native pack path in TableView control package
hiteshkrmsft Jun 24, 2026
d322c69
Warn package consumers when WindowsAppSDKSelfContained is unset
hiteshkrmsft Jun 24, 2026
3883e5d
Consume renamed native satellite: Advanced -> Tabular
hiteshkrmsft Jun 24, 2026
255b888
Relabel TableView control POC -> Preview
hiteshkrmsft Jun 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions .github/workflows/tableview-control.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: TableView Control Self-Test

# On-demand (NOT part of the every-PR build). Exercises the native C++/WinRT
# TableView as a first-class Reactor control (Reactor.Controls.TableView, the
# separate-binary Microsoft.UI.Xaml.Controls.Advanced.dll projected to C#)
# consumed by Reactor.TestApp's "TableView" tab. The control is gated behind
# -p:IncludeTableView=true so the shared every-PR CI (which builds Reactor.slnx
# without the flag) is unaffected; this workflow opts in and asserts the control
# builds + (best-effort) renders.
on:
workflow_dispatch:
pull_request:
paths:
- "samples/Reactor.TestApp/Demos/TableViewControlDemo.cs"
- "samples/Reactor.TestApp/GlobalUsings.TableView.cs"
- "samples/Reactor.TestApp/TableViewStrings/**"
- "samples/Reactor.TestApp/app.manifest"
- "samples/Reactor.TestApp/tableview-control-selftest.ps1"
- "samples/Reactor.Controls.TableView/**"
- "samples/TableView.Projection/**"
- ".github/workflows/tableview-control.yml"

permissions:
contents: read

jobs:
tableview-control-selftest:
name: TableView-in-Reactor control self-test
runs-on: windows-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Setup .NET
uses: actions/setup-dotnet@9a946fdbd5fb07b82b2f5a4466058b876ab72bb2 # v5.3.0
with:
dotnet-version: 10.0.x

- name: Build + self-test the TableView control (IncludeTableView=true)
shell: pwsh
run: ./samples/Reactor.TestApp/tableview-control-selftest.ps1 -Configuration Release -Platform x64
50 changes: 50 additions & 0 deletions samples/Reactor.Controls.TableView/Factories.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
using System.Collections;
using System.Collections.Generic;
using Microsoft.UI.Reactor.Core.V1Protocol;
using WinUITableView = Microsoft.UI.Xaml.Controls.TableView;

namespace Reactor.Controls;

/// <summary>
/// DSL factories for the native TableView Reactor control. Import alongside the
/// core Reactor factories:
/// <code>
/// using static Microsoft.UI.Reactor.Factories;
/// using static Reactor.Controls.Factories;
/// </code>
/// </summary>
/// <remarks>
/// Registration model — per-library trim unit. The static constructor registers
/// the <see cref="TableViewHandler"/> with <see cref="ControlRegistry"/> on first
/// touch of any factory below, so an app that never references this library has
/// the whole control surface trimmed away. This mirrors the recommended pattern
/// documented on <c>Microsoft.UI.Reactor.Advanced.Factories</c>.
/// </remarks>
public static partial class Factories
{
static Factories()
{
ControlRegistry.Register<TableViewElement, WinUITableView>(
static () => new TableViewHandler());
// Register the satellite control's XAML metadata provider so the WinUI XAML loader can
// resolve the advanced types when the control's style closure is parsed (code-only host).
TableViewStyles.RegisterMetadata();
}

/// <summary>
/// A native TableView bound to <paramref name="items"/>, with columns
/// auto-generated from the first item's public properties.
/// </summary>
public static TableViewElement TableView(IEnumerable items, double? height = null) =>
new() { Items = items, Height = height };

/// <summary>
/// A native TableView bound to <paramref name="items"/> with explicit
/// <paramref name="columns"/>.
/// </summary>
public static TableViewElement TableView(
IEnumerable items,
IReadOnlyList<TableColumn> columns,
double? height = null) =>
new() { Items = items, Columns = columns, Height = height };
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net10.0-windows10.0.22621.0</TargetFramework>
<!-- x64-only: the native satellite control (Microsoft.UI.Xaml.Controls.Tabular.dll) is shipped solely
as a win-x64 native asset, so restore/build on ARM64 would succeed but fail WinRT activation at
runtime. Restrict to x64 for this Preview (add a win-arm64 native asset to support ARM64). -->
<Platforms>x64</Platforms>
<RootNamespace>Reactor.Controls</RootNamespace>
<AssemblyName>Reactor.Controls.TableView</AssemblyName>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>enable</Nullable>
<UseWinUI>true</UseWinUI>
<WindowsAppSDKSelfContained>false</WindowsAppSDKSelfContained>
<IsAotCompatible>false</IsAotCompatible>
</PropertyGroup>

<!-- == NuGet packaging: consumers reference the native control as a package, not a
committed binary. The native Tabular.dll ships as a win-x64 native runtime asset
(NuGet auto-deploys it next to the consumer exe); the CsWinRT projection is bundled
into lib/; a build/.targets supplies the WinRT activation manifest. == -->
<PropertyGroup>
<IsPackable>true</IsPackable>
<PackageId>Microsoft.UI.Reactor.TableView</PackageId>
<Version Condition="'$(Version)' == ''">0.0.0-preview</Version>
<Authors>Microsoft</Authors>
<Company>Microsoft</Company>
<Description>Preview — the native C++/WinRT TableView (separate-binary Microsoft.UI.Xaml.Controls.Tabular.dll, projected vs public WinAppSDK 2.0.1) as a first-class Reactor control.</Description>
<PackageTags>WinUI;WinUI3;WinAppSDK;Reactor;TableView;control</PackageTags>
<PackageProjectUrl>https://github.com/microsoft/microsoft-ui-reactor</PackageProjectUrl>
<RepositoryUrl>https://github.com/microsoft/microsoft-ui-reactor</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);_BundleTableViewProjection</TargetsForTfmSpecificBuildOutput>
<!-- A WinUI control package legitimately ships a RID-native asset + a build/ manifest. -->
<NoWarn>$(NoWarn);NU5100;NU5118;NU5128</NoWarn>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.WindowsAppSDK" />
</ItemGroup>

<ItemGroup>
<!-- Core Reactor framework. NOTE: referenced as a plain P2P so it builds with the
SAME global properties (RID / SelfContained) as the consuming app — removing
RuntimeIdentifier/SelfContained here produced a second, inconsistent Reactor
build in the graph and crashed the WinAppSDK runtime (Frame.Navigate 0xC0000005)
when this control was referenced alongside a self-contained host. -->
<ProjectReference Include="..\..\src\Reactor\Reactor.csproj" />
<!-- CsWinRT projection of the native split-binary TableView (vs public WinAppSDK 2.0.1).
Not a published package, so PrivateAssets=all + bundled into lib/ below. -->
<ProjectReference Include="..\TableView.Projection\TableView.Projection.csproj"
PrivateAssets="all" />
</ItemGroup>

<ItemGroup>
<!-- native control DLL -> NuGet auto-deploys runtimes/<rid>/native/* to win-x64 consumers.
Ship the optimized fre (release) satellite; the chk flavor under native\chk\ is for
local Debug perf parity in the sample only. -->
<None Include="..\Reactor.TestApp\native\fre\Microsoft.UI.Xaml.Controls.Tabular.dll"
Pack="true" PackagePath="runtimes/win-x64/native/" Visible="false" />
<!-- consumer-side targets + WinRT activation manifest -->
<None Include="build\Microsoft.UI.Reactor.TableView.targets"
Pack="true" PackagePath="build/" Visible="false" />
<None Include="build\app.manifest"
Pack="true" PackagePath="build/" Visible="false" />
<None Include="build\Resources.resw"
Pack="true" PackagePath="build/" Visible="false" />
<None Include="build\merge-tableview-strings.ps1"
Pack="true" PackagePath="build/" Visible="false" />
</ItemGroup>

<ItemGroup>
<!-- Satellite control default Style + theme-resource closure, embedded so it travels with the
assembly and renders for ProjectReference and PackageReference consumers alike. -->
<Page Remove="Styles\*.xaml" />
<EmbeddedResource Include="Styles\*.xaml" />
</ItemGroup>

<!-- Bundle the non-published CsWinRT projection assembly into the package's lib/ folder. -->
<Target Name="_BundleTableViewProjection">
<ItemGroup>
<BuildOutputInPackage Include="$(OutputPath)TableView.Projection.dll" />
</ItemGroup>
</Target>

</Project>
Loading