Private/UI/MainWindow.xaml.ps1
|
# Copyright (c) 2026 Sandy Zeng. All rights reserved. # Source-available. All rights reserved. See LICENSE file. <# MainWindow.xaml.ps1 — Defines the main WPF window XAML (styles, templates, layout) as a here-string. Author: Sandy Zeng Project: IntuneDiff Version History: 1.0.0 Initial release. 1.0.1 Release Notes overlay, update banner, selectable grid cells. 1.0.2 ListView item borders use DynamicResource BorderColor for theme support. #> $script:MainWindowXaml = @' <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="IntuneDiff" Height="820" Width="1480" WindowStartupLocation="CenterScreen" Background="{DynamicResource PageBg}"> <Window.Resources> <!-- Theme color resources (light mode defaults) --> <SolidColorBrush x:Key="PageBg" Color="#F3F4F6"/> <SolidColorBrush x:Key="CardBg" Color="#FFFFFF"/> <SolidColorBrush x:Key="HeaderBg" Color="#FFFFFF"/> <SolidColorBrush x:Key="TextPrimary" Color="#111827"/> <SolidColorBrush x:Key="TextSecondary" Color="#6B7280"/> <SolidColorBrush x:Key="TextMuted" Color="#9CA3AF"/> <SolidColorBrush x:Key="BorderColor" Color="#E5E7EB"/> <SolidColorBrush x:Key="InputBg" Color="#FFFFFF"/> <SolidColorBrush x:Key="BtnDefaultBg" Color="#E5E7EB"/> <SolidColorBrush x:Key="BtnDefaultHover" Color="#D1D5DB"/> <SolidColorBrush x:Key="BtnDefaultPressed" Color="#9CA3AF"/> <SolidColorBrush x:Key="BtnDefaultFg" Color="#111827"/> <SolidColorBrush x:Key="ChipActiveBg" Color="#111827"/> <SolidColorBrush x:Key="ChipActiveFg" Color="#FFFFFF"/> <SolidColorBrush x:Key="ChipInactiveBg" Color="#E5E7EB"/> <SolidColorBrush x:Key="ChipInactiveFg" Color="#374151"/> <SolidColorBrush x:Key="ChipHover" Color="#D1D5DB"/> <SolidColorBrush x:Key="GridHeaderBg" Color="#F3F4F6"/> <SolidColorBrush x:Key="GridHeaderFg" Color="#374151"/> <SolidColorBrush x:Key="GridRowBg" Color="#FFFFFF"/> <SolidColorBrush x:Key="GridAltRowBg" Color="#F9FAFB"/> <SolidColorBrush x:Key="GridSelectedBg" Color="#EFF6FF"/> <SolidColorBrush x:Key="ListSelectedBg" Color="#DBEAFE"/> <SolidColorBrush x:Key="ListSelectedBorder" Color="#3B82F6"/> <SolidColorBrush x:Key="BadgeTypeBg" Color="#EFF6FF"/> <SolidColorBrush x:Key="BadgeTypeFg" Color="#1E40AF"/> <SolidColorBrush x:Key="BadgeAssignedBg" Color="#F0FDF4"/> <SolidColorBrush x:Key="BadgeAssignedFg" Color="#166534"/> <SolidColorBrush x:Key="RowCoveredBg" Color="#F0FDF4"/> <SolidColorBrush x:Key="RowConflictBg" Color="#FFFBEB"/> <SolidColorBrush x:Key="RowMissingBg" Color="#FEF2F2"/> <SolidColorBrush x:Key="RowExtraBg" Color="#EFF6FF"/> <SolidColorBrush x:Key="RowErrorBg" Color="#FEF2F2"/> <SolidColorBrush x:Key="CellCoveredBg" Color="#DCFCE7"/> <SolidColorBrush x:Key="CellConflictBg" Color="#FEF3C7"/> <SolidColorBrush x:Key="CellMissingBg" Color="#FEE2E2"/> <SolidColorBrush x:Key="CellExtraBg" Color="#DBEAFE"/> <SolidColorBrush x:Key="CellAttentionBg" Color="#F3E8FF"/> <SolidColorBrush x:Key="StatusCoveredFg" Color="#166534"/> <SolidColorBrush x:Key="StatusConflictFg" Color="#92400E"/> <SolidColorBrush x:Key="StatusMissingFg" Color="#991B1B"/> <SolidColorBrush x:Key="StatusExtraFg" Color="#1E40AF"/> <SolidColorBrush x:Key="StatusAttentionFg" Color="#6B21A8"/> <SolidColorBrush x:Key="AccentColor" Color="#3498DB"/> <SolidColorBrush x:Key="AccentHover" Color="#2E86C1"/> <SolidColorBrush x:Key="AccentPressed" Color="#2471A3"/> <SolidColorBrush x:Key="ShadowColor" Color="#10000000"/> <!-- Modern button style matching v2 --> <Style TargetType="Button"> <Setter Property="Padding" Value="12,8"/> <Setter Property="Margin" Value="4"/> <Setter Property="MinWidth" Value="90"/> <Setter Property="FontSize" Value="13"/> <Setter Property="FontWeight" Value="Medium"/> <Setter Property="Background" Value="{DynamicResource BtnDefaultBg}"/> <Setter Property="Foreground" Value="{DynamicResource BtnDefaultFg}"/> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Cursor" Value="Hand"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border x:Name="bd" CornerRadius="8" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Padding="{TemplateBinding Padding}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="bd" Property="Background" Value="{DynamicResource BtnDefaultHover}"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="bd" Property="Background" Value="{DynamicResource BtnDefaultPressed}"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Opacity" Value="0.5"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <!-- Primary button style --> <Style TargetType="Button" x:Key="PrimaryButton" BasedOn="{StaticResource {x:Type Button}}"> <Setter Property="Background" Value="{DynamicResource AccentColor}"/> <Setter Property="Foreground" Value="White"/> <Setter Property="FontWeight" Value="SemiBold"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border x:Name="bd" CornerRadius="8" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="bd" Property="Background" Value="{DynamicResource AccentHover}"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="bd" Property="Background" Value="{DynamicResource AccentPressed}"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Opacity" Value="0.5"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style TargetType="Button" x:Key="DangerButton" BasedOn="{StaticResource PrimaryButton}"> <Setter Property="Background" Value="#DC2626"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border x:Name="bd" CornerRadius="8" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="bd" Property="Background" Value="#B91C1C"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="bd" Property="Background" Value="#991B1B"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Opacity" Value="0.5"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style TargetType="TextBlock" x:Key="H1"> <Setter Property="FontSize" Value="20"/> <Setter Property="FontWeight" Value="Bold"/> <Setter Property="Foreground" Value="{DynamicResource TextPrimary}"/> </Style> <!-- Modern DataGrid --> <Style TargetType="DataGrid"> <Setter Property="AutoGenerateColumns" Value="False"/> <Setter Property="CanUserAddRows" Value="False"/> <Setter Property="CanUserDeleteRows" Value="False"/> <Setter Property="IsReadOnly" Value="True"/> <Setter Property="SelectionUnit" Value="CellOrRowHeader"/> <Setter Property="ClipboardCopyMode" Value="IncludeHeader"/> <Setter Property="GridLinesVisibility" Value="Horizontal"/> <Setter Property="HorizontalGridLinesBrush" Value="{DynamicResource BorderColor}"/> <Setter Property="HeadersVisibility" Value="Column"/> <Setter Property="Background" Value="{DynamicResource CardBg}"/> <Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="RowBackground" Value="{DynamicResource GridRowBg}"/> <Setter Property="AlternatingRowBackground" Value="{DynamicResource GridAltRowBg}"/> <Setter Property="EnableRowVirtualization" Value="True"/> <Setter Property="EnableColumnVirtualization" Value="True"/> <Setter Property="VirtualizingPanel.IsVirtualizing" Value="True"/> <Setter Property="VirtualizingPanel.VirtualizationMode" Value="Recycling"/> <Setter Property="ScrollViewer.CanContentScroll" Value="True"/> </Style> <!-- DataGrid column header --> <Style TargetType="DataGridColumnHeader"> <Setter Property="Background" Value="{DynamicResource GridHeaderBg}"/> <Setter Property="Foreground" Value="{DynamicResource GridHeaderFg}"/> <Setter Property="FontWeight" Value="SemiBold"/> <Setter Property="FontSize" Value="12"/> <Setter Property="Padding" Value="12,10"/> <Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/> <Setter Property="BorderThickness" Value="0,0,1,1"/> </Style> <!-- DataGrid cell --> <Style TargetType="DataGridCell"> <Setter Property="Padding" Value="12,8"/> <Setter Property="BorderThickness" Value="0"/> <Setter Property="FontSize" Value="13"/> <Setter Property="Foreground" Value="{DynamicResource TextPrimary}"/> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="{DynamicResource GridSelectedBg}"/> <Setter Property="Foreground" Value="{DynamicResource TextPrimary}"/> </Trigger> </Style.Triggers> </Style> <!-- Summary card style --> <Style TargetType="Border" x:Key="SummaryCard"> <Setter Property="CornerRadius" Value="8"/> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Padding" Value="16,12"/> <Setter Property="Margin" Value="0,0,8,0"/> <Setter Property="MinWidth" Value="100"/> </Style> <Style TargetType="TextBlock" x:Key="SummaryCount"> <Setter Property="FontSize" Value="24"/> <Setter Property="FontWeight" Value="Bold"/> <Setter Property="HorizontalAlignment" Value="Center"/> </Style> <Style TargetType="TextBlock" x:Key="SummaryLabel"> <Setter Property="FontSize" Value="11"/> <Setter Property="Foreground" Value="#6B7280"/> <Setter Property="HorizontalAlignment" Value="Center"/> <Setter Property="Margin" Value="0,4,0,0"/> </Style> <!-- Popup menu button style (left-aligned, no chrome) --> <Style TargetType="Button" x:Key="PopupMenuButton"> <Setter Property="Background" Value="Transparent"/> <Setter Property="Cursor" Value="Hand"/> <Setter Property="Padding" Value="8,8"/> <Setter Property="HorizontalAlignment" Value="Stretch"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" CornerRadius="6"> <ContentPresenter HorizontalAlignment="Left" VerticalAlignment="Center"/> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> <!-- Filter chip style (ToggleButton) - v2 style --> <Style TargetType="ToggleButton" x:Key="FilterChip"> <Setter Property="Padding" Value="12,6"/> <Setter Property="Margin" Value="0,0,6,4"/> <Setter Property="MinWidth" Value="0"/> <Setter Property="FontSize" Value="12"/> <Setter Property="FontWeight" Value="Medium"/> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="{DynamicResource ChipInactiveBg}"/> <Setter Property="Foreground" Value="{DynamicResource ChipInactiveFg}"/> <Setter Property="Cursor" Value="Hand"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ToggleButton"> <Border x:Name="bd" CornerRadius="8" BorderThickness="0" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter TargetName="bd" Property="Background" Value="{DynamicResource ChipActiveBg}"/> <Setter Property="Foreground" Value="{DynamicResource ChipActiveFg}"/> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="bd" Property="Background" Value="{DynamicResource ChipHover}"/> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsChecked" Value="True"/> <Condition Property="IsMouseOver" Value="True"/> </MultiTrigger.Conditions> <Setter TargetName="bd" Property="Background" Value="#374151"/> <Setter Property="Foreground" Value="White"/> </MultiTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <!-- Modern TextBox style --> <Style TargetType="TextBox"> <Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Padding" Value="12,8"/> <Setter Property="FontSize" Value="13"/> <Setter Property="Background" Value="{DynamicResource InputBg}"/> <Setter Property="Foreground" Value="{DynamicResource TextPrimary}"/> <Setter Property="CaretBrush" Value="{DynamicResource TextPrimary}"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="TextBox"> <Border x:Name="bd" CornerRadius="8" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <TextBlock x:Name="searchIcon" Grid.Column="0" Text="🔍" FontSize="13" Foreground="#9CA3AF" VerticalAlignment="Center" Margin="0,0,8,0"> <TextBlock.Style> <Style TargetType="TextBlock"> <Setter Property="Visibility" Value="Visible"/> <Style.Triggers> <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}" Value="{x:Null}"> <Setter Property="Visibility" Value="Collapsed"/> </DataTrigger> <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}" Value=""> <Setter Property="Visibility" Value="Collapsed"/> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> <ScrollViewer x:Name="PART_ContentHost" Grid.Column="1"/> <TextBlock x:Name="placeholder" Grid.Column="1" Text="{TemplateBinding Tag}" Foreground="#9CA3AF" VerticalAlignment="Center" IsHitTestVisible="False" Visibility="Collapsed"/> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsFocused" Value="True"> <Setter TargetName="bd" Property="BorderBrush" Value="#3498DB"/> <Setter TargetName="bd" Property="BorderThickness" Value="2"/> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Text" Value=""/> <Condition Property="IsFocused" Value="False"/> </MultiTrigger.Conditions> <Setter TargetName="placeholder" Property="Visibility" Value="Visible"/> </MultiTrigger> <Trigger Property="Tag" Value="{x:Null}"> <Setter TargetName="placeholder" Property="Visibility" Value="Collapsed"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <!-- Modern ComboBox style --> <Style TargetType="ComboBox"> <Setter Property="Background" Value="{DynamicResource InputBg}"/> <Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Padding" Value="12,10"/> <Setter Property="FontSize" Value="13"/> <Setter Property="Foreground" Value="{DynamicResource TextPrimary}"/> </Style> <!-- Modern ListView style --> <Style TargetType="ListView"> <Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Background" Value="{DynamicResource CardBg}"/> <Setter Property="Foreground" Value="{DynamicResource TextPrimary}"/> </Style> <Style TargetType="ListViewItem"> <Setter Property="Foreground" Value="{DynamicResource TextPrimary}"/> <Setter Property="HorizontalContentAlignment" Value="Stretch"/> <Setter Property="Padding" Value="4,2"/> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="{DynamicResource ListSelectedBg}"/> <Setter Property="BorderBrush" Value="{DynamicResource ListSelectedBorder}"/> </Trigger> </Style.Triggers> </Style> <!-- TabControl style --> <Style TargetType="TabControl"> <Setter Property="Background" Value="Transparent"/> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Padding" Value="0,12,0,0"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="TabControl"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!-- Tab header bar with background and bottom border --> <Border Grid.Row="0" Background="{DynamicResource CardBg}" CornerRadius="12" Padding="8,6" Margin="0,0,0,12"> <Border.Effect><DropShadowEffect ShadowDepth="1" Opacity="0.04" BlurRadius="6" Direction="270"/></Border.Effect> <TabPanel IsItemsHost="True"/> </Border> <!-- Tab content --> <ContentPresenter Grid.Row="1" ContentSource="SelectedContent"/> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style TargetType="TabItem"> <Setter Property="Padding" Value="16,8"/> <Setter Property="FontSize" Value="13"/> <Setter Property="FontWeight" Value="Medium"/> <Setter Property="Foreground" Value="#6B7280"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="TabItem"> <Grid> <Border x:Name="bd" CornerRadius="8" Padding="{TemplateBinding Padding}" Margin="0,0,4,0" Background="Transparent" Cursor="Hand" TextElement.Foreground="{TemplateBinding Foreground}"> <ContentPresenter ContentSource="Header" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter TargetName="bd" Property="Background" Value="#111827"/> <Setter TargetName="bd" Property="TextElement.Foreground" Value="White"/> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="False"/> <Condition Property="IsMouseOver" Value="True"/> </MultiTrigger.Conditions> <Setter TargetName="bd" Property="Background" Value="#F3F4F6"/> <Setter TargetName="bd" Property="TextElement.Foreground" Value="#111827"/> </MultiTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <!-- Result badge style --> <Style TargetType="Border" x:Key="ResultBadge"> <Setter Property="CornerRadius" Value="12"/> <Setter Property="Padding" Value="10,4"/> <Setter Property="HorizontalAlignment" Value="Left"/> <Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="Background" Value="#E5E7EB"/> <Style.Triggers> <DataTrigger Binding="{Binding Result}" Value="covered"> <Setter Property="Background" Value="#DCFCE7"/> </DataTrigger> <DataTrigger Binding="{Binding Result}" Value="conflict"> <Setter Property="Background" Value="#FEF3C7"/> </DataTrigger> <DataTrigger Binding="{Binding Result}" Value="missing"> <Setter Property="Background" Value="#FEE2E2"/> </DataTrigger> <DataTrigger Binding="{Binding Result}" Value="extra"> <Setter Property="Background" Value="#DBEAFE"/> </DataTrigger> <DataTrigger Binding="{Binding Result}" Value="attention"> <Setter Property="Background" Value="#F3E8FF"/> </DataTrigger> </Style.Triggers> </Style> <Style TargetType="TextBlock" x:Key="ResultBadgeText"> <Setter Property="FontSize" Value="11"/> <Setter Property="FontWeight" Value="SemiBold"/> <Setter Property="Foreground" Value="#374151"/> <Style.Triggers> <DataTrigger Binding="{Binding Result}" Value="covered"> <Setter Property="Foreground" Value="#166534"/> </DataTrigger> <DataTrigger Binding="{Binding Result}" Value="conflict"> <Setter Property="Foreground" Value="#92400E"/> </DataTrigger> <DataTrigger Binding="{Binding Result}" Value="missing"> <Setter Property="Foreground" Value="#991B1B"/> </DataTrigger> <DataTrigger Binding="{Binding Result}" Value="extra"> <Setter Property="Foreground" Value="#1E40AF"/> </DataTrigger> <DataTrigger Binding="{Binding Result}" Value="attention"> <Setter Property="Foreground" Value="#6B21A8"/> </DataTrigger> </Style.Triggers> </Style> <Style TargetType="Border" x:Key="StatusBadge"> <Setter Property="CornerRadius" Value="12"/> <Setter Property="Padding" Value="10,4"/> <Setter Property="HorizontalAlignment" Value="Left"/> <Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="Background" Value="#E5E7EB"/> <Style.Triggers> <DataTrigger Binding="{Binding Status}" Value="Succeeded"> <Setter Property="Background" Value="#DCFCE7"/> </DataTrigger> <DataTrigger Binding="{Binding Status}" Value="Conflict"> <Setter Property="Background" Value="#FEF3C7"/> </DataTrigger> <DataTrigger Binding="{Binding Status}" Value="Error"> <Setter Property="Background" Value="#FEE2E2"/> </DataTrigger> <DataTrigger Binding="{Binding Status}" Value="Not applicable"> <Setter Property="Background" Value="#F3F4F6"/> </DataTrigger> </Style.Triggers> </Style> <Style TargetType="TextBlock" x:Key="StatusBadgeText"> <Setter Property="FontSize" Value="11"/> <Setter Property="FontWeight" Value="SemiBold"/> <Setter Property="Foreground" Value="#374151"/> <Style.Triggers> <DataTrigger Binding="{Binding Status}" Value="Succeeded"> <Setter Property="Foreground" Value="#166534"/> </DataTrigger> <DataTrigger Binding="{Binding Status}" Value="Conflict"> <Setter Property="Foreground" Value="#92400E"/> </DataTrigger> <DataTrigger Binding="{Binding Status}" Value="Error"> <Setter Property="Foreground" Value="#991B1B"/> </DataTrigger> <DataTrigger Binding="{Binding Status}" Value="Not applicable"> <Setter Property="Foreground" Value="#6B7280"/> </DataTrigger> </Style.Triggers> </Style> <!-- Value cell style: green when row is covered, red when missing, etc. --> <Style TargetType="TextBlock" x:Key="ValueCell"> <Setter Property="Padding" Value="6,2"/> <Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="TextWrapping" Value="Wrap"/> </Style> <!-- Selectable read-only cell (allows text highlight + copy) --> <Style x:Key="SelectableCell" TargetType="TextBox"> <Setter Property="IsReadOnly" Value="True"/> <Setter Property="Background" Value="Transparent"/> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Padding" Value="6,2"/> <Setter Property="IsTabStop" Value="False"/> <Setter Property="Foreground" Value="{DynamicResource TextPrimary}"/> <Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="TextBox"> <ScrollViewer x:Name="PART_ContentHost" Background="Transparent"/> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="SelectableCellWrapped" BasedOn="{StaticResource SelectableCell}" TargetType="TextBox"> <Setter Property="TextWrapping" Value="Wrap"/> </Style> </Window.Resources> <DockPanel> <!-- Header --> <Border DockPanel.Dock="Top" Background="{DynamicResource HeaderBg}" Padding="20,14" BorderBrush="{DynamicResource BorderColor}" BorderThickness="0,0,0,1"> <Border.Effect><DropShadowEffect ShadowDepth="1" Opacity="0.05" BlurRadius="4" Direction="270"/></Border.Effect> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <StackPanel Orientation="Horizontal" Grid.Column="0"> <Image x:Name="HeaderLogoImage" Width="40" Height="40" Margin="0,0,10,0" VerticalAlignment="Center"/> <TextBlock Style="{StaticResource H1}" Text="IntuneDiff" VerticalAlignment="Center"/> <TextBlock VerticalAlignment="Center" Margin="12,0,0,0" Foreground="{DynamicResource TextSecondary}" FontSize="12" Text="PowerShell Edition"/> <TextBlock x:Name="VersionLabel" VerticalAlignment="Center" Margin="8,0,0,0" Foreground="{DynamicResource TextSecondary}" FontSize="11" Text=""/> </StackPanel> <StackPanel Orientation="Horizontal" Grid.Column="1"> <TextBlock x:Name="TenantLabel" VerticalAlignment="Center" Margin="0,0,12,0" Foreground="#3498DB" FontWeight="SemiBold" FontSize="12" Text="" Visibility="Collapsed"/> <Button x:Name="GrantPermissionsButton" Content="⚠ Grant Permissions" Foreground="#F87171" FontWeight="SemiBold" FontSize="12" Margin="0,0,8,0" Visibility="Collapsed" ToolTip="Some required permissions are missing. Click to request consent." UseLayoutRounding="True" SnapsToDevicePixels="True" TextOptions.TextRenderingMode="ClearType" TextOptions.TextFormattingMode="Display"/> <ToggleButton x:Name="UserAccountButton" Margin="0,0,8,0" Cursor="Hand" Visibility="Collapsed"> <ToggleButton.Template> <ControlTemplate TargetType="ToggleButton"> <Border Background="Transparent" Padding="6,4" CornerRadius="4"> <ContentPresenter/> </Border> </ControlTemplate> </ToggleButton.Template> <StackPanel Orientation="Horizontal"> <Grid Width="24" Height="24" Margin="0,0,6,0"> <Ellipse Width="24" Height="24" Fill="#E5E7EB"/> <TextBlock x:Name="UserIconFallback" Text="" FontFamily="Segoe MDL2 Assets" FontSize="14" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="{DynamicResource TextSecondary}"/> <Ellipse x:Name="UserPhotoClip" Width="24" Height="24"> <Ellipse.Fill> <ImageBrush x:Name="UserPhotoBrush" Stretch="UniformToFill"/> </Ellipse.Fill> </Ellipse> </Grid> <TextBlock x:Name="UserLabel" VerticalAlignment="Center" Foreground="{DynamicResource TextSecondary}" Text=""/> <TextBlock Text=" ▼" VerticalAlignment="Center" Foreground="{DynamicResource TextMuted}" FontSize="10"/> </StackPanel> </ToggleButton> <TextBlock x:Name="UserLabelStatic" VerticalAlignment="Center" Margin="0,0,8,0" Foreground="{DynamicResource TextSecondary}" Text="Not signed in"/> <Button x:Name="ThemeToggleButton" Content="☾" ToolTip="Toggle dark mode" Padding="8,6" MinWidth="0" Margin="0,0,8,0" FontSize="16"/> <Button x:Name="SignInButton" Content="Sign In"/> </StackPanel> <Popup x:Name="AccountPopup" PlacementTarget="{Binding ElementName=UserAccountButton}" Placement="Bottom" StaysOpen="False" AllowsTransparency="True" IsOpen="{Binding IsChecked, ElementName=UserAccountButton, Mode=TwoWay}"> <Border Background="{DynamicResource CardBg}" BorderBrush="{DynamicResource BorderColor}" BorderThickness="1" CornerRadius="12" Padding="8" MinWidth="300" MaxHeight="400"> <Border.Effect><DropShadowEffect ShadowDepth="4" Opacity="0.1" BlurRadius="16"/></Border.Effect> <StackPanel> <StackPanel x:Name="AccountListPanel"/> <Separator Margin="4,6"/> <Button x:Name="NewAccountButton" Style="{StaticResource PopupMenuButton}"> <StackPanel Orientation="Horizontal"> <TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="18" VerticalAlignment="Center" Foreground="{DynamicResource TextSecondary}" Margin="0,0,10,0"/> <TextBlock Text="Sign in with a different account" FontSize="12" VerticalAlignment="Center" Foreground="{DynamicResource TextPrimary}"/> </StackPanel> </Button> <Button x:Name="SignOutButton" Style="{StaticResource PopupMenuButton}"> <StackPanel Orientation="Horizontal"> <TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="18" VerticalAlignment="Center" Foreground="#D93025" Margin="0,0,10,0"/> <TextBlock Text="Sign out" FontSize="12" VerticalAlignment="Center" Foreground="#D93025"/> </StackPanel> </Button> </StackPanel> </Border> </Popup> </Grid> </Border> <!-- Credits / footer --> <Border DockPanel.Dock="Bottom" Background="{DynamicResource HeaderBg}" Padding="16,8" BorderBrush="{DynamicResource BorderColor}" BorderThickness="0,1,0,0"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <StackPanel Orientation="Horizontal" VerticalAlignment="Center"> <TextBlock Foreground="{DynamicResource TextSecondary}" Text="© 2026 IntuneDiff — by " VerticalAlignment="Center"/> <TextBlock VerticalAlignment="Center"> <Hyperlink x:Name="AuthorLink" NavigateUri="https://www.linkedin.com/in/sandy-tsang/" Foreground="#0A66C2" TextDecorations=""> <InlineUIContainer> <Viewbox Width="14" Height="14" Margin="0,0,4,0"> <Canvas Width="24" Height="24"> <Path Fill="#0A66C2" Data="M19 3A2 2 0 0 1 21 5V19A2 2 0 0 1 19 21H5A2 2 0 0 1 3 19V5A2 2 0 0 1 5 3H19M18.5 18.5V13.2A3.26 3.26 0 0 0 15.24 9.94C14.39 9.94 13.4 10.46 12.92 11.24V10.13H10.13V18.5H12.92V13.57C12.92 12.8 13.54 12.17 14.31 12.17A1.4 1.4 0 0 1 15.71 13.57V18.5H18.5M6.88 8.56A1.68 1.68 0 0 0 8.56 6.88C8.56 5.95 7.81 5.19 6.88 5.19A1.69 1.69 0 0 0 5.19 6.88C5.19 7.81 5.95 8.56 6.88 8.56M8.27 18.5V10.13H5.5V18.5H8.27Z"/> </Canvas> </Viewbox> </InlineUIContainer> <Run Text="Sandy Zeng" FontWeight="SemiBold"/> </Hyperlink> </TextBlock> </StackPanel> <Button x:Name="BuyMeCoffeeButton" Grid.Column="1" Background="Transparent" BorderThickness="0" Padding="0" Margin="0" Cursor="Hand" ToolTip="Buy Me A Coffee"> <Image x:Name="BuyMeCoffeeImage" Height="28"/> </Button> </Grid> </Border> <!-- Status bar --> <Border DockPanel.Dock="Bottom" Background="{DynamicResource HeaderBg}" Padding="16,8" BorderBrush="{DynamicResource BorderColor}" BorderThickness="0,1,0,0"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <TextBlock x:Name="StatusLabel" Text="Ready." VerticalAlignment="Center" Foreground="{DynamicResource TextSecondary}" FontSize="12"/> <ProgressBar x:Name="BusyBar" Grid.Column="1" Width="140" Height="4" IsIndeterminate="False" Visibility="Hidden" Foreground="{DynamicResource AccentColor}" Background="{DynamicResource BorderColor}"/> </Grid> </Border> <!-- Update banner (shown when a newer version is available) --> <Border x:Name="UpdateBanner" DockPanel.Dock="Top" Background="#92400E" Padding="12,8" Visibility="Collapsed"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <TextBlock x:Name="UpdateBannerText" Foreground="#FEF3C7" FontSize="12" FontWeight="SemiBold" VerticalAlignment="Center" TextWrapping="Wrap"/> <Button x:Name="UpdateDismissButton" Grid.Column="1" Content="✕" Background="Transparent" BorderThickness="0" Foreground="#FEF3C7" FontSize="14" Cursor="Hand" Padding="8,0"/> </Grid> </Border> <!-- Main content area --> <Grid> <!-- Welcome / Landing page (shown when not signed in) --> <Border x:Name="WelcomeOverlay" Background="{DynamicResource WindowBg}" Visibility="Visible" Panel.ZIndex="10"> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="40,28" MaxWidth="680"> <!-- Logo + title row --> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,0,0,10"> <Image x:Name="WelcomeLogoImage" Width="56" Height="56" Margin="0,0,14,0" VerticalAlignment="Center"/> <TextBlock Text="Analyze, Compare, & Secure your Intune." FontSize="24" FontWeight="Bold" Foreground="{DynamicResource TextPrimary}" VerticalAlignment="Center" TextWrapping="Wrap"/> </StackPanel> <TextBlock Text="A free toolkit for comparing Microsoft Intune policies, analyzing configuration differences, and validating security baselines." FontSize="13" Foreground="{DynamicResource TextSecondary}" TextAlignment="Center" TextWrapping="Wrap" Margin="0,0,0,20"/> <!-- Sign in --> <Button x:Name="WelcomeSignInButton" Content="Sign In to Get Started" Padding="22,12" Style="{StaticResource PrimaryButton}" HorizontalAlignment="Center" FontSize="15"/> <TextBlock Text="Sign in with your Microsoft Entra ID account to access your Intune policies in real-time." FontSize="12" Foreground="{DynamicResource TextSecondary}" TextAlignment="Center" Margin="0,10,0,8"/> <Button x:Name="WelcomeReleaseNotesButton" Content="Release Notes" Padding="12,6" HorizontalAlignment="Center" Margin="0,0,0,20" Cursor="Hand" Background="Transparent" BorderThickness="1" BorderBrush="{DynamicResource BorderColor}" Foreground="{DynamicResource TextSecondary}" FontSize="12"/> <!-- Feature cards --> <Border Background="{DynamicResource CardBg}" CornerRadius="10" Padding="22,16" Margin="0,0,0,12" BorderBrush="{DynamicResource BorderColor}" BorderThickness="1"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <StackPanel Grid.Column="0" Grid.Row="0" Margin="0,0,0,12"> <TextBlock Text="🔍 Policy Comparison" FontSize="13" FontWeight="SemiBold" Foreground="{DynamicResource TextPrimary}"/> <TextBlock Text="Compare policies against baselines to find conflicts and missing settings." FontSize="12" Foreground="{DynamicResource TextSecondary}" TextWrapping="Wrap" Margin="0,3,0,0"/> </StackPanel> <StackPanel Grid.Column="1" Grid.Row="0" Margin="12,0,0,12"> <TextBlock Text="📋 Device Settings" FontSize="13" FontWeight="SemiBold" Foreground="{DynamicResource TextPrimary}"/> <TextBlock Text="View all settings applied to a specific device with status tracking." FontSize="12" Foreground="{DynamicResource TextSecondary}" TextWrapping="Wrap" Margin="0,3,0,0"/> </StackPanel> <StackPanel Grid.Column="0" Grid.Row="1"> <TextBlock Text="🔎 Tenant Search" FontSize="13" FontWeight="SemiBold" Foreground="{DynamicResource TextPrimary}"/> <TextBlock Text="Search across all tenant policy settings to find specific configurations." FontSize="12" Foreground="{DynamicResource TextSecondary}" TextWrapping="Wrap" Margin="0,3,0,0"/> </StackPanel> <StackPanel Grid.Column="1" Grid.Row="1" Margin="12,0,0,0"> <TextBlock Text="📊 Device vs Policy" FontSize="13" FontWeight="SemiBold" Foreground="{DynamicResource TextPrimary}"/> <TextBlock Text="Compare device settings against tenant policies to find gaps." FontSize="12" Foreground="{DynamicResource TextSecondary}" TextWrapping="Wrap" Margin="0,3,0,0"/> </StackPanel> </Grid> </Border> <TextBlock FontSize="11" Foreground="{DynamicResource TextSecondary}" TextAlignment="Center" Text="FREE to use — IntuneDiff is completely free for personal, work, and commercial use."/> <!-- Hidden named element populated with release notes (shown in overlay) --> <TextBlock x:Name="ReleaseNotesText" Visibility="Collapsed" TextWrapping="Wrap"/> </StackPanel> </Border> <!-- Release Notes overlay (visible without sign-in) --> <Border x:Name="ReleaseNotesOverlay" Background="{DynamicResource PageBg}" Visibility="Collapsed" Panel.ZIndex="5"> <DockPanel Margin="32,24"> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,16"> <TextBlock Text="What's New" FontSize="20" FontWeight="Bold" Foreground="{DynamicResource TextPrimary}" VerticalAlignment="Center"/> <Button x:Name="CloseReleaseNotesButton" Content="← Back" Padding="12,6" Margin="20,0,0,0" Background="Transparent" BorderThickness="1" BorderBrush="{DynamicResource BorderColor}" Foreground="{DynamicResource TextSecondary}" FontSize="12" Cursor="Hand" VerticalAlignment="Center"/> </StackPanel> <ScrollViewer VerticalScrollBarVisibility="Auto"> <TextBlock x:Name="ReleaseNotesOverlayText" TextWrapping="Wrap" Foreground="{DynamicResource TextPrimary}" FontSize="13" LineHeight="22"/> </ScrollViewer> </DockPanel> </Border> <!-- Tab content (hidden until signed in) --> <TabControl x:Name="MainTabControl" Margin="16,12" TextElement.Foreground="{DynamicResource TextPrimary}" Visibility="Collapsed"> <!-- TAB 1: Policy Comparison --> <TabItem Header="Policy Comparison"> <Grid Margin="0,8,0,0"> <Grid.ColumnDefinitions> <ColumnDefinition Width="700" MinWidth="300"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*" MinWidth="200"/> </Grid.ColumnDefinitions> <GridSplitter Grid.Column="1" Width="6" HorizontalAlignment="Center" VerticalAlignment="Stretch" Background="Transparent" Cursor="SizeWE"/> <DockPanel Grid.Column="0" Margin="0,0,8,0"> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,8"> <Button x:Name="LoadPoliciesButton" Content="Load Policies" Style="{StaticResource PrimaryButton}"/> </StackPanel> <Button x:Name="ComparePoliciesButton" DockPanel.Dock="Bottom" Content="Compare 0 Policies Against Baseline" Style="{StaticResource PrimaryButton}" IsDefault="True" HorizontalAlignment="Stretch" Padding="16,10" Margin="0,8,0,0" FontSize="13"/> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" MinWidth="150"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*" MinWidth="150"/> </Grid.ColumnDefinitions> <GridSplitter Grid.Column="1" Width="6" HorizontalAlignment="Center" VerticalAlignment="Stretch" Background="Transparent" Cursor="SizeWE"/> <!-- Baseline pane --> <DockPanel Grid.Column="0"> <TextBlock DockPanel.Dock="Top" FontWeight="SemiBold" Margin="0,0,0,2"> <Run Text="📌 Select Baseline Policy"/> </TextBlock> <TextBlock DockPanel.Dock="Top" Text="Click one policy as your source of truth" FontSize="11" Foreground="{DynamicResource TextSecondary}" Margin="0,0,0,6"/> <WrapPanel DockPanel.Dock="Top" x:Name="BaselineTypeChips" Margin="0,0,0,6"/> <TextBox DockPanel.Dock="Top" x:Name="BaselineSearchBox" Margin="0,0,0,6" VerticalContentAlignment="Center" Tag="Search policy name..."/> <ListView x:Name="BaselineList" SelectionMode="Single" HorizontalContentAlignment="Stretch"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/> <Setter Property="BorderThickness" Value="0,0,0,1"/> <Setter Property="Padding" Value="0"/> <Setter Property="Margin" Value="0"/> <Setter Property="HorizontalContentAlignment" Value="Stretch"/> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="{DynamicResource ListSelectedBg}"/> <Setter Property="BorderBrush" Value="{DynamicResource ListSelectedBorder}"/> <Setter Property="BorderThickness" Value="3,0,0,1"/> </Trigger> </Style.Triggers> </Style> </ListView.ItemContainerStyle> <ListView.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" Margin="4,6"> <RadioButton GroupName="BaselinePolicy" IsChecked="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem}}" VerticalAlignment="Center" Margin="0,0,8,0"/> <StackPanel> <TextBlock Text="{Binding Name}" TextWrapping="Wrap" FontWeight="Medium" FontSize="13"/> <StackPanel Orientation="Horizontal" Margin="0,2,0,0"> <Border Background="{DynamicResource BadgeTypeBg}" CornerRadius="4" Padding="6,2" Margin="0,0,4,0"> <TextBlock Text="{Binding Type}" FontSize="10" Foreground="{DynamicResource BadgeTypeFg}"/> </Border> <Border Background="{DynamicResource BadgeAssignedBg}" CornerRadius="4" Padding="6,2"> <Border.Style> <Style TargetType="Border"> <Setter Property="Visibility" Value="Collapsed"/> <Style.Triggers> <DataTrigger Binding="{Binding IsAssigned}" Value="True"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> </Style.Triggers> </Style> </Border.Style> <TextBlock Text="Assigned" FontSize="10" Foreground="{DynamicResource BadgeAssignedFg}"/> </Border> </StackPanel> </StackPanel> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> </DockPanel> <!-- Comparison pane --> <DockPanel Grid.Column="2"> <TextBlock DockPanel.Dock="Top" x:Name="ComparisonHeader" FontWeight="SemiBold" Margin="0,0,0,2"> <Run Text="Select Policies to Compare (0 selected)"/> </TextBlock> <TextBlock DockPanel.Dock="Top" Text="Check policies to compare against baseline" FontSize="11" Foreground="{DynamicResource TextSecondary}" Margin="0,0,0,6"/> <WrapPanel DockPanel.Dock="Top" x:Name="ComparisonTypeChips" Margin="0,0,0,6"/> <TextBox DockPanel.Dock="Top" x:Name="ComparisonListSearchBox" Margin="0,0,0,6" VerticalContentAlignment="Center" Tag="Search policy name..."/> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,6"> <Button x:Name="SelectAllComparisonButton" Content="Select All" Padding="10,6" Margin="0,0,6,0" FontSize="12" Width="90" Height="30" Style="{StaticResource PrimaryButton}"/> <Button x:Name="ClearAllComparisonButton" Content="Clear All" Padding="10,6" FontSize="12" Width="90" Height="30" Style="{StaticResource DangerButton}"/> </StackPanel> <ListView x:Name="ComparisonList" HorizontalContentAlignment="Stretch"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Setter Property="BorderBrush" Value="{DynamicResource BorderColor}"/> <Setter Property="BorderThickness" Value="0,0,0,1"/> <Setter Property="Padding" Value="0"/> <Setter Property="Margin" Value="0"/> <Setter Property="HorizontalContentAlignment" Value="Stretch"/> </Style> </ListView.ItemContainerStyle> <ListView.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" Margin="4,6"> <CheckBox IsChecked="{Binding IsChecked}" VerticalAlignment="Center" Margin="0,0,8,0"/> <StackPanel> <TextBlock Text="{Binding Name}" TextWrapping="Wrap" FontWeight="Medium" FontSize="13"/> <StackPanel Orientation="Horizontal" Margin="0,2,0,0"> <Border Background="{DynamicResource BadgeTypeBg}" CornerRadius="4" Padding="6,2" Margin="0,0,4,0"> <TextBlock Text="{Binding Type}" FontSize="10" Foreground="{DynamicResource BadgeTypeFg}"/> </Border> <Border Background="{DynamicResource BadgeAssignedBg}" CornerRadius="4" Padding="6,2"> <Border.Style> <Style TargetType="Border"> <Setter Property="Visibility" Value="Collapsed"/> <Style.Triggers> <DataTrigger Binding="{Binding IsAssigned}" Value="True"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> </Style.Triggers> </Style> </Border.Style> <TextBlock Text="Assigned" FontSize="10" Foreground="{DynamicResource BadgeAssignedFg}"/> </Border> </StackPanel> </StackPanel> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> </DockPanel> </Grid> </DockPanel> <DockPanel Grid.Column="2"> <!-- Summary cards --> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,8"> <Border Style="{StaticResource SummaryCard}" Background="#F0FDF4" BorderBrush="#F0FDF4"> <StackPanel> <TextBlock x:Name="CardCoveredCount" Style="{StaticResource SummaryCount}" Foreground="#166534" Text="0"/> <TextBlock Style="{StaticResource SummaryLabel}" Text="Covered"/> </StackPanel> </Border> <Border Style="{StaticResource SummaryCard}" Background="#FFFBEB" BorderBrush="#FFFBEB"> <StackPanel> <TextBlock x:Name="CardConflictCount" Style="{StaticResource SummaryCount}" Foreground="#92400E" Text="0"/> <TextBlock Style="{StaticResource SummaryLabel}" Text="Conflicts"/> </StackPanel> </Border> <Border Style="{StaticResource SummaryCard}" Background="#FEF2F2" BorderBrush="#FEF2F2"> <StackPanel> <TextBlock x:Name="CardMissingCount" Style="{StaticResource SummaryCount}" Foreground="#991B1B" Text="0"/> <TextBlock Style="{StaticResource SummaryLabel}" Text="Missing"/> </StackPanel> </Border> <Border Style="{StaticResource SummaryCard}" Background="#EFF6FF" BorderBrush="#EFF6FF"> <StackPanel> <TextBlock x:Name="CardExtraCount" Style="{StaticResource SummaryCount}" Foreground="#1E40AF" Text="0"/> <TextBlock Style="{StaticResource SummaryLabel}" Text="Extra"/> </StackPanel> </Border> <Border Style="{StaticResource SummaryCard}" Background="#FAF5FF" BorderBrush="#FAF5FF"> <StackPanel> <TextBlock x:Name="CardAttentionCount" Style="{StaticResource SummaryCount}" Foreground="#6B21A8" Text="0"/> <TextBlock Style="{StaticResource SummaryLabel}" Text="Attention"/> </StackPanel> </Border> <TextBlock x:Name="ComparisonSummary" Text="No comparison yet." VerticalAlignment="Center" Margin="12,0,0,0" Foreground="{DynamicResource TextSecondary}" TextWrapping="Wrap"/> </StackPanel> <!-- Search + filter chips --> <Grid DockPanel.Dock="Top" Margin="0,0,0,8"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <TextBox x:Name="ComparisonSearchBox" Grid.Column="0" VerticalContentAlignment="Center" Margin="0,0,12,0" Tag="Search settings..."/> <StackPanel Grid.Column="1" Orientation="Horizontal"> <ToggleButton x:Name="FilterAll" Style="{StaticResource FilterChip}" IsChecked="True" Content="All (0)"/> <ToggleButton x:Name="FilterCovered" Style="{StaticResource FilterChip}" Content="Covered (0)"/> <ToggleButton x:Name="FilterConflict" Style="{StaticResource FilterChip}" Content="Conflict (0)"/> <ToggleButton x:Name="FilterMissing" Style="{StaticResource FilterChip}" Content="Missing (0)"/> <ToggleButton x:Name="FilterExtra" Style="{StaticResource FilterChip}" Content="Extra (0)"/> <ToggleButton x:Name="FilterAttention" Style="{StaticResource FilterChip}" Content="Attention (0)"/> </StackPanel> </Grid> <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,8,0,0"> <TextBlock x:Name="SelectionCountLabel" VerticalAlignment="Center" Foreground="{DynamicResource TextSecondary}" Margin="0,0,12,0" Text=""/> <Button x:Name="SelectAllVisibleButton" Content="Select All" IsEnabled="False"/> <Button x:Name="ClearSelectionButton" Content="Clear" IsEnabled="False"/> <Button x:Name="ExportComparisonButton" Content="Export HTML" IsEnabled="False"/> <Button x:Name="ExportComparisonExcelButton" Content="Export CSV" IsEnabled="False"/> <Button x:Name="ExportComparisonJsonButton" Content="Export Intune JSON" IsEnabled="False"/> </StackPanel> <DataGrid x:Name="ComparisonGrid" IsReadOnly="False"> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="VerticalContentAlignment" Value="Top"/> <Setter Property="MinHeight" Value="28"/> </Style> </DataGrid.RowStyle> <DataGrid.Columns> <DataGridTemplateColumn Width="40" CanUserResize="False" IsReadOnly="True"> <DataGridTemplateColumn.HeaderTemplate> <DataTemplate> <CheckBox x:Name="SelectAllCheckBox" ToolTip="Select/deselect all visible rows"/> </DataTemplate> </DataGridTemplateColumn.HeaderTemplate> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" HorizontalAlignment="Center" VerticalAlignment="Center"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Setting" Width="2*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding SettingName, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Result" Width="110" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Border Style="{StaticResource ResultBadge}"> <TextBlock Style="{StaticResource ResultBadgeText}" Text="{Binding Result}"/> </Border> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Policy" Width="1.4*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding PolicyName, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Baseline Value" Width="1.4*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding BaselineValue, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Current Value" Width="1.4*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding CurrentValue, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </DockPanel> </Grid> </TabItem> <!-- TAB 2: Device Settings --> <TabItem Header="Device Settings"> <DockPanel Margin="0,8,0,0"> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,8"> <TextBlock VerticalAlignment="Center" Text="Intune Device ID:" Margin="0,0,8,0" Foreground="{DynamicResource TextPrimary}"/> <TextBox x:Name="DeviceIdBox" Width="320" VerticalAlignment="Center" /> <Button x:Name="SearchDeviceButton" Content="Load Settings" Style="{StaticResource PrimaryButton}"/> <Button x:Name="PauseDeviceLoadButton" Content="Pause" Padding="10,6" Margin="6,0,0,0" Visibility="Collapsed"/> <Button x:Name="StopDeviceLoadButton" Content="Stop" Padding="10,6" Margin="6,0,0,0" Visibility="Collapsed" Style="{StaticResource DangerButton}"/> <TextBlock x:Name="DeviceSummary" VerticalAlignment="Center" Margin="12,0,0,0" Foreground="{DynamicResource TextSecondary}"/> </StackPanel> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,4"> <TextBlock Text="Policy Type:" VerticalAlignment="Center" Margin="0,0,8,0" Foreground="{DynamicResource TextSecondary}" Width="90"/> <WrapPanel x:Name="DevicePolicyTypeChips"/> </StackPanel> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,4"> <TextBlock Text="Status:" VerticalAlignment="Center" Margin="0,0,8,0" Foreground="{DynamicResource TextSecondary}" Width="90"/> <WrapPanel x:Name="DeviceStatusChips"/> </StackPanel> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,4"> <TextBlock Text="User:" VerticalAlignment="Center" Margin="0,0,8,0" Foreground="{DynamicResource TextSecondary}" Width="90"/> <WrapPanel x:Name="DeviceUserChips"/> </StackPanel> <TextBox x:Name="DeviceSearchBox" DockPanel.Dock="Top" Margin="0,4,0,8" Tag="Search settings..."/> <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,8,0,0"> <TextBlock x:Name="DeviceResultCount" VerticalAlignment="Center" Margin="0,0,12,0" Foreground="{DynamicResource TextSecondary}"/> <Button x:Name="ExportDeviceButton" Content="Export HTML" IsEnabled="False"/> <Button x:Name="ExportDeviceExcelButton" Content="Export CSV" IsEnabled="False"/> </StackPanel> <DataGrid x:Name="DeviceGrid" IsReadOnly="True"> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="VerticalContentAlignment" Value="Top"/> <Setter Property="MinHeight" Value="28"/> </Style> </DataGrid.RowStyle> <DataGrid.Columns> <DataGridTemplateColumn Header="Setting" Width="2*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding SettingName, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Value" Width="1.4*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding Value, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Policy" Width="1.4*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding PolicyName, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Policy Type" Width="150" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding PolicyType, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Status" Width="110" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Border Style="{StaticResource StatusBadge}"> <TextBlock Style="{StaticResource StatusBadgeText}" Text="{Binding Status}"/> </Border> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Logged In User" Width="160" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding User, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </DockPanel> </TabItem> <!-- TAB 3: Search Tenant Setting --> <TabItem Header="Search Tenant Setting"> <DockPanel Margin="0,8,0,0"> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,8"> <Button x:Name="LoadTenantSettingsButton" Content="Load Settings" Style="{StaticResource PrimaryButton}"/> <Button x:Name="PauseTenantLoadButton" Content="Pause" Visibility="Collapsed" Margin="8,0,0,0"/> <Button x:Name="StopTenantLoadButton" Content="Stop" Visibility="Collapsed" Margin="6,0,0,0" Style="{StaticResource DangerButton}"/> <TextBlock x:Name="TenantSettingsStatus" VerticalAlignment="Center" Margin="12,0,0,0" Foreground="{DynamicResource TextSecondary}"/> </StackPanel> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,4"> <TextBlock Text="Type:" VerticalAlignment="Center" Margin="0,0,8,0" Foreground="{DynamicResource TextSecondary}"/> <WrapPanel> <ToggleButton x:Name="TenantTypeAll" Style="{StaticResource FilterChip}" IsChecked="True" Content="All Types"/> <ToggleButton x:Name="TenantTypeSettingsCatalog" Style="{StaticResource FilterChip}" Content="Settings Catalog"/> <ToggleButton x:Name="TenantTypeSecurityBaseline" Style="{StaticResource FilterChip}" Content="Security Baseline Policy"/> <ToggleButton x:Name="TenantTypeBaselineTemplate" Style="{StaticResource FilterChip}" Content="Security Baseline Template"/> <ToggleButton x:Name="TenantTypeEndpointSecurity" Style="{StaticResource FilterChip}" Content="Endpoint Security"/> </WrapPanel> </StackPanel> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,6"> <TextBlock Text="Assignment:" VerticalAlignment="Center" Margin="0,0,8,0" Foreground="{DynamicResource TextSecondary}"/> <WrapPanel> <ToggleButton x:Name="TenantAssignAll" Style="{StaticResource FilterChip}" IsChecked="True" Content="All"/> <ToggleButton x:Name="TenantAssignAssigned" Style="{StaticResource FilterChip}" Content="Assigned"/> <ToggleButton x:Name="TenantAssignNotAssigned" Style="{StaticResource FilterChip}" Content="Not Assigned"/> </WrapPanel> </StackPanel> <TextBox x:Name="TenantSearchBox" DockPanel.Dock="Top" Margin="0,0,0,8" Tag="Search settings..."/> <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,8,0,0"> <TextBlock x:Name="TenantResultCount" VerticalAlignment="Center" Margin="0,0,12,0" Foreground="{DynamicResource TextSecondary}"/> <Button x:Name="ExportTenantHtmlButton" Content="Export HTML" IsEnabled="False"/> <Button x:Name="ExportTenantExcelButton" Content="Export CSV" IsEnabled="False"/> </StackPanel> <DataGrid x:Name="TenantSettingsGrid" IsReadOnly="True"> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="VerticalContentAlignment" Value="Top"/> <Setter Property="MinHeight" Value="28"/> </Style> </DataGrid.RowStyle> <DataGrid.Columns> <DataGridTemplateColumn Header="Setting" Width="2*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding SettingName, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Value" Width="1.4*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding Value, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Policy" Width="1.4*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding PolicyName, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Type" Width="150" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding PolicyType, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Assigned" Width="80" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding AssignedText, Mode=OneWay}" Style="{StaticResource SelectableCell}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </DockPanel> </TabItem> <!-- TAB 4: Device vs Policy --> <TabItem Header="Device vs Policy"> <Grid Margin="0,8,0,0"> <Grid.ColumnDefinitions> <ColumnDefinition Width="260" MinWidth="200"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <GridSplitter Grid.Column="1" Width="6" HorizontalAlignment="Center" VerticalAlignment="Stretch" Background="Transparent" Cursor="SizeWE"/> <DockPanel Grid.Column="0" Margin="0,0,8,0"> <StackPanel DockPanel.Dock="Top" Margin="0,0,0,6"> <TextBlock Text="Intune Device ID" FontWeight="SemiBold" Margin="0,0,0,4"/> <TextBox x:Name="DvpDeviceIdBox" Margin="0,0,0,8" VerticalContentAlignment="Center"/> <Button x:Name="DvpLoadPoliciesButton" Content="Load Tenant Policies" Style="{StaticResource PrimaryButton}" HorizontalAlignment="Left" Margin="0,0,0,8"/> <TextBlock x:Name="DvpPoliciesLabel" Text="Select tenant policies to compare against" FontWeight="SemiBold" Margin="0,0,0,4"/> </StackPanel> <StackPanel DockPanel.Dock="Top" Margin="0,0,0,4"> <TextBlock Text="Filter by type:" FontSize="11" Foreground="{DynamicResource TextSecondary}" Margin="0,0,0,3"/> <WrapPanel x:Name="DvpTypeChips" Margin="0,0,0,4"/> <TextBlock Text="Filter by assignment:" FontSize="11" Foreground="{DynamicResource TextSecondary}" Margin="0,0,0,3"/> <WrapPanel x:Name="DvpAssignChips" Margin="0,0,0,4"/> <TextBox x:Name="DvpSearchBox" Margin="0,0,0,6" VerticalContentAlignment="Center" Tag="Search policy name..."/> </StackPanel> <StackPanel DockPanel.Dock="Bottom" Margin="0,8,0,0"> <Button x:Name="DvpCompareButton" Content="Compare" Padding="16,10" Style="{StaticResource PrimaryButton}" HorizontalAlignment="Stretch" FontSize="13"/> </StackPanel> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,6"> <Button x:Name="DvpSelectAllButton" Content="Select All" Padding="10,6" Margin="0,0,6,0" FontSize="12" Width="90" Height="30" Style="{StaticResource PrimaryButton}"/> <Button x:Name="DvpClearAllButton" Content="Clear All" Padding="10,6" FontSize="12" Width="90" Height="30" Style="{StaticResource DangerButton}"/> </StackPanel> <ListView x:Name="DvpPoliciesList" SelectionMode="Extended" HorizontalContentAlignment="Stretch"> <ListView.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" Margin="4,6"> <CheckBox IsChecked="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem}}" VerticalAlignment="Center" Margin="0,0,8,0"/> <StackPanel> <TextBlock Text="{Binding Name}" TextWrapping="Wrap" FontWeight="Medium" FontSize="13"/> <StackPanel Orientation="Horizontal" Margin="0,4,0,0"> <Border Background="{DynamicResource BadgeTypeBg}" CornerRadius="4" Padding="6,2" Margin="0,0,4,0"> <TextBlock Text="{Binding Type}" FontSize="10" Foreground="{DynamicResource BadgeTypeFg}"/> </Border> <Border Background="{DynamicResource BadgeAssignedBg}" CornerRadius="4" Padding="6,2"> <Border.Style> <Style TargetType="Border"> <Setter Property="Visibility" Value="Collapsed"/> <Style.Triggers> <DataTrigger Binding="{Binding IsAssigned}" Value="True"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> </Style.Triggers> </Style> </Border.Style> <TextBlock Text="Assigned" FontSize="10" Foreground="{DynamicResource BadgeAssignedFg}"/> </Border> </StackPanel> </StackPanel> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> </DockPanel> <DockPanel Grid.Column="2"> <!-- Summary cards --> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,8"> <Border Style="{StaticResource SummaryCard}" Background="#F9FAFB" BorderBrush="#F9FAFB"> <StackPanel> <TextBlock x:Name="DvpCardTotalCount" Style="{StaticResource SummaryCount}" Foreground="#374151" Text="0"/> <TextBlock Style="{StaticResource SummaryLabel}" Text="Total"/> </StackPanel> </Border> <Border Style="{StaticResource SummaryCard}" Background="#F0FDF4" BorderBrush="#F0FDF4"> <StackPanel> <TextBlock x:Name="DvpCardCoveredCount" Style="{StaticResource SummaryCount}" Foreground="#166534" Text="0"/> <TextBlock Style="{StaticResource SummaryLabel}" Text="Covered"/> </StackPanel> </Border> <Border Style="{StaticResource SummaryCard}" Background="#FFFBEB" BorderBrush="#FFFBEB"> <StackPanel> <TextBlock x:Name="DvpCardConflictCount" Style="{StaticResource SummaryCount}" Foreground="#92400E" Text="0"/> <TextBlock Style="{StaticResource SummaryLabel}" Text="Conflict"/> </StackPanel> </Border> <Border Style="{StaticResource SummaryCard}" Background="#FEF2F2" BorderBrush="#FEF2F2"> <StackPanel> <TextBlock x:Name="DvpCardMissingCount" Style="{StaticResource SummaryCount}" Foreground="#991B1B" Text="0"/> <TextBlock Style="{StaticResource SummaryLabel}" Text="Missing"/> </StackPanel> </Border> <Border Style="{StaticResource SummaryCard}" Background="#EFF6FF" BorderBrush="#EFF6FF"> <StackPanel> <TextBlock x:Name="DvpCardExtraCount" Style="{StaticResource SummaryCount}" Foreground="#1E40AF" Text="0"/> <TextBlock Style="{StaticResource SummaryLabel}" Text="Extra"/> </StackPanel> </Border> <Border Style="{StaticResource SummaryCard}" Background="#FAF5FF" BorderBrush="#FAF5FF"> <StackPanel> <TextBlock x:Name="DvpCardAttentionCount" Style="{StaticResource SummaryCount}" Foreground="#6B21A8" Text="0"/> <TextBlock Style="{StaticResource SummaryLabel}" Text="Attention"/> </StackPanel> </Border> </StackPanel> <TextBlock DockPanel.Dock="Top" x:Name="DvpSummary" Text="No comparison yet." Foreground="{DynamicResource TextSecondary}" Margin="0,0,0,6"/> <!-- Filter by Result + Search --> <Grid DockPanel.Dock="Top" Margin="0,0,0,8"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <TextBox x:Name="DvpResultSearchBox" Grid.Column="0" VerticalContentAlignment="Center" Margin="0,0,12,0" Tag="Search settings..."/> <StackPanel Grid.Column="1" Orientation="Horizontal"> <ToggleButton x:Name="DvpFilterAll" Style="{StaticResource FilterChip}" IsChecked="True" Content="All (0)"/> <ToggleButton x:Name="DvpFilterCovered" Style="{StaticResource FilterChip}" Content="Covered (0)"/> <ToggleButton x:Name="DvpFilterConflict" Style="{StaticResource FilterChip}" Content="Conflict (0)"/> <ToggleButton x:Name="DvpFilterMissing" Style="{StaticResource FilterChip}" Content="Missing (0)"/> <ToggleButton x:Name="DvpFilterExtra" Style="{StaticResource FilterChip}" Content="Extra (0)"/> <ToggleButton x:Name="DvpFilterAttention" Style="{StaticResource FilterChip}" Content="Attention (0)"/> </StackPanel> </Grid> <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,8,0,0"> <TextBlock x:Name="DvpResultCount" VerticalAlignment="Center" Foreground="{DynamicResource TextSecondary}" Margin="0,0,12,0"/> <Button x:Name="DvpExportButton" Content="Export HTML" IsEnabled="False"/> <Button x:Name="DvpExportExcelButton" Content="Export CSV" IsEnabled="False"/> </StackPanel> <DataGrid x:Name="DvpGrid" IsReadOnly="True"> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="VerticalContentAlignment" Value="Top"/> <Setter Property="MinHeight" Value="28"/> </Style> </DataGrid.RowStyle> <DataGrid.Columns> <DataGridTemplateColumn Header="Setting Name" Width="2*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding SettingName, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Status" Width="110" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Border Style="{StaticResource ResultBadge}"> <TextBlock Style="{StaticResource ResultBadgeText}" Text="{Binding Result}"/> </Border> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Policy Name" Width="1.4*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding PolicyName, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Comparison Policy" Width="1.4*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding ComparisonPolicies, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Device Value" Width="1.4*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding CurrentValue, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Policy Value" Width="1.4*" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding BaselineValue, Mode=OneWay}" Style="{StaticResource SelectableCellWrapped}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </DockPanel> </Grid> </TabItem> <!-- Release Notes tab --> <TabItem Header="Release Notes"> <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" Padding="24,20"> <TextBlock x:Name="ReleaseNotesTabText" FontSize="13" TextWrapping="Wrap" LineHeight="22" Foreground="{DynamicResource TextPrimary}" FontFamily="Segoe UI"/> </ScrollViewer> </TabItem> </TabControl> </Grid> </DockPanel> </Window> '@ |