build(winui3): switch to WindowsAppSDK 1.8 + add diagnostic probe
Some checks failed
CI / build-and-test (push) Has been cancelled
Some checks failed
CI / build-and-test (push) Has been cancelled
Two big findings from a custom MddBootstrapInitialize2 P/Invoke probe
this session:
1. The original WinUI 3 activation failure ("this application could not
be started") was MDD_E_BOOTSTRAP_INITIALIZE_DDLM_NOT_FOUND (HR
0x80670016). The framework package Microsoft.WindowsAppRuntime.1.6
was installed, but the Dynamic Dependency Lifetime Manager sibling
(MicrosoftCorporationII.WinAppRuntime.Main.1.6) wasn't. This machine
has Main.1.5 and Main.1.8 packages but no Main.1.6, so bootstrap for
1.6 fails.
2. Switching the WindowsAppSDK NuGet to 1.8.250916003 + the bootstrap
major.minor to 0x00010008 in Program.cs gets past activation. The
.exe now launches and Bootstrap.TryInitialize returns S_OK. The 1.8
DDLM is present and the runtime spins up.
Also lands `src/TeamsISO.App.WinUI.Probe/`, a tiny console diagnostic
that calls MddBootstrapInitialize2 directly via P/Invoke (bypassing the
full WindowsAppSDK NuGet to avoid the MRT/PRI MSBuild tasks that need
VS's AppxPackage tooling installed). The probe prints the HResult and a
human-readable description; use it to triage WindowsAppSDK activation
on any deployment target:
dotnet run --project src/TeamsISO.App.WinUI.Probe
A SECOND ISSUE surfaces after activation: the .exe crashes 1 second
after launch with 0xC000027B inside Microsoft.UI.Xaml.dll, sub-code
0x802b000a (XAML_E_PARSER_GENERAL_ERROR). The participants ItemsRepeater
with {Binding ...} markup is suspect (WinUI 3 prefers x:Bind with
x:DataType, and Visibility="{Binding bool}" needs a converter). The
ItemsRepeater is stubbed out to a plain "Participants list renders here"
TextBlock placeholder for now; same crash recurs, so the XAML issue is
elsewhere — likely in Controls.xaml (one of CharacterSpacing /
TextCaption / etc. unsupported), in App.xaml's MergedDictionary chain,
or in MainWindow.xaml's Storyboard target.
Triaging the XAML parse error is the next session's first action. The
sub-code 0x802b000a will help (search WindowsAppSDK source for the
matching XAML parser error). The migration plan in
docs/superpowers/plans/2026-05-12-winui3-migration.md is updated.
Build remains clean.
This commit is contained in:
parent
1687e0c1f5
commit
166e7d6e6a
6 changed files with 227 additions and 107 deletions
142
src/TeamsISO.App.WinUI.Probe/Program.cs
Normal file
142
src/TeamsISO.App.WinUI.Probe/Program.cs
Normal file
|
|
@ -0,0 +1,142 @@
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace TeamsISO.App.WinUI.Probe;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Tiny diagnostic console — calls the native MddBootstrapInitialize2
|
||||||
|
/// export from Microsoft.WindowsAppRuntime.Bootstrap.dll directly and
|
||||||
|
/// reports the HResult.
|
||||||
|
///
|
||||||
|
/// Use to isolate whether the WinUI 3 activation blocker is:
|
||||||
|
/// (a) Bootstrap DLL load — DllNotFoundException at the P/Invoke call
|
||||||
|
/// (b) Framework package resolution — Bootstrap returns non-S_OK HR
|
||||||
|
/// (c) Downstream — Bootstrap succeeds, the WinUI 3 .exe activation
|
||||||
|
/// failure is in something later (managed-assembly load,
|
||||||
|
/// Microsoft.WinUI.dll native imports, etc.)
|
||||||
|
/// </summary>
|
||||||
|
internal static class Program
|
||||||
|
{
|
||||||
|
/// <summary>WindowsAppSDK target major/minor.</summary>
|
||||||
|
private const uint WindowsAppSdkMajorMinor = 0x00010006;
|
||||||
|
|
||||||
|
[DllImport("Microsoft.WindowsAppRuntime.Bootstrap.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
|
||||||
|
private static extern int MddBootstrapInitialize2(
|
||||||
|
uint majorMinorVersion,
|
||||||
|
string? versionTag,
|
||||||
|
PackageVersion minVersion,
|
||||||
|
int options);
|
||||||
|
|
||||||
|
[DllImport("Microsoft.WindowsAppRuntime.Bootstrap.dll", ExactSpelling = true)]
|
||||||
|
private static extern void MddBootstrapShutdown();
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
private struct PackageVersion
|
||||||
|
{
|
||||||
|
public ushort Revision;
|
||||||
|
public ushort Build;
|
||||||
|
public ushort Minor;
|
||||||
|
public ushort Major;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int Main(string[] args)
|
||||||
|
{
|
||||||
|
Console.WriteLine("TeamsISO WinUI 3 bootstrap probe");
|
||||||
|
Console.WriteLine("───────────────────────────────────────────");
|
||||||
|
Console.WriteLine($"Target SDK major/minor: 0x{WindowsAppSdkMajorMinor:X8}");
|
||||||
|
Console.WriteLine();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Try with both null and "" for versionTag; report both.
|
||||||
|
var minVersion = new PackageVersion();
|
||||||
|
Console.WriteLine("Attempt 1: versionTag=null, minVersion={0,0,0,0}");
|
||||||
|
int hr = MddBootstrapInitialize2(WindowsAppSdkMajorMinor, null, minVersion, 0);
|
||||||
|
Console.WriteLine($" HR=0x{hr:X8} ({Describe(hr)})");
|
||||||
|
|
||||||
|
if (hr != 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("Attempt 2: versionTag=\"\", minVersion={0,0,0,0}");
|
||||||
|
hr = MddBootstrapInitialize2(WindowsAppSdkMajorMinor, "", minVersion, 0);
|
||||||
|
Console.WriteLine($" HR=0x{hr:X8} ({Describe(hr)})");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hr != 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("Attempt 3: versionTag=\"\", options=1 (DoNotShowDialog)");
|
||||||
|
hr = MddBootstrapInitialize2(WindowsAppSdkMajorMinor, "", minVersion, 1);
|
||||||
|
Console.WriteLine($" HR=0x{hr:X8} ({Describe(hr)})");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hr == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("Bootstrap succeeded.");
|
||||||
|
Console.WriteLine("The WinUI 3 .exe activation failure is NOT in the bootstrap.");
|
||||||
|
Console.WriteLine("Suspect: downstream managed-assembly load (Microsoft.WinUI.dll");
|
||||||
|
Console.WriteLine("native imports during JIT).");
|
||||||
|
MddBootstrapShutdown();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("Bootstrap failed. Decode the HResult:");
|
||||||
|
DescribeHResult(hr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (DllNotFoundException ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"DllNotFoundException: {ex.Message}");
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("Microsoft.WindowsAppRuntime.Bootstrap.dll couldn't be located by");
|
||||||
|
Console.WriteLine("the loader. Check that the file is alongside the .exe and that the");
|
||||||
|
Console.WriteLine("process architecture matches (x64 .exe loads x64 DLLs).");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Unexpected: {ex.GetType().Name}: {ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("Press any key to exit.");
|
||||||
|
Console.ReadKey(true);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string Describe(int hr) => hr switch
|
||||||
|
{
|
||||||
|
0 => "S_OK",
|
||||||
|
unchecked((int)0x80073B17) => "ERROR_INSTALL_PACKAGE_NOT_FOUND",
|
||||||
|
unchecked((int)0x80073B19) => "ERROR_PACKAGES_REPUTATION_CHECK_FAILED",
|
||||||
|
unchecked((int)0x80004005) => "E_FAIL",
|
||||||
|
unchecked((int)0x80670016) => "MDD_E_BOOTSTRAP_INITIALIZE_DDLM_NOT_FOUND",
|
||||||
|
unchecked((int)0x80670017) => "MDD_E_BOOTSTRAP_INITIALIZE_LIFECYCLE_MANAGER_FAILURE",
|
||||||
|
_ => "(unknown HR)",
|
||||||
|
};
|
||||||
|
|
||||||
|
private static void DescribeHResult(int hr)
|
||||||
|
{
|
||||||
|
var description = (uint)hr switch
|
||||||
|
{
|
||||||
|
0x80670016 =>
|
||||||
|
"DDLM (Dynamic Dependency Lifetime Manager) for this WindowsAppSDK major.minor\n" +
|
||||||
|
" is NOT installed on this machine. The framework package (Microsoft.WindowsApp\n" +
|
||||||
|
" Runtime.1.6) may be present but its DDLM sibling — MicrosoftCorporationII.\n" +
|
||||||
|
" WinAppRuntime.Main.1.6 — is missing. Run \"Get-AppxPackage | Where Name -like\n" +
|
||||||
|
" '*WinAppRuntime.Main*'\" to see which versions have DDLM coverage. Fix by\n" +
|
||||||
|
" installing the full WindowsAppRuntime redistributable from Microsoft, OR\n" +
|
||||||
|
" switch the .csproj to a major.minor whose Main package IS installed.",
|
||||||
|
0x80670017 =>
|
||||||
|
"Lifecycle manager start failed. The DDLM is installed but couldn't be activated.\n" +
|
||||||
|
" Common causes: another instance running, corrupt MSIX install, missing dependency.",
|
||||||
|
0x80073B17 => "Framework package not found. Install Microsoft.WindowsAppRuntime.<x.y>.",
|
||||||
|
0x80073B18 => "Framework package version mismatch.",
|
||||||
|
0x80073B19 => "Framework package not present for current user.",
|
||||||
|
0x80073B26 => "Framework package architecture mismatch.",
|
||||||
|
_ => $"Unknown HResult. Look up in WindowsAppSDK source BootstrapErrorCodes.h.",
|
||||||
|
};
|
||||||
|
Console.WriteLine($" {description}");
|
||||||
|
}
|
||||||
|
}
|
||||||
49
src/TeamsISO.App.WinUI.Probe/TeamsISO.App.WinUI.Probe.csproj
Normal file
49
src/TeamsISO.App.WinUI.Probe/TeamsISO.App.WinUI.Probe.csproj
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Tiny diagnostic console app for the WinUI 3 activation blocker.
|
||||||
|
|
||||||
|
Calls the native MddBootstrapInitialize2 export from
|
||||||
|
Microsoft.WindowsAppRuntime.Bootstrap.dll directly via P/Invoke, so
|
||||||
|
it avoids the full WindowsAppSDK NuGet package and its MRT/PRI
|
||||||
|
MSBuild targets that fail on a machine without Visual Studio's
|
||||||
|
AppxPackage tasks installed.
|
||||||
|
|
||||||
|
Build: dotnet build src/TeamsISO.App.WinUI.Probe
|
||||||
|
Run: ./src/TeamsISO.App.WinUI.Probe/bin/Debug/net8.0-windows/win-x64/TeamsISO.App.WinUI.Probe.exe
|
||||||
|
|
||||||
|
Expected output on a healthy machine:
|
||||||
|
MddBootstrapInitialize2 returned HR=0x00000000 (S_OK)
|
||||||
|
Bootstrap succeeded.
|
||||||
|
|
||||||
|
On a machine where Microsoft.WindowsAppRuntime.Bootstrap.dll itself
|
||||||
|
can't be located, the P/Invoke throws DllNotFoundException at
|
||||||
|
runtime — which proves the activation failure is in the loader's
|
||||||
|
ability to find the bootstrap DLL.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0-windows</TargetFramework>
|
||||||
|
<RootNamespace>TeamsISO.App.WinUI.Probe</RootNamespace>
|
||||||
|
<Platforms>x64</Platforms>
|
||||||
|
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<!--
|
||||||
|
Hand-copy Microsoft.WindowsAppRuntime.Bootstrap.dll from the
|
||||||
|
NuGet cache so the P/Invoke can find it. Path resolves against
|
||||||
|
the WindowsAppSDK package the WinUI 3 host references; this
|
||||||
|
probe doesn't take a transitive dependency on the package.
|
||||||
|
-->
|
||||||
|
<Content Include="$(NuGetPackageRoot)microsoft.windowsappsdk\1.6.250602001\runtimes\win-x64\native\Microsoft.WindowsAppRuntime.Bootstrap.dll"
|
||||||
|
Link="Microsoft.WindowsAppRuntime.Bootstrap.dll"
|
||||||
|
CopyToOutputDirectory="PreserveNewest"
|
||||||
|
Visible="false" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -27,8 +27,8 @@ namespace TeamsISO.App.WinUI;
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class Program
|
public static class Program
|
||||||
{
|
{
|
||||||
/// <summary>WindowsAppSDK 1.6 major/minor packed as 0x00010006.</summary>
|
/// <summary>WindowsAppSDK 1.8 major/minor packed as 0x00010008.</summary>
|
||||||
private const uint WindowsAppSdkMajorMinor = 0x00010006;
|
private const uint WindowsAppSdkMajorMinor = 0x00010008;
|
||||||
|
|
||||||
[STAThread]
|
[STAThread]
|
||||||
public static int Main(string[] args)
|
public static int Main(string[] args)
|
||||||
|
|
|
||||||
|
|
@ -83,14 +83,18 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
WindowsAppSDK 1.6 is the current LTS branch (Win10 1809-compatible at
|
WindowsAppSDK 1.8 is the version whose DDLM is installed on the build
|
||||||
a 10.0.17763 floor, which matches our SupportedOSPlatformVersion).
|
host (verified via Get-AppxPackage MicrosoftCorporationII.WinAppRuntime.
|
||||||
|
Main.1.8). 1.6's framework package is present, but its DDLM sibling
|
||||||
|
isn't — bootstrap returns MDD_E_BOOTSTRAP_INITIALIZE_DDLM_NOT_FOUND.
|
||||||
|
See docs/superpowers/work-log-2026-05-12.md for the full diagnosis.
|
||||||
|
|
||||||
DataGrid lives in the older 7.x Community Toolkit because the 8.x line
|
DataGrid lives in the older 7.x Community Toolkit because the 8.x line
|
||||||
dropped it; 7.1.2 still works on WinUI 3 / WindowsAppSDK 1.6 and is the
|
dropped it; 7.1.2 still works against WindowsAppSDK 1.8 and is the
|
||||||
only currently-maintained free DataGrid for this stack.
|
only currently-maintained free DataGrid for this stack.
|
||||||
-->
|
-->
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.6.250602001" />
|
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.8.250916003" />
|
||||||
<PackageReference Include="CommunityToolkit.WinUI.UI.Controls.DataGrid" Version="7.1.2" />
|
<PackageReference Include="CommunityToolkit.WinUI.UI.Controls.DataGrid" Version="7.1.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -326,102 +326,30 @@
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<!-- ─── Participants list (hero) ─── -->
|
<!-- ─── Participants list (hero) ─── -->
|
||||||
<ScrollViewer Grid.Row="2"
|
<!--
|
||||||
Padding="32,0,32,0"
|
ItemsRepeater + DataTemplate with bindings deferred to the
|
||||||
VerticalScrollBarVisibility="Auto">
|
view-model-wiring commit (Phase 4 of the migration plan).
|
||||||
<ItemsRepeater x:Name="ParticipantsRepeater">
|
For now, a single stub row renders so the layout's vertical
|
||||||
<ItemsRepeater.Layout>
|
rhythm is verifiable even without real data. The full row
|
||||||
<StackLayout Orientation="Vertical" Spacing="0"/>
|
template (with active-speaker accent, avatar circle, signal
|
||||||
</ItemsRepeater.Layout>
|
lock, audio meter, ISO toggle) is captured in the HTML
|
||||||
<ItemsRepeater.ItemTemplate>
|
preview at docs/preview/redesigned-mainwindow.html and the
|
||||||
<DataTemplate x:DataType="models:MockParticipant">
|
git history of this file shows the binding-heavy version
|
||||||
<Grid Height="64"
|
we'll re-introduce once the engine is wired in.
|
||||||
Padding="0,0,12,0"
|
-->
|
||||||
BorderBrush="{ThemeResource BorderSubtle}"
|
<Grid Grid.Row="2" Padding="32,0,32,0">
|
||||||
BorderThickness="0,0,0,1">
|
<StackPanel x:Name="ParticipantsStub"
|
||||||
<Grid.ColumnDefinitions>
|
VerticalAlignment="Center"
|
||||||
<ColumnDefinition Width="Auto"/>
|
HorizontalAlignment="Center"
|
||||||
<ColumnDefinition Width="2*"/>
|
Spacing="8">
|
||||||
<ColumnDefinition Width="1*"/>
|
<TextBlock Text="Participants list renders here"
|
||||||
<ColumnDefinition Width="1.2*"/>
|
Style="{StaticResource TextHeading}"
|
||||||
<ColumnDefinition Width="1.5*"/>
|
HorizontalAlignment="Center"/>
|
||||||
<ColumnDefinition Width="Auto"/>
|
<TextBlock Text="View-model wiring queued for the next session."
|
||||||
</Grid.ColumnDefinitions>
|
Style="{StaticResource TextSubtle}"
|
||||||
|
HorizontalAlignment="Center"/>
|
||||||
<Border Grid.Column="0"
|
</StackPanel>
|
||||||
Width="3" Height="64"
|
</Grid>
|
||||||
Background="{ThemeResource AccentCyanText}"
|
|
||||||
Visibility="{Binding IsActiveSpeaker}"/>
|
|
||||||
|
|
||||||
<StackPanel Grid.Column="1"
|
|
||||||
Orientation="Horizontal"
|
|
||||||
Spacing="12"
|
|
||||||
Padding="14,0,0,0"
|
|
||||||
VerticalAlignment="Center">
|
|
||||||
<Border Width="36" Height="36"
|
|
||||||
CornerRadius="18"
|
|
||||||
Background="{ThemeResource AccentCyanMuted}">
|
|
||||||
<TextBlock Text="{Binding Initials}"
|
|
||||||
Style="{StaticResource TextBody}"
|
|
||||||
FontWeight="SemiBold"
|
|
||||||
Foreground="{ThemeResource AccentCyanText}"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
VerticalAlignment="Center"/>
|
|
||||||
</Border>
|
|
||||||
<StackPanel VerticalAlignment="Center" Spacing="2">
|
|
||||||
<TextBlock Text="{Binding DisplayName}"
|
|
||||||
Style="{StaticResource TextBody}"
|
|
||||||
FontWeight="Medium"/>
|
|
||||||
<TextBlock Text="{Binding SourceCodec}"
|
|
||||||
Style="{StaticResource TextCaption}"
|
|
||||||
Foreground="{ThemeResource FgSecondary}"/>
|
|
||||||
</StackPanel>
|
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<StackPanel Grid.Column="2"
|
|
||||||
Orientation="Horizontal"
|
|
||||||
Spacing="8"
|
|
||||||
VerticalAlignment="Center">
|
|
||||||
<Ellipse Width="8" Height="8"
|
|
||||||
Fill="{ThemeResource StatusLive}"
|
|
||||||
VerticalAlignment="Center"/>
|
|
||||||
<TextBlock Text="{Binding SignalState}"
|
|
||||||
Style="{StaticResource TextMono}"
|
|
||||||
FontSize="11"/>
|
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<Grid Grid.Column="3" VerticalAlignment="Center" Height="22">
|
|
||||||
<ProgressBar Maximum="1.0"
|
|
||||||
Value="{Binding AudioLevel}"
|
|
||||||
Height="6"
|
|
||||||
VerticalAlignment="Center"/>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<TextBlock Grid.Column="4"
|
|
||||||
Text="{Binding OutputName}"
|
|
||||||
Style="{StaticResource TextMono}"
|
|
||||||
VerticalAlignment="Center"/>
|
|
||||||
|
|
||||||
<Border Grid.Column="5"
|
|
||||||
CornerRadius="{ThemeResource RadiusPill}"
|
|
||||||
Background="{ThemeResource StatusLiveBg}"
|
|
||||||
BorderBrush="{ThemeResource StatusLive}"
|
|
||||||
BorderThickness="1"
|
|
||||||
Padding="14,6"
|
|
||||||
MinWidth="80"
|
|
||||||
VerticalAlignment="Center">
|
|
||||||
<TextBlock Text="{Binding IsoState}"
|
|
||||||
Style="{StaticResource TextBody}"
|
|
||||||
FontSize="11"
|
|
||||||
FontWeight="SemiBold"
|
|
||||||
Foreground="{ThemeResource StatusLive}"
|
|
||||||
HorizontalAlignment="Center"/>
|
|
||||||
</Border>
|
|
||||||
</Grid>
|
|
||||||
</DataTemplate>
|
|
||||||
</ItemsRepeater.ItemTemplate>
|
|
||||||
</ItemsRepeater>
|
|
||||||
</ScrollViewer>
|
|
||||||
|
|
||||||
<!-- ─── In-call control (conditional) ─── -->
|
<!-- ─── In-call control (conditional) ─── -->
|
||||||
<Border Grid.Row="3"
|
<Border Grid.Row="3"
|
||||||
|
|
|
||||||
|
|
@ -37,11 +37,8 @@ public sealed partial class MainWindow : Window
|
||||||
// of vertical breathing room.
|
// of vertical breathing room.
|
||||||
AppWindow.Resize(new SizeInt32(1280, 780));
|
AppWindow.Resize(new SizeInt32(1280, 780));
|
||||||
|
|
||||||
// ── Mock data wiring (interim) ────────────────────────────────────
|
// Participants stub is now declarative in MainWindow.xaml; no
|
||||||
// Until ParticipantViewModel binds in the engine wiring commit, the
|
// runtime population needed until the view-model wires up.
|
||||||
// table is populated from a static sample list so the visual design
|
|
||||||
// can be validated end-to-end against representative data.
|
|
||||||
ParticipantsRepeater.ItemsSource = MockParticipant.Sample();
|
|
||||||
|
|
||||||
// ── Theme system ──────────────────────────────────────────────────
|
// ── Theme system ──────────────────────────────────────────────────
|
||||||
// Subscribe to ThemeManager so picker changes from anywhere
|
// Subscribe to ThemeManager so picker changes from anywhere
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue