GUI/MainWindow.xaml

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:r="clr-namespace:System.Windows.Controls.Ribbon;assembly=System.Windows.Controls.Ribbon"
    Title="PSWimToolkit - Provisioning Console"
    Background="#F5F7FA"
    FontFamily="Segoe UI"
    WindowStartupLocation="CenterScreen">
    <Window.Style>
        <Style TargetType="Window">
            <Setter Property="MinWidth" Value="0" />
            <Setter Property="MinHeight" Value="0" />
            <Style.Triggers>
                <Trigger Property="WindowState" Value="Normal">
                    <Setter Property="MinWidth" Value="1000" />
                    <Setter Property="MinHeight" Value="1050" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Style>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
 
        <!-- Ribbon -->
        <r:Ribbon Grid.Row="0">
            <r:Ribbon.ApplicationMenu>
                <r:RibbonApplicationMenu>
                    <r:RibbonApplicationMenuItem x:Name="ExitMenuItem" Header="Exit" />
                </r:RibbonApplicationMenu>
            </r:Ribbon.ApplicationMenu>
            <r:RibbonTab Header="Tools">
                <r:RibbonGroup Header="Provisioning">
                    <r:RibbonButton x:Name="DownloadUpdatesMenuItem" Label="Download Updates..." />
                    <r:RibbonButton x:Name="ClearLogsMenuItem" Label="Clear Logs" />
                    <r:RibbonButton x:Name="ExportLogsMenuItem" Label="Export Logs..." />
                </r:RibbonGroup>
            </r:RibbonTab>
            <r:RibbonTab Header="View">
                <r:RibbonGroup Header="Layout">
                    <r:RibbonToggleButton
                        x:Name="ToggleLogViewMenuItem"
                        IsChecked="True"
                        Label="Show/Hide Log Viewer" />
                </r:RibbonGroup>
            </r:RibbonTab>
            <r:RibbonTab Header="Help">
                <r:RibbonGroup Header="Resources">
                    <r:RibbonButton x:Name="AboutMenuItem" Label="About PSWimToolkit" />
                    <r:RibbonButton x:Name="DocumentationMenuItem" Label="Documentation" />
                </r:RibbonGroup>
            </r:RibbonTab>
        </r:Ribbon>
 
        <ScrollViewer
            Grid.Row="1"
            HorizontalScrollBarVisibility="Auto"
            VerticalScrollBarVisibility="Auto">
            <Grid Margin="5">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
 
                <!-- Add WIM Management -->
                <GroupBox
                    Grid.Row="1"
                    Margin="5"
                    Header="WIM Management">
                    <Grid Margin="5">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <StackPanel
                            Grid.Row="0"
                            HorizontalAlignment="Center"
                            VerticalAlignment="Center"
                            Orientation="Horizontal">
 
                            <!-- Add WIM Buttons -->
                            <Button
                                x:Name="AddWimButton"
                                Margin="5"
                                Content="Import WIM..." />
 
                            <!-- Import ISO Button -->
                            <Button
                                x:Name="ImportIsoButton"
                                Margin="5"
                                Content="Import ISO..." />
 
                            <!-- WIM Details Button -->
                            <Button
                                x:Name="WimDetailsButton"
                                Margin="5"
                                Content="Details..." />
 
                            <!-- Separator -->
                            <Border
                                Width="1"
                                Height="24"
                                Margin="5,0,5,0"
                                VerticalAlignment="Center"
                                Background="#D0D3D9" />
 
                            <!-- Remove WIM Buttons -->
                            <Button
                                x:Name="RemoveWimButton"
                                Margin="5"
                                Content="Remove Selected" />
 
                            <!-- Delete WIM Button -->
                            <Button
                                x:Name="DeleteWimButton"
                                Margin="5"
                                Content="Delete From Import" />
 
                            <!-- Clear All Button -->
                            <Button
                                x:Name="ClearWimButton"
                                Margin="5"
                                Content="Clear All" />
                        </StackPanel>
                        <Grid Grid.Row="1" Margin="5">
                            <!-- WIM Data Grid -->
                            <DataGrid
                                x:Name="WimGrid"
                                AutoGenerateColumns="False"
                                CanUserAddRows="False"
                                HeadersVisibility="Column"
                                IsReadOnly="False"
                                RowHeight="30"
                                SelectionMode="Extended">
                                <DataGrid.Style>
                                    <Style TargetType="DataGrid">
                                        <Setter Property="Visibility" Value="Visible" />
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}}" Value="0">
                                                <Setter Property="Visibility" Value="Collapsed" />
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </DataGrid.Style>
                                <DataGrid.Columns>
                                    <DataGridTextColumn
                                        Width="180"
                                        MinWidth="180"
                                        Binding="{Binding Name}"
                                        Header="Name"
                                        IsReadOnly="True" />
                                    <DataGridTextColumn
                                        Width="*"
                                        MinWidth="220"
                                        Binding="{Binding Path}"
                                        Header="Path"
                                        IsReadOnly="True" />
                                    <DataGridTextColumn
                                        Width="80"
                                        MinWidth="80"
                                        Binding="{Binding Index}"
                                        Header="Index" />
                                    <DataGridTextColumn
                                        Width="140"
                                        MinWidth="140"
                                        Binding="{Binding Status}"
                                        Header="Status"
                                        IsReadOnly="True" />
                                    <DataGridTextColumn
                                        Width="220"
                                        MinWidth="220"
                                        Binding="{Binding Details}"
                                        Header="Details"
                                        IsReadOnly="True" />
                                </DataGrid.Columns>
                            </DataGrid>
 
                            <!-- No WIMs TextBlock -->
                            <TextBlock
                                Margin="5"
                                HorizontalAlignment="Center"
                                VerticalAlignment="Center"
                                FontStyle="Italic"
                                Foreground="#7A869A"
                                Text="No WIM images imported yet. Import a WIM or ISO to get started."
                                TextAlignment="Center">
                                <TextBlock.Style>
                                    <Style TargetType="TextBlock">
                                        <Setter Property="Visibility" Value="Collapsed" />
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding Items.Count, ElementName=WimGrid}" Value="0">
                                                <Setter Property="Visibility" Value="Visible" />
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </TextBlock.Style>
                            </TextBlock>
                        </Grid>
                    </Grid>
                </GroupBox>
 
                <!-- Update Configuration -->
                <GroupBox
                    Grid.Row="2"
                    Margin="5"
                    Header="Update Configuration">
                    <Grid Margin="5">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="160" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
 
                        <!-- Update folder -->
                        <TextBlock
                            Grid.Row="0"
                            Grid.Column="0"
                            HorizontalAlignment="Left"
                            VerticalAlignment="Center"
                            Text="Update folder:" />
                        <TextBox
                            x:Name="UpdatePathTextBox"
                            Grid.Row="0"
                            Grid.Column="1"
                            Margin="5"
                            HorizontalAlignment="Stretch"
                            VerticalAlignment="Center"
                            IsReadOnly="True"
                            IsReadOnlyCaretVisible="True" />
                        <Button
                            x:Name="BrowseUpdateButton"
                            Grid.Row="0"
                            Grid.Column="2"
                            Margin="5"
                            HorizontalAlignment="Center"
                            VerticalAlignment="Center"
                            Content="Open" />
 
                        <!-- SxS folder -->
                        <TextBlock
                            Grid.Row="1"
                            Grid.Column="0"
                            HorizontalAlignment="Left"
                            VerticalAlignment="Center"
                            Text="SxS folder:" />
                        <TextBox
                            x:Name="SxSPathTextBox"
                            Grid.Row="1"
                            Grid.Column="1"
                            Margin="5"
                            HorizontalAlignment="Stretch"
                            VerticalAlignment="Center"
                            IsReadOnly="True"
                            IsReadOnlyCaretVisible="True" />
                        <Button
                            x:Name="BrowseSxSButton"
                            Grid.Row="1"
                            Grid.Column="2"
                            Margin="5"
                            HorizontalAlignment="Center"
                            VerticalAlignment="Center"
                            Content="Open" />
 
                        <!-- Output folder -->
                        <TextBlock
                            Grid.Row="2"
                            Grid.Column="0"
                            HorizontalAlignment="Left"
                            VerticalAlignment="Center"
                            Text="Output folder:" />
                        <TextBox
                            x:Name="OutputPathTextBox"
                            Grid.Row="2"
                            Grid.Column="1"
                            Margin="5"
                            HorizontalAlignment="Stretch"
                            VerticalAlignment="Center"
                            IsReadOnly="True"
                            IsReadOnlyCaretVisible="True" />
                        <Button
                            x:Name="BrowseOutputButton"
                            Grid.Row="2"
                            Grid.Column="2"
                            Margin="5"
                            HorizontalAlignment="Center"
                            VerticalAlignment="Center"
                            Content="Open" />
 
                        <!-- Options -->
                        <StackPanel
                            Grid.Row="3"
                            Grid.Column="0"
                            Grid.ColumnSpan="3"
                            Margin="5"
                            Orientation="Horizontal">
                            <CheckBox
                                x:Name="EnableNetFxCheckBox"
                                Margin="5"
                                VerticalAlignment="Center"
                                Content="Enable .NET Framework 3.5" />
                            <CheckBox
                                x:Name="ForceCheckBox"
                                Margin="5"
                                VerticalAlignment="Center"
                                Content="Force reapply updates" />
                            <CheckBox
                                x:Name="VerboseLogCheckBox"
                                Margin="5"
                                VerticalAlignment="Center"
                                Content="Verbose logging" />
                            <CheckBox
                                x:Name="IncludePreviewCheckBox"
                                Margin="5"
                                VerticalAlignment="Center"
                                Content="Include preview updates" />
                            <Button
                                x:Name="AutoDetectButton"
                                Margin="5"
                                HorizontalAlignment="Left"
                                VerticalAlignment="Center"
                                Content="Auto Detect..." />
                            <Button
                                x:Name="SearchCatalogButton"
                                Margin="5"
                                HorizontalAlignment="Left"
                                VerticalAlignment="Center"
                                Content="Search Catalog..." />
                        </StackPanel>
                    </Grid>
                </GroupBox>
 
                <!-- Provisioning Control -->
                <GroupBox
                    Grid.Row="3"
                    Margin="5"
                    Header="Provisioning Control">
                    <Grid Margin="5">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
 
                        <!-- Start/Stop Buttons -->
                        <StackPanel
                            Grid.Row="0"
                            HorizontalAlignment="Left"
                            VerticalAlignment="Center"
                            Orientation="Horizontal">
                            <Button
                                x:Name="StartButton"
                                Margin="5"
                                Content="Start Provisioning" />
                            <Button
                                x:Name="StopButton"
                                Margin="5"
                                Content="Stop"
                                IsEnabled="False" />
                        </StackPanel>
 
                        <!-- Throttle Slider -->
                        <StackPanel
                            Grid.Row="1"
                            HorizontalAlignment="Left"
                            VerticalAlignment="Center"
                            Orientation="Horizontal">
                            <TextBlock
                                Margin="5"
                                VerticalAlignment="Center"
                                Text="Throttle limit:" />
                            <Slider
                                x:Name="ThrottleSlider"
                                Width="200"
                                VerticalAlignment="Center"
                                IsSnapToTickEnabled="True"
                                Maximum="20"
                                Minimum="1"
                                TickFrequency="1"
                                Value="10" />
                            <TextBlock
                                x:Name="ThrottleValueText"
                                Margin="5"
                                VerticalAlignment="Center"
                                Text="10" />
                        </StackPanel>
 
                        <!-- Status TextBlock -->
                        <TextBlock
                            x:Name="StatusTextBlock"
                            Grid.Row="2"
                            Margin="5"
                            Foreground="#2B579A"
                            Text="Ready" />
                    </Grid>
                </GroupBox>
 
                <!-- Progress Viewer -->
                <GroupBox
                    Grid.Row="4"
                    Margin="5"
                    Header="Progress">
                    <Grid Margin="5">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
 
                        <!-- Overall Progress Bar -->
                        <ProgressBar
                            x:Name="OverallProgressBar"
                            Grid.Row="0"
                            Height="22"
                            Margin="5"
                            IsIndeterminate="False"
                            Maximum="100"
                            Minimum="0" />
 
                        <!-- Progress List -->
                        <ListView
                            x:Name="ProgressList"
                            Grid.Row="1"
                            Margin="5">
                            <ListView.View>
                                <GridView>
                                    <GridViewColumn
                                        Width="200"
                                        DisplayMemberBinding="{Binding Name}"
                                        Header="Name" />
                                    <GridViewColumn
                                        Width="120"
                                        DisplayMemberBinding="{Binding Status}"
                                        Header="Status" />
                                    <GridViewColumn
                                        Width="400"
                                        DisplayMemberBinding="{Binding Details}"
                                        Header="Details" />
                                </GridView>
                            </ListView.View>
                        </ListView>
                    </Grid>
                </GroupBox>
 
                <!-- Log Viewer -->
                <GroupBox
                    x:Name="LogViewerGroup"
                    Grid.Row="5"
                    Margin="5"
                    Header="Log Viewer">
                    <Grid Margin="5">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
 
                        <!-- Log Controls -->
                        <StackPanel
                            Grid.Row="0"
                            Margin="5"
                            HorizontalAlignment="Stretch"
                            Orientation="Horizontal">
                            <TextBlock
                                Margin="5"
                                VerticalAlignment="Center"
                                Text="Filter:" />
                            <ComboBox
                                x:Name="LogLevelComboBox"
                                Width="140"
                                Margin="5"
                                SelectedIndex="0">
                                <ComboBoxItem Content="All" />
                                <ComboBoxItem Content="Debug" />
                                <ComboBoxItem Content="Info" />
                                <ComboBoxItem Content="Stage" />
                                <ComboBoxItem Content="Success" />
                                <ComboBoxItem Content="Warning" />
                                <ComboBoxItem Content="Error" />
                            </ComboBox>
                            <CheckBox
                                x:Name="AutoScrollCheckBox"
                                Margin="5"
                                VerticalAlignment="Center"
                                Content="Auto-scroll"
                                IsChecked="True" />
                            <Button
                                x:Name="SaveLogsButton"
                                Margin="5"
                                Content="Save Logs" />
                            <Button
                                x:Name="ClearLogsButton"
                                Margin="5"
                                Content="Clear Viewer" />
                            <Button
                                x:Name="OpenLogFolderButton"
                                Margin="5"
                                Content="Open Log Folder" />
                        </StackPanel>
 
                        <!-- Log List -->
                        <ListView
                            x:Name="LogList"
                            Grid.Row="1"
                            MinHeight="150"
                            Margin="5"
                            ItemsPanel="{DynamicResource LogItemsPanel}">
                            <ListView.View>
                                <GridView>
                                    <GridViewColumn
                                        Width="160"
                                        DisplayMemberBinding="{Binding Timestamp}"
                                        Header="Time" />
                                    <GridViewColumn
                                        Width="90"
                                        DisplayMemberBinding="{Binding Level}"
                                        Header="Level" />
                                    <GridViewColumn
                                        Width="120"
                                        DisplayMemberBinding="{Binding Source}"
                                        Header="Source" />
                                    <GridViewColumn
                                        Width="520"
                                        DisplayMemberBinding="{Binding Message}"
                                        Header="Message" />
                                </GridView>
                            </ListView.View>
                        </ListView>
 
                        <!-- Log Path TextBlock -->
                        <TextBlock
                            x:Name="LogPathTextBlock"
                            Grid.Row="2"
                            Margin="5"
                            Foreground="#666666"
                            Text="Logs folder: (auto)" />
                    </Grid>
                </GroupBox>
            </Grid>
        </ScrollViewer>
    </Grid>
</Window>