More windows settings work

This commit is contained in:
rbalsleyMSFT
2025-01-16 23:24:57 -08:00
committed by rbalsleyMSFT
parent f1cfeb0acc
commit fbd0101b45
2 changed files with 180 additions and 85 deletions
+127 -43
View File
@@ -20,6 +20,37 @@ $defaultMediaType = "consumer"
$defaultOptionalFeatures = "" $defaultOptionalFeatures = ""
$defaultProductKey = "" $defaultProductKey = ""
# Large list from the ValidateSet in BuildFFUVM.ps1 ($OptionalFeatures parameter)
$allowedFeatures = @(
"AppServerClient","Client-DeviceLockdown","Client-EmbeddedBootExp","Client-EmbeddedLogon",
"Client-EmbeddedShellLauncher","Client-KeyboardFilter","Client-ProjFS","Client-UnifiedWriteFilter",
"Containers","Containers-DisposableClientVM","Containers-HNS","Containers-SDN","DataCenterBridging",
"DirectoryServices-ADAM-Client","DirectPlay","HostGuardian","HypervisorPlatform","IIS-ApplicationDevelopment",
"IIS-ApplicationInit","IIS-ASP","IIS-ASPNET","IIS-ASPNET45","IIS-BasicAuthentication","IIS-CertProvider",
"IIS-CGI","IIS-ClientCertificateMappingAuthentication","IIS-CommonHttpFeatures","IIS-CustomLogging",
"IIS-DefaultDocument","IIS-DirectoryBrowsing","IIS-DigestAuthentication","IIS-ESP","IIS-FTPServer",
"IIS-FTPExtensibility","IIS-FTPSvc","IIS-HealthAndDiagnostics","IIS-HostableWebCore","IIS-HttpCompressionDynamic",
"IIS-HttpCompressionStatic","IIS-HttpErrors","IIS-HttpLogging","IIS-HttpRedirect","IIS-HttpTracing",
"IIS-IPSecurity","IIS-IIS6ManagementCompatibility","IIS-IISCertificateMappingAuthentication",
"IIS-ISAPIExtensions","IIS-ISAPIFilter","IIS-LoggingLibraries","IIS-ManagementConsole","IIS-ManagementService",
"IIS-ManagementScriptingTools","IIS-Metabase","IIS-NetFxExtensibility","IIS-NetFxExtensibility45",
"IIS-ODBCLogging","IIS-Performance","IIS-RequestFiltering","IIS-RequestMonitor","IIS-Security","IIS-ServerSideIncludes",
"IIS-StaticContent","IIS-URLAuthorization","IIS-WebDAV","IIS-WebServer","IIS-WebServerManagementTools",
"IIS-WebServerRole","IIS-WebSockets","LegacyComponents","MediaPlayback","Microsoft-Hyper-V","Microsoft-Hyper-V-All",
"Microsoft-Hyper-V-Hypervisor","Microsoft-Hyper-V-Management-Clients","Microsoft-Hyper-V-Management-PowerShell",
"Microsoft-Hyper-V-Services","Microsoft-Windows-Subsystem-Linux","MSMQ-ADIntegration","MSMQ-Container","MSMQ-DCOMProxy",
"MSMQ-HTTP","MSMQ-Multicast","MSMQ-Server","MSMQ-Triggers","MultiPoint-Connector","MultiPoint-Connector-Services",
"MultiPoint-Tools","NetFx3","NetFx4-AdvSrvs","NetFx4Extended-ASPNET45","NFS-Administration","Printing-Foundation-Features",
"Printing-Foundation-InternetPrinting-Client","Printing-Foundation-LPDPrintService","Printing-Foundation-LPRPortMonitor",
"Printing-PrintToPDFServices-Features","Printing-XPSServices-Features","SearchEngine-Client-Package",
"ServicesForNFS-ClientOnly","SimpleTCP","SMB1Protocol","SMB1Protocol-Client","SMB1Protocol-Deprecation",
"SMB1Protocol-Server","SmbDirect","TFTP","TelnetClient","TIFFIFilter","VirtualMachinePlatform","WAS-ConfigurationAPI",
"WAS-NetFxEnvironment","WAS-ProcessModel","WAS-WindowsActivationService","WCF-HTTP-Activation","WCF-HTTP-Activation45",
"WCF-MSMQ-Activation45","WCF-NonHTTP-Activation","WCF-Pipe-Activation45","WCF-Services45","WCF-TCP-Activation45",
"WCF-TCP-PortSharing45","Windows-Defender-ApplicationGuard","Windows-Defender-Default-Definitions","Windows-Identity-Foundation",
"WindowsMediaPlayer","WorkFolders-Client"
)
$skuList = @( $skuList = @(
'Home','Home N','Home Single Language','Education','Education N','Pro', 'Home','Home N','Home Single Language','Education','Education N','Pro',
'Pro N','Pro Education','Pro Education N','Pro for Workstations', 'Pro N','Pro Education','Pro Education N','Pro for Workstations',
@@ -27,7 +58,6 @@ $skuList = @(
'Standard (Desktop Experience)','Datacenter','Datacenter (Desktop Experience)' 'Standard (Desktop Experience)','Datacenter','Datacenter (Desktop Experience)'
) )
# Info icons
$imageNames = @( $imageNames = @(
"imgFFUNameInfo", "imgFFUNameInfo",
"imgISOPathInfo", "imgISOPathInfo",
@@ -50,7 +80,7 @@ $imageNames = @(
"imgCopyPEDriversInfo" "imgCopyPEDriversInfo"
) )
# Full list of Windows releases (for when ISO path is non-blank) # Full list of Windows releases (if ISO path != blank)
$allWindowsReleases = @( $allWindowsReleases = @(
[PSCustomObject]@{ Display = "Windows 10"; Value = 10 }, [PSCustomObject]@{ Display = "Windows 10"; Value = 10 },
[PSCustomObject]@{ Display = "Windows 11"; Value = 11 }, [PSCustomObject]@{ Display = "Windows 11"; Value = 11 },
@@ -59,13 +89,14 @@ $allWindowsReleases = @(
[PSCustomObject]@{ Display = "Windows Server 2022"; Value = 2022 }, [PSCustomObject]@{ Display = "Windows Server 2022"; Value = 2022 },
[PSCustomObject]@{ Display = "Windows Server 2025"; Value = 2025 } [PSCustomObject]@{ Display = "Windows Server 2025"; Value = 2025 }
) )
# Subset for MCT (Media Creation Tool) only
# Subset for MCT (if ISO path is blank)
$mctWindowsReleases = @( $mctWindowsReleases = @(
[PSCustomObject]@{ Display = "Windows 10"; Value = 10 }, [PSCustomObject]@{ Display = "Windows 10"; Value = 10 },
[PSCustomObject]@{ Display = "Windows 11"; Value = 11 } [PSCustomObject]@{ Display = "Windows 11"; Value = 11 }
) )
# Windows version sets for each release (for "Version" combobox) # Windows version sets
$windowsVersionMap = @{ $windowsVersionMap = @{
10 = @("22H2") 10 = @("22H2")
11 = @("22H2","23H2","24H2") 11 = @("22H2","23H2","24H2")
@@ -189,37 +220,30 @@ function Get-UIConfig {
return $config return $config
} }
# This function updates the Windows Release list:
# - If ISO path is blank => only show Windows 10, Windows 11
# - If ISO path is not blank => show all releases
function UpdateWindowsReleaseList { function UpdateWindowsReleaseList {
param([string]$isoPath) param([string]$isoPath)
if (-not $script:cmbWindowsRelease) { return } if (-not $script:cmbWindowsRelease) { return }
# Remember old item
$oldItem = $script:cmbWindowsRelease.SelectedItem $oldItem = $script:cmbWindowsRelease.SelectedItem
# Clear
$script:cmbWindowsRelease.Items.Clear() $script:cmbWindowsRelease.Items.Clear()
# IMPORTANT: Set these paths so the ComboBox shows 'Display' text
$script:cmbWindowsRelease.DisplayMemberPath = 'Display' $script:cmbWindowsRelease.DisplayMemberPath = 'Display'
$script:cmbWindowsRelease.SelectedValuePath = 'Value' $script:cmbWindowsRelease.SelectedValuePath = 'Value'
# If blank => only MCT
if ([string]::IsNullOrEmpty($isoPath)) { if ([string]::IsNullOrEmpty($isoPath)) {
# Only MCT
foreach ($rel in $mctWindowsReleases) { foreach ($rel in $mctWindowsReleases) {
$script:cmbWindowsRelease.Items.Add($rel) | Out-Null $script:cmbWindowsRelease.Items.Add($rel) | Out-Null
} }
} }
else { else {
# Full list
foreach ($rel in $allWindowsReleases) { foreach ($rel in $allWindowsReleases) {
$script:cmbWindowsRelease.Items.Add($rel) | Out-Null $script:cmbWindowsRelease.Items.Add($rel) | Out-Null
} }
} }
# Attempt to re-select old item (based on Value)
if ($oldItem) { if ($oldItem) {
$reSelect = $script:cmbWindowsRelease.Items | Where-Object { $_.Value -eq $oldItem.Value } $reSelect = $script:cmbWindowsRelease.Items | Where-Object { $_.Value -eq $oldItem.Value }
if ($reSelect) { if ($reSelect) {
@@ -252,6 +276,7 @@ function UpdateWindowsVersionCombo {
$validVersions = $windowsVersionMap[$selectedRelease] $validVersions = $windowsVersionMap[$selectedRelease]
if ([string]::IsNullOrEmpty($isoPath)) { if ([string]::IsNullOrEmpty($isoPath)) {
# MCT usage => locked & pick default
switch ($selectedRelease) { switch ($selectedRelease) {
10 { $default = "22H2" } 10 { $default = "22H2" }
11 { $default = "24H2" } 11 { $default = "24H2" }
@@ -266,10 +291,19 @@ function UpdateWindowsVersionCombo {
$combo.IsEnabled = $false $combo.IsEnabled = $false
} }
else { else {
# ISO => user can choose
foreach ($v in $validVersions) { foreach ($v in $validVersions) {
[void]$combo.Items.Add($v) [void]$combo.Items.Add($v)
} }
# If Windows 11 => default to 24H2 if available
if ($selectedRelease -eq 11 -and $validVersions -contains "24H2") {
$combo.SelectedItem = "24H2"
}
else {
$combo.SelectedIndex = 0 $combo.SelectedIndex = 0
}
$combo.IsEnabled = $true $combo.IsEnabled = $true
} }
} }
@@ -277,10 +311,8 @@ function UpdateWindowsVersionCombo {
$script:RefreshWindowsUI = { $script:RefreshWindowsUI = {
param([string]$isoPath) param([string]$isoPath)
# Refresh releases
UpdateWindowsReleaseList -isoPath $isoPath UpdateWindowsReleaseList -isoPath $isoPath
# Then refresh version
$selItem = $script:cmbWindowsRelease.SelectedItem $selItem = $script:cmbWindowsRelease.SelectedItem
if ($selItem -and $selItem.Value -is [int]) { if ($selItem -and $selItem.Value -is [int]) {
$selectedRelease = [int]$selItem.Value $selectedRelease = [int]$selItem.Value
@@ -311,32 +343,89 @@ foreach ($imgName in $imageNames) {
Set-ImageSource -window $window -imageName $imgName -sourcePath $infoImagePath Set-ImageSource -window $window -imageName $imgName -sourcePath $infoImagePath
} }
# We'll store dynamic checkboxes for each optional feature
$script:featureCheckBoxes = @{}
function UpdateOptionalFeaturesString { function UpdateOptionalFeaturesString {
if ($script:chkTelnetClient -and $script:chkNetFx3 -and $script:chkDirectPlay -and $script:chkSMB1Protocol -and $script:txtOptionalFeatures) { # Collect all features that are checked
$f = @() $checkedFeatures = @()
if ($script:chkTelnetClient.IsChecked) { $f += "TelnetClient" } foreach ($entry in $script:featureCheckBoxes.GetEnumerator()) {
if ($script:chkNetFx3.IsChecked) { $f += "NetFx3" } if ($entry.Value.IsChecked) {
if ($script:chkDirectPlay.IsChecked) { $f += "DirectPlay" } $checkedFeatures += $entry.Key
if ($script:chkSMB1Protocol.IsChecked) { $f += "SMB1Protocol" }
$script:txtOptionalFeatures.Text = $f -join ";"
} }
} }
$script:txtOptionalFeatures.Text = $checkedFeatures -join ";"
}
# Create the dynamic multi-column grid of feature checkboxes
function BuildFeaturesGrid {
param (
[System.Windows.FrameworkElement]$parent
)
$parent.Children.Clear()
$sortedFeatures = $allowedFeatures | Sort-Object
# Now 10 features per column
$rows = 10
$columns = [math]::Ceiling($sortedFeatures.Count / $rows)
$featuresGrid = New-Object System.Windows.Controls.Grid
$featuresGrid.Margin = "0,5,0,5"
$featuresGrid.ShowGridLines = $false
# Define rows
for ($r = 0; $r -lt $rows; $r++) {
$rowDef = New-Object System.Windows.Controls.RowDefinition
$rowDef.Height = 'Auto'
$featuresGrid.RowDefinitions.Add($rowDef) | Out-Null
}
# Define columns
for ($c = 0; $c -lt $columns; $c++) {
$colDef = New-Object System.Windows.Controls.ColumnDefinition
$colDef.Width = 'Auto'
$featuresGrid.ColumnDefinitions.Add($colDef) | Out-Null
}
for ($i = 0; $i -lt $sortedFeatures.Count; $i++) {
$featureName = $sortedFeatures[$i]
$colIndex = [int]([math]::Floor($i / $rows))
$rowIndex = $i % $rows
$chk = New-Object System.Windows.Controls.CheckBox
$chk.Content = $featureName
$chk.Margin = '5,2,15,2'
$chk.Add_Checked({
UpdateOptionalFeaturesString
})
$chk.Add_Unchecked({
UpdateOptionalFeaturesString
})
$script:featureCheckBoxes[$featureName] = $chk
[System.Windows.Controls.Grid]::SetRow($chk, $rowIndex)
[System.Windows.Controls.Grid]::SetColumn($chk, $colIndex)
$featuresGrid.Children.Add($chk) | Out-Null
}
$parent.Children.Add($featuresGrid) | Out-Null
}
# Window Loaded # Window Loaded
$window.Add_Loaded({ $window.Add_Loaded({
# Windows Release
$script:cmbWindowsRelease = $window.FindName('cmbWindowsRelease') $script:cmbWindowsRelease = $window.FindName('cmbWindowsRelease')
$script:cmbWindowsVersion = $window.FindName('cmbWindowsVersion') $script:cmbWindowsVersion = $window.FindName('cmbWindowsVersion')
$script:txtISOPath = $window.FindName('txtISOPath') $script:txtISOPath = $window.FindName('txtISOPath')
& $script:RefreshWindowsUI($defaultISOPath) & $script:RefreshWindowsUI($defaultISOPath)
# Event: ISO path changed # ISO path changed
$script:txtISOPath.Add_TextChanged({ $script:txtISOPath.Add_TextChanged({
& $script:RefreshWindowsUI($script:txtISOPath.Text) & $script:RefreshWindowsUI($script:txtISOPath.Text)
}) })
# Event: Windows release changed # Windows release changed
$script:cmbWindowsRelease.Add_SelectionChanged({ $script:cmbWindowsRelease.Add_SelectionChanged({
$selItem = $script:cmbWindowsRelease.SelectedItem $selItem = $script:cmbWindowsRelease.SelectedItem
if ($selItem -and $selItem.Value) { if ($selItem -and $selItem.Value) {
@@ -416,7 +505,12 @@ $window.Add_Loaded({
$script:cmbWindowsArch.SelectedItem = $defaultWindowsArch $script:cmbWindowsArch.SelectedItem = $defaultWindowsArch
$script:cmbWindowsLang = $window.FindName('cmbWindowsLang') $script:cmbWindowsLang = $window.FindName('cmbWindowsLang')
$allowedLangs = @('ar-sa','bg-bg','cs-cz','da-dk','de-de','el-gr','en-gb','en-us','es-es','es-mx','et-ee','fi-fi','fr-ca','fr-fr','he-il','hr-hr','hu-hu','it-it','ja-jp','ko-kr','lt-lt','lv-lv','nb-no','nl-nl','pl-pl','pt-br','pt-pt','ro-ro','ru-ru','sk-sk','sl-si','sr-latn-rs','sv-se','th-th','tr-tr','uk-ua','zh-cn','zh-tw') $allowedLangs = @(
'ar-sa','bg-bg','cs-cz','da-dk','de-de','el-gr','en-gb','en-us','es-es','es-mx','et-ee',
'fi-fi','fr-ca','fr-fr','he-il','hr-hr','hu-hu','it-it','ja-jp','ko-kr','lt-lt','lv-lv',
'nb-no','nl-nl','pl-pl','pt-br','pt-pt','ro-ro','ru-ru','sk-sk','sl-si','sr-latn-rs',
'sv-se','th-th','tr-tr','uk-ua','zh-cn','zh-tw'
)
foreach ($lang in $allowedLangs) { foreach ($lang in $allowedLangs) {
[void]$script:cmbWindowsLang.Items.Add($lang) [void]$script:cmbWindowsLang.Items.Add($lang)
} }
@@ -435,7 +529,8 @@ $window.Add_Loaded({
} }
$script:cmbMediaType.SelectedItem = $defaultMediaType $script:cmbMediaType.SelectedItem = $defaultMediaType
$window.FindName('txtOptionalFeatures').Text = $defaultOptionalFeatures $script:txtOptionalFeatures = $window.FindName('txtOptionalFeatures')
$script:txtOptionalFeatures.Text = $defaultOptionalFeatures
$window.FindName('txtProductKey').Text = $defaultProductKey $window.FindName('txtProductKey').Text = $defaultProductKey
# Drivers tab # Drivers tab
@@ -516,21 +611,11 @@ $window.Add_Loaded({
$script:OfficeConfigurationXMLFileGrid.Visibility = 'Collapsed' $script:OfficeConfigurationXMLFileGrid.Visibility = 'Collapsed'
}) })
# Optional Features # Build the dynamic multi-column checkboxes inside the Expander content
$script:chkTelnetClient = $window.FindName('chkTelnetClient') $script:featuresPanel = $window.FindName('stackFeaturesContainer')
$script:chkNetFx3 = $window.FindName('chkNetFx3') if ($script:featuresPanel) {
$script:chkDirectPlay = $window.FindName('chkDirectPlay') BuildFeaturesGrid -parent $script:featuresPanel
$script:chkSMB1Protocol = $window.FindName('chkSMB1Protocol') }
$script:txtOptionalFeatures = $window.FindName('txtOptionalFeatures')
$script:chkTelnetClient.Add_Checked({ UpdateOptionalFeaturesString })
$script:chkTelnetClient.Add_Unchecked({ UpdateOptionalFeaturesString })
$script:chkNetFx3.Add_Checked({ UpdateOptionalFeaturesString })
$script:chkNetFx3.Add_Unchecked({ UpdateOptionalFeaturesString })
$script:chkDirectPlay.Add_Checked({ UpdateOptionalFeaturesString })
$script:chkDirectPlay.Add_Unchecked({ UpdateOptionalFeaturesString })
$script:chkSMB1Protocol.Add_Checked({ UpdateOptionalFeaturesString })
$script:chkSMB1Protocol.Add_Unchecked({ UpdateOptionalFeaturesString })
}) })
# Button: Build FFU # Button: Build FFU
@@ -549,7 +634,6 @@ $btnRun.Add_Click({
$txtStatus.Text = "Executing BuildFFUVM script with config file..." $txtStatus.Text = "Executing BuildFFUVM script with config file..."
& "$PSScriptRoot\BuildFFUVM.ps1" -ConfigFile $configFilePath -Verbose & "$PSScriptRoot\BuildFFUVM.ps1" -ConfigFile $configFilePath -Verbose
# If Office config XML needed
if ($config.InstallOffice -and $config.OfficeConfigXMLFile) { if ($config.InstallOffice -and $config.OfficeConfigXMLFile) {
Copy-Item -Path $config.OfficeConfigXMLFile -Destination $config.OfficePath -Force Copy-Item -Path $config.OfficeConfigXMLFile -Destination $config.OfficePath -Force
$txtStatus.Text = "Office Configuration XML file copied successfully." $txtStatus.Text = "Office Configuration XML file copied successfully."
+42 -31
View File
@@ -27,7 +27,7 @@
Padding="10" Padding="10"
Grid.Row="0"> Grid.Row="0">
<!-- ================= TAB 1: BASIC ================= --> <!-- ============== TAB 1: BASIC ============== -->
<TabItem Header="Basic" Padding="20"> <TabItem Header="Basic" Padding="20">
<Grid Margin="10"> <Grid Margin="10">
<Grid.RowDefinitions> <Grid.RowDefinitions>
@@ -121,24 +121,29 @@
<!-- ============== TAB 2: WINDOWS SETTINGS ============== --> <!-- ============== TAB 2: WINDOWS SETTINGS ============== -->
<TabItem Header="Windows Settings" Padding="20"> <TabItem Header="Windows Settings" Padding="20">
<!--
Single 2-col grid, now with 9 row definitions:
rows 0..7 for the ISO path, release, version, arch, lang, sku, media type, product key
row 8 for the Optional Features Expander
-->
<Grid Margin="10"> <Grid Margin="10">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <!-- row0: ISO Path -->
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <!-- row1: Windows Release -->
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <!-- row2: Windows Version -->
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <!-- row3: Windows Arch -->
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <!-- row4: Windows Lang -->
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <!-- row5: Windows SKU -->
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <!-- row6: Media Type -->
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <!-- row7: Product Key -->
<RowDefinition Height="Auto"/> <RowDefinition Height="*" /> <!-- row8: Expander -->
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/> <ColumnDefinition Width="200"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<!-- ISO Path --> <!-- (0) ISO Path -->
<StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5"> <StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5">
<TextBlock Text="Windows ISO Path:"/> <TextBlock Text="Windows ISO Path:"/>
<Image x:Name="imgISOPathInfo" <Image x:Name="imgISOPathInfo"
@@ -164,7 +169,7 @@
ToolTip="Browse for a Windows ISO file."/> ToolTip="Browse for a Windows ISO file."/>
</Grid> </Grid>
<!-- Windows Release --> <!-- (1) Windows Release -->
<StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5"> <StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5">
<TextBlock Text="Windows Release:"/> <TextBlock Text="Windows Release:"/>
</StackPanel> </StackPanel>
@@ -174,7 +179,7 @@
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Stretch" /> HorizontalAlignment="Stretch" />
<!-- Windows Version (Now a ComboBox) --> <!-- (2) Windows Version -->
<StackPanel Grid.Row="2" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5"> <StackPanel Grid.Row="2" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5">
<TextBlock Text="Windows Version:"/> <TextBlock Text="Windows Version:"/>
</StackPanel> </StackPanel>
@@ -187,7 +192,7 @@
IsEnabled="False" IsEnabled="False"
ToolTip="Select the Windows Version." /> ToolTip="Select the Windows Version." />
<!-- Windows Architecture --> <!-- (3) Windows Arch -->
<StackPanel Grid.Row="3" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5"> <StackPanel Grid.Row="3" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5">
<TextBlock Text="Windows Architecture:"/> <TextBlock Text="Windows Architecture:"/>
</StackPanel> </StackPanel>
@@ -198,7 +203,7 @@
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Left"/> HorizontalAlignment="Left"/>
<!-- Windows Language --> <!-- (4) Windows Lang -->
<StackPanel Grid.Row="4" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5"> <StackPanel Grid.Row="4" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5">
<TextBlock Text="Windows Language:"/> <TextBlock Text="Windows Language:"/>
</StackPanel> </StackPanel>
@@ -209,7 +214,7 @@
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Left"/> HorizontalAlignment="Left"/>
<!-- Windows SKU --> <!-- (5) Windows SKU -->
<StackPanel Grid.Row="5" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5"> <StackPanel Grid.Row="5" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5">
<TextBlock Text="Windows SKU:"/> <TextBlock Text="Windows SKU:"/>
<Image x:Name="imgWindowsSKUInfo" <Image x:Name="imgWindowsSKUInfo"
@@ -223,7 +228,7 @@
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Stretch"/> HorizontalAlignment="Stretch"/>
<!-- Media Type --> <!-- (6) Media Type -->
<StackPanel Grid.Row="6" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5"> <StackPanel Grid.Row="6" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5">
<TextBlock Text="Media Type:"/> <TextBlock Text="Media Type:"/>
</StackPanel> </StackPanel>
@@ -234,7 +239,7 @@
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Left"/> HorizontalAlignment="Left"/>
<!-- Product Key --> <!-- (7) Product Key -->
<StackPanel Grid.Row="7" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5"> <StackPanel Grid.Row="7" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,5">
<TextBlock Text="Product Key:"/> <TextBlock Text="Product Key:"/>
</StackPanel> </StackPanel>
@@ -244,27 +249,33 @@
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Stretch"/> HorizontalAlignment="Stretch"/>
<!-- Optional Features Expander --> <!-- (8) Optional Features Expander, arrow on right, text on left -->
<Expander x:Name="expOptionalFeatures" <Expander x:Name="expOptionalFeatures"
Grid.Row="8" Grid.Row="8" Grid.Column="0" Grid.ColumnSpan="2"
Grid.ColumnSpan="2" FlowDirection="RightToLeft"
Margin="5,5,0,0"
Header="Optional Features"
IsExpanded="False" IsExpanded="False"
ExpandDirection="Down"> ExpandDirection="Down"
<StackPanel Margin="15,5"> Margin="5,0,0,0">
<TextBlock Text="Select the optional features you'd like to enable:" FontWeight="SemiBold" Margin="0,0,0,5"/> <Expander.Header>
<CheckBox x:Name="chkTelnetClient" Content="TelnetClient" Margin="0,2"/> <StackPanel Orientation="Horizontal" FlowDirection="LeftToRight">
<CheckBox x:Name="chkNetFx3" Content="NetFx3" Margin="0,2"/> <TextBlock Text="Optional Features" />
<CheckBox x:Name="chkDirectPlay" Content="DirectPlay" Margin="0,2"/> </StackPanel>
<CheckBox x:Name="chkSMB1Protocol" Content="SMB1Protocol" Margin="0,2"/> </Expander.Header>
<TextBlock Text="Selected features (semicolon-separated):" Margin="0,10,0,5"/> <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
FlowDirection="LeftToRight"
Margin="0,5,0,0">
<StackPanel x:Name="stackFeaturesContainer" Margin="15,5">
<TextBlock Text="Selected features (semicolon):"
Margin="0,10,0,5"
FontStyle="Italic"/>
<TextBox x:Name="txtOptionalFeatures" <TextBox x:Name="txtOptionalFeatures"
IsReadOnly="True" IsReadOnly="True"
Width="350"
Margin="0,0,0,10" Margin="0,0,0,10"
ToolTip="Semicolon-delimited list of optional features"/> ToolTip="Semicolon-delimited list of optional features"/>
</StackPanel> </StackPanel>
</ScrollViewer>
</Expander> </Expander>
</Grid> </Grid>
</TabItem> </TabItem>