Rework the Win11 Creator tab into a three step wizard - #4925
Rework the Win11 Creator tab into a three step wizard#4925MyDrift-user wants to merge 3 commits into
Conversation
- Turn the stacked sections into pages you can navigate between - Move the edition picker and driver option to the modify step - Show a working page while mounting and modifying run - Show what the run changes and a finished panel with the output path - Put the status log in its own card next to the steps - Rename Clean & Reset to Start Over and move it below the actions
📝 WalkthroughSummary by CodeRabbit
WalkthroughThe Win11 Creator ISO workflow was redesigned as a three-step wizard. PowerShell now centralizes wizard navigation and operation states. The UI adds structured output, USB completion, status logging, and Start Over behavior. Documentation and validation controls were updated. ChangesWin11 Creator wizard
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant User
participant MainHandlers
participant InvokeWinUtilISO
participant Win11ISO
participant InvokeWinUtilISOUSB
User->>MainHandlers: Select back or forward navigation
MainHandlers->>InvokeWinUtilISO: Request wizard step change
InvokeWinUtilISO->>Win11ISO: Update page, navigation, and working state
InvokeWinUtilISO->>Win11ISO: Show output completion after export
InvokeWinUtilISOUSB->>Win11ISO: Show USB completion status
Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
- Take button text and icon colour from the button they sit in - Stop the implicit TextBlock style painting a label background on buttons - Colour step headers from the tab item state - Use the label accent for headings and field labels like the other tabs
- Render button icon and label from a ContentTemplate, glyph goes in Tag - Render the step header from a HeaderTemplate the same way - Move the page scroll wrapper into the tab control template - Derive the text styles from one another instead of repeating setters
|
this is awesome |
|
@coderabbitai please review |
|
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 7
🧹 Nitpick comments (1)
functions/private/Invoke-WinUtilISO.ps1 (1)
28-32: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winMark
-Stepas mandatory.
[ValidateSet]does not reject an omitted parameter. If a caller omits-Step, line 42 resolves$sync["WPFWin11ISOSection"], which is$null, and the assignment throws. Line 38 also silently disables every step. All current call sites pass-Step, so this is a guard for future callers.🛡️ Proposed fix
param( + [Parameter(Mandatory)] [ValidateSet("Select", "Modify", "Working", "Output")] [string]$Step, [string]$Label )Also applies to: 42-42
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@functions/private/Invoke-WinUtilISO.ps1` around lines 28 - 32, Mark the Step parameter in Invoke-WinUtilISO as mandatory while preserving its existing ValidateSet values, so callers must provide a valid step before the function accesses sync state or executes step-specific logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/src/content/docs/guides/win11creator.mdx`:
- Line 26: Update the introductory wizard description to hyphenate “three-step”
in the sentence beginning “The tab is a,” leaving the rest of the documentation
unchanged.
- Line 45: Remove the duplicated “Run Windows ISO Modification and Creator”
instruction in the Win11 creator guide, keeping a single copy before the
customization process description.
- Line 112: Update the cleanup section heading near the Start Over instructions
by removing the obsolete “Step 5” numeric label, using “Start Over (Optional)”
while preserving the existing cleanup content.
- Line 74: Remove the unsupported boot.wim driver-injection claim from the Step
2 description in win11creator.mdx, and update the corresponding boot.wim entry
in architecture.mdx to reflect that injection only targets install.wim.
In `@scripts/main.ps1`:
- Around line 520-528: Ensure the WPFWin11ISOBackButton and
WPFWin11ISOForwardButton click behavior is registered before the generic
per-control handler can intercept them: either move their existing Add_Click
handlers ahead of that registration or add explicit cases in Invoke-WPFButton
for both names that select WPFWin11ISOSelectSection and WPFWin11ISOModifySection
respectively.
In `@xaml/inputXML.xaml`:
- Around line 1574-1584: Update both chevron buttons, WPFWin11ISOBackButton and
the corresponding button near the following block, so their dimensions scale
with Win11StepTitleFontSize instead of remaining fixed at Width="44" and
Height="72". Use MinWidth/MinHeight with appropriate Padding or bind the width
and height to the scaled resource, ensuring the glyph remains fully visible at
large scale factors.
- Line 1913: Update the verification UI flow using WPFWin11ISOArchLabel so it is
populated from the ISO image architecture metadata alongside
WPFWin11ISOMountDriveLetter and WPFWin11ISOImageFile; if architecture is not
supported or displayed, remove the unused WPFWin11ISOArchLabel control and its
related references.
---
Nitpick comments:
In `@functions/private/Invoke-WinUtilISO.ps1`:
- Around line 28-32: Mark the Step parameter in Invoke-WinUtilISO as mandatory
while preserving its existing ValidateSet values, so callers must provide a
valid step before the function accesses sync state or executes step-specific
logic.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: e00538db-98dc-44dc-b0f2-3419627ea40c
📒 Files selected for processing (9)
config/themes.jsondocs/src/content/docs/code-reference/architecture.mdxdocs/src/content/docs/guides/win11creator.mdxfunctions/private/Invoke-WinUtilFontScaling.ps1functions/private/Invoke-WinUtilISO.ps1functions/private/Invoke-WinUtilISOUSB.ps1pester/xaml.Tests.ps1scripts/main.ps1xaml/inputXML.xaml
|
|
||
| --- | ||
|
|
||
| The tab is a three step wizard. The step you are on is shown in the header row, and you can click an earlier step to go back to it until the image has been modified. The status log on the right stays visible throughout. |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Use a hyphen in “three-step.”
Change “The tab is a three step wizard” to “The tab is a three-step wizard.”
🧰 Tools
🪛 LanguageTool
[grammar] ~26-~26: Use a hyphen to join words.
Context: ...stallation. ::: --- The tab is a three step wizard. The step you are on is show...
(QB_NEW_EN_HYPHEN)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/src/content/docs/guides/win11creator.mdx` at line 26, Update the
introductory wizard description to hyphenate “three-step” in the sentence
beginning “The tab is a,” leaving the rest of the documentation unchanged.
Source: Linters/SAST tools
|
|
||
| Once the ISO is verified, WinUtil moves to this step and shows the mounted drive and image file. Choose your **edition** from the dropdown — Pro is selected by default if available — and tick **Inject current system drivers** if you want them. | ||
|
|
||
| Then click **Run Windows ISO Modification and Creator** to start the customization process. WinUtil will: |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Remove the duplicated modification instruction.
Line 45 repeats the sentence at Line 47. Keep one copy.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/src/content/docs/guides/win11creator.mdx` at line 45, Remove the
duplicated “Run Windows ISO Modification and Creator” instruction in the Win11
creator guide, keeping a single copy before the customization process
description.
|
|
||
| **Optional: Driver Injection** | ||
| - If enabled, it injects all drivers from your current system into the install.wim and boot.wim — useful for offline installations on machines with missing drivers. This is an optional checkbox in Step 3. | ||
| - If enabled, it injects all drivers from your current system into the install.wim and boot.wim — useful for offline installations on machines with missing drivers. This is an optional checkbox in Step 2. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
rg -n -C 8 \
'boot\.wim|InstallImagePath|InstallImageIndex|Add-Driver|InjectCurrentSystemDrivers' \
functions/private/Invoke-WinUtilISOScript.ps1 \
functions/private/Invoke-WinUtilISO.ps1 \
pester/win11creator.Tests.ps1 \
docs/src/content/docs/code-reference/architecture.mdx \
docs/src/content/docs/guides/win11creator.mdxRepository: ChrisTitusTech/winutil
Length of output: 31152
Remove the unsupported boot.wim driver-injection claim.
The current driver-injection path only services install.wim with one mount, one Add-Driver, and one commit. Remove and boot.wim from docs/src/content/docs/guides/win11creator.mdx:74 and update the matching boot.wim entry in docs/src/content/docs/code-reference/architecture.mdx:265-267.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/src/content/docs/guides/win11creator.mdx` at line 74, Remove the
unsupported boot.wim driver-injection claim from the Step 2 description in
win11creator.mdx, and update the corresponding boot.wim entry in
architecture.mdx to reflect that injection only targets install.wim.
| ### Step 5 — Clean Up (Optional) | ||
|
|
||
| Click **Clean & Reset** to delete the temporary working directory (~10–15 GB) and return the tool to its initial state, ready for a new ISO. You will be asked to confirm before anything is deleted. | ||
| Click **Start Over** to delete the temporary working directory (~10–15 GB) and return the tool to its initial state, ready for a new ISO. You will be asked to confirm before anything is deleted. |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Remove the obsolete step number from the cleanup section.
The guide now defines only Steps 1–3, but the cleanup section containing this changed line is still titled Step 5 — Clean Up (Optional). Rename the heading to ### Start Over (Optional) or remove the numeric label.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/src/content/docs/guides/win11creator.mdx` at line 112, Update the
cleanup section heading near the Start Over instructions by removing the
obsolete “Step 5” numeric label, using “Start Over (Optional)” while preserving
the existing cleanup content.
| # The chevrons only show where the neighbouring step is reachable, so each has a single destination | ||
| $sync["WPFWin11ISOBackButton"].Add_Click({ | ||
| $sync["WPFWin11ISOSelectSection"].IsSelected = $true | ||
| }) | ||
|
|
||
| $sync["WPFWin11ISOForwardButton"].Add_Click({ | ||
| $sync["WPFWin11ISOModifySection"].IsSelected = $true | ||
| }) | ||
|
|
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Inspect the Invoke-WPFButton switch and its default branch.
fd -t f 'Invoke-WPFButton.ps1' | xargs -r cat -nRepository: ChrisTitusTech/winutil
Length of output: 5353
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect the surrounding Win11 ISO handlers in scripts/main.ps1.
sed -n '150,175p;512,530p' scripts/main.ps1 | cat -nRepository: ChrisTitusTech/winutil
Length of output: 1975
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Check whether WPFWin11ISOBackButton and WPFWin11ISOForwardButton are declared as Button controls,
# and whether they appear elsewhere as configured feature buttons.
rg -n 'WPFWin11ISO(Base|Back|Forward|Modify|Select).*|WPFWin11ISOBackButton|WPFWin11ISOForwardButton' scripts scripts/main.ps1 scripts --glob '*.ps1' --glob '*.xaml' || true
python3 - <<'PY'
from pathlib import Path
import re
for path in Path('.').rglob('*.xaml'):
if 'WPFWin11ISOBackButton' in path.read_text(errors='ignore') or 'WPFWin11ISOForwardButton' in path.read_text(errors='ignore'):
print(path)
files = list(Path('.').rglob('*.ps1'))
text = '\n'.join(set(f.read_text(errors='ignore') for f in files))
patterns = ['WPFWin11ISOBackButton', 'WPFWin11ISOForwardButton']
for p in patterns:
print(f"{p}: {text.count(p)}")
PYRepository: ChrisTitusTech/winutil
Length of output: 1306
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect relevant XAML declarations and config references to establish whether the generic handler is attached.
sed -n '1,80p' xaml/inputXML.xaml | cat -n
printf '\n--- Back/Forward declarations ---\n'
rg -n -C 3 'WPFWin11ISOBackButton|WPFWin11ISOForwardButton' xaml/inputXML.xaml
printf '\n--- Feature config references ---\n'
rg -n '"WPFWin11ISO(Back|Forward)|WPFWin11ISO(Back|Forward)Button' -S . --glob '*.json' --glob '*.ps1' --glob '*.xaml' || trueRepository: ChrisTitusTech/winutil
Length of output: 6215
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Read the exact XAML declarations and surrounding code to determine whether the explicit handler overrides the generic handler and whether the generic handler calls Invoke-WPFButton twice.
sed -n '1568,1600p' xaml/inputXML.xaml | cat -n
printf '\n--- scripts/main.ps1 generic processing ---\n'
sed -n '140,156p;488,532p' scripts/main.ps1 | cat -n
printf '\n--- PowerShell parser/ParseBlock check ---\n'
python3 - <<'PY'
from pathlib import Path
import re
x = Path("xaml/inputXML.xaml").read_text()
needles = ['WPFWin11ISOBackButton', 'WPFWin11ISOForwardButton']
for n in needles:
before = x.rfind('WPFWin11ISOBackButton' if n == 'WPFWin11ISOBackButton' else 'WPFWin11ISOForwardButton', 0, x.find(n)+100)
snippet = x[:x.find(n, before, x.find(n, before) if n == 'WPFWin11ISOForwardButton' or n == 'WPFWin11ISOBackButton' else len(x))+200]
print("\n---", n, "---")
print(snippet)
EOFRepository: ChrisTitusTech/winutil
Length of output: 5468
🌐 Web query:
PowerShell Add_Click registered event handlers add new handler or replace existing handler
💡 Result:
In PowerShell, calling the add_Click method (or any add_EventName method) on a.NET object registers a new event handler; it does not replace any existing handlers [1][2][3][4]. When an event occurs, all registered handlers are executed in the order they were added [1][3]. To manage this behavior, you have two primary approaches: 1. Use remove_Click to explicitly remove a specific handler. To successfully remove a handler, you must have a reference to the exact same script block object that was originally passed to the add_Click method [5][2][3]. Example: $handler = { Write-Host "Click event handled" } $button.add_Click($handler) # Later, to remove it: $button.remove_Click($handler) Note that if you pass a new script block (e.g., $button.remove_Click({... })), it will not remove the existing one because it is treated as a different object [5]. 2. Use a persistent handler with conditional logic. If you need to change functionality dynamically, register one permanent event handler that checks a variable or state property (such as the Tag property of the control) to determine what code to execute [2][6]. Example: $button.Tag = { Write-Host "Initial action" } $button.add_Click({ if ($this.Tag -is [scriptblock]) { & $this.Tag } }) # To change the action later: $button.Tag = { Write-Host "New action" } Using Register-ObjectEvent is an alternative approach that allows you to manage subscriptions via Unregister-Event, but it is typically used for background events and may introduce different execution behaviors compared to direct.NET event methods [2][7][8]. Direct add/remove methods are generally preferred for Windows Forms GUI controls for their performance and immediate execution [7].
Citations:
- 1: https://stackoverflow.com/questions/73238041/powershell-replace-add-click-link-on-linklabel
- 2: https://stackoverflow.com/questions/16415963/remove-click-event-on-a-button
- 3: https://stackoverflow.com/questions/75740093/powershell-button-add-click-runs-each-time-all-the-previous-clicks
- 4: https://www.sapien.com/blog/2015/08/31/the-methods-that-register-events/
- 5: https://stackoverflow.com/questions/52183504/removing-the-add-click-from-a-winform-button-in-powershell-remove-click
- 6: https://stackoverflow.com/questions/64326699/in-a-powershell-win-forms-gui-is-there-a-way-to-turn-on-turn-off-certain-event
- 7: https://powershelldevtools.wordpress.com/2010/07/14/how-to-use-and-how-not-to-use-eventhandlers/
- 8: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/unregister-event?view=powershell-7.6
🏁 Script executed:
#!/bin/bash
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
x = Path("xaml/inputXML.xaml").read_text()
for name in ["WPFWin11ISOBackButton", "WPFWin11ISOForwardButton"]:
idx = x.find(f'Name="{name}"')
start = x.rfind("<Button", 0, idx)
end = x.find("</Button>", idx)
print(f"{name}:")
print(x[start:end+9])
print("--- contains Click events: " + str(("Click=" in x[start:end+9])))
PYRepository: ChrisTitusTech/winutil
Length of output: 3533
Add handlers for the new ISO chevron buttons in one place.
WPFWin11ISOBackButton and WPFWin11ISOForwardButton are defined as plain Button controls, so the generic per-control loop attaches Invoke-WPFButton $Sender.name. Invoke-WPFButton has no default branch, so those names fall through with no action and can silently ignore clicks. Add these handlers in Invoke-WPFButton.ps1 or move the chevron click handlers before the generic handler is attached.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@scripts/main.ps1` around lines 520 - 528, Ensure the WPFWin11ISOBackButton
and WPFWin11ISOForwardButton click behavior is registered before the generic
per-control handler can intercept them: either move their existing Add_Click
handlers ahead of that registration or add explicit cases in Invoke-WPFButton
for both names that select WPFWin11ISOSelectSection and WPFWin11ISOModifySection
respectively.
| <Button Name="WPFWin11ISOBackButton" | ||
| Grid.Column="0" | ||
| Margin="0,0,10,0" | ||
| Content="" | ||
| FontFamily="Segoe MDL2 Assets" | ||
| FontSize="{DynamicResource Win11StepTitleFontSize}" | ||
| Width="44" Height="72" | ||
| Background="Transparent" | ||
| HorizontalAlignment="Right" VerticalAlignment="Center" | ||
| Panel.ZIndex="1" | ||
| ToolTip="Back to the previous step"> |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Chevron buttons use fixed sizes with a scaled glyph font.
FontSize uses Win11StepTitleFontSize. That resource is now scaled by Invoke-WinUtilFontScaling and reaches 44 at the 2.0 scale factor. Width="44" and Height="72" stay fixed, so the glyph clips at large scale factors. Use MinWidth/MinHeight with Padding, or bind the size to the same scaled resource.
♿ Proposed change for both chevron buttons
- Width="44" Height="72"
+ MinWidth="44" MinHeight="72"
+ Padding="8"Also applies to: 1596-1606
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@xaml/inputXML.xaml` around lines 1574 - 1584, Update both chevron buttons,
WPFWin11ISOBackButton and the corresponding button near the following block, so
their dimensions scale with Win11StepTitleFontSize instead of remaining fixed at
Width="44" and Height="72". Use MinWidth/MinHeight with appropriate Padding or
bind the width and height to the scaled resource, ensuring the glyph remains
fully visible at large scale factors.
| <TextBlock Text="" Style="{StaticResource Win11StepIcon}" Margin="22,0,8,0"/> | ||
| <TextBlock Style="{StaticResource Win11StepCaption}" Text="Image file"/> | ||
| <TextBlock Name="WPFWin11ISOImageFile" Style="{StaticResource Win11StepValue}"/> | ||
| <TextBlock Name="WPFWin11ISOArchLabel" Style="{StaticResource Win11StepValue}" Margin="8,0,0,0"/> |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Find every reference to the Win11 verified-panel labels across the repository.
rg -n -C3 'WPFWin11ISOArchLabel|WPFWin11ISOImageFile|WPFWin11ISOMountDriveLetter' --glob '!winutil.ps1'Repository: ChrisTitusTech/winutil
Length of output: 160
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== repository root files =="
git ls-files | sed -n '1,120p'
echo "== AGENTS.md exists =="
test -f AGENTS.md && echo yes || echo no
[ -f AGENTS.md ] && sed -n '1,200p' AGENTS.md
echo "== locate relevant files =="
git ls-files | rg '(^|/)AGENTS\.md$|inputXML\.xaml$|Invoke-WinUtilISO\.ps1$|winutil\.ps1$' || true
echo "== broad references without exclusions =="
rg -n -C2 'WPFWin11ISOArchLabel|WPFWin11ISOImageFile|WPFWin11ISOMountDriveLetter|Win11.*ISO|ISOArchLabel|ISOImageFile|MountDriveLetter' . || true
echo "== xaml line context =="
if [ -f xaml/inputXML.xaml ]; then
sed -n '1888,1930p' xaml/inputXML.xaml
fi
echo "== script assignment context =="
for f in $(rg -l 'Invoke-WinUtilISO|Win11ISO|WPFWin11ISOArchLabel|WPFWin11ISOImageFile|WPFWin11ISOMountDriveLetter' .); do
echo "--- $f ---"
rg -n -C5 'WPFWin11ISOArchLabel|WPFWin11ISOImageFile|WPFWin11ISOMountDriveLetter|\.Win11ISO|Win11ISO' "$f" || true
doneRepository: ChrisTitusTech/winutil
Length of output: 50381
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== exact matches for relevant UI controls =="
rg -n --fixed-strings 'WPFWin11ISOArchLabel|WPFWin11ISOImageFile|WPFWin11ISOMountDriveLetter' . || true
echo "== Invoke-WinUtilISO relevant section =="
wc -l functions/private/Invoke-WinUtilISO.ps1
rg -n -C8 'WPFWin11ISOPath|WPFWin11ISOFileInfo|WPFWin11ISOMountDriveLetter|WPFWin11ISOImageFile|Invoke-WinUtilISOCheck|Windows ISO|Architecture|arch|Arch|Editions|ISO' functions/private/Invoke-WinUtilISO.ps1 || true
echo "== source files containing UI element references =="
python3 - <<'PY'
from pathlib import Path
targets = [
'WPFWin11ISOPath', 'WPFWin11ISOFileInfo',
'WPFWin11ISOMountDriveLetter', 'WPFWin11ISOImageFile', 'WPFWin11ISOArchLabel',
]
for path in sorted(Path('.').rglob('*')):
if '.git' in path.parts or path.suffix not in {'.ps1','.psm1','.ps1xml','.xaml','.psd1'}:
continue
try:
text = path.read_text(errors='ignore')
except Exception:
continue
hits = [t for t in targets if t in text]
if hits:
print(f'--- {path} ---')
for hit in hits:
print(f'{hit}: {text.count(hit)}')
PY
echo "== compiled/generated generated files around labels if present =="
if [ -f winutil.ps1 ]; then
wc -l winutil.ps1
rg -n -C3 'WPFWin11ISOArchLabel|Win11ISOImageFile|Win11ISOMountDriveLetter|Win11ISOPath|Windows ISO|Architecture' winutil.ps1 || true
else
echo "winutil.ps1 not present"
fiRepository: ChrisTitusTech/winutil
Length of output: 34166
Set WPFWin11ISOArchLabel from ISO image metadata or remove it.
Invoke-WinUtilISO.ps1 populates WPFWin11ISOMountDriveLetter and WPFWin11ISOImageFile, but no source sets WPFWin11ISOArchLabel. Unless this is intentional for a future architecture panel, update the verification UI path with the ISO architecture or remove the unused control.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@xaml/inputXML.xaml` at line 1913, Update the verification UI flow using
WPFWin11ISOArchLabel so it is populated from the ISO image architecture metadata
alongside WPFWin11ISOMountDriveLetter and WPFWin11ISOImageFile; if architecture
is not supported or displayed, remove the unused WPFWin11ISOArchLabel control
and its related references.

Type of Change
Description
The Win11 Creator tab was one long page. All four steps sat on top of each other and appeared one by one as you got further, so the content kept jumping around and the status log was pushed down the page.
It is now a three step wizard. The steps sit in the header of the panel, and you can click an earlier step to go back until the image has been modified. There are also chevrons next to the content that do the same thing. While mounting or modifying is running you get a working page with a spinning icon, so it is clear the tool is busy and not stuck.
The edition dropdown and the driver checkbox moved from the mount step to the modify step. Both are settings for the modification, so that is where they belong.
The modify step now also lists what the run actually changes in the image. The list is written from what
Invoke-WinUtilISOScriptdoes, not from the docs, because the docs mention stripping unused editions and a component store cleanup that the script does not do.When an ISO or a USB drive is finished, a panel shows what was written and where. Clean & Reset is now called Start Over. It sits at the bottom of the last step with a short line explaining it, since it is the normal way to start the next image and not something risky.
The status log moved into its own card on the right and stays visible the whole time.
Control names are unchanged apart from three things.
WPFWin11ISOMountSectionis gone since the mount step no longer exists as a page, and there are three new names: a label for the image file name and the two chevron buttons.Demo
(Sorry for the EXTREMLY laggy video)
Aufzeichnung.2026-08-05.224204.-.edited.mp4
Verification
Issue related to PR
N/A