winrar-keygen/MainWindow.xaml
2026-06-29 19:15:52 +08:00

565 lines
36 KiB
XML

<ui:FluentWindow x:Class="WinRarKeygenGui.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
xmlns:vm="clr-namespace:WinRarKeygenGui.ViewModels"
Title="WinRAR Keygen"
Width="400" MinWidth="360" MaxWidth="480"
SizeToContent="Height"
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen"
ExtendsContentIntoTitleBar="True"
WindowBackdropType="Mica"
FocusVisualStyle="{x:Null}">
<Window.DataContext>
<vm:MainViewModel />
</Window.DataContext>
<Grid Focusable="False"
FocusVisualStyle="{x:Null}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- Custom Title Bar -->
<ui:TitleBar Grid.Row="0"
ShowMaximize="False"
ShowMinimize="True"
Title="" />
<!-- Logo Section (always visible) -->
<StackPanel Grid.Row="1" HorizontalAlignment="Center" Margin="0,2,0,14">
<Image Source="Assets/icon.png"
Width="56" Height="56"
RenderOptions.BitmapScalingMode="HighQuality"
HorizontalAlignment="Center" />
<TextBlock Text="WinRAR Keygen"
FontSize="16" FontWeight="SemiBold"
HorizontalAlignment="Center"
Margin="0,6,0,0" />
</StackPanel>
<!-- Flip Container (fixed height, content swaps inside) -->
<Grid x:Name="FlipContainer" Grid.Row="2" ClipToBounds="True"
Focusable="False"
FocusVisualStyle="{x:Null}">
<!-- ==================== FRONT PANEL ==================== -->
<Border x:Name="FrontPanel" RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<ScaleTransform x:Name="FrontScale" ScaleX="1" />
</Border.RenderTransform>
<ScrollViewer VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled"
Focusable="False"
FocusVisualStyle="{x:Null}">
<StackPanel Margin="24,0,24,16">
<!-- Username -->
<TextBlock Text="{Binding Text.Username}"
FontSize="12" FontWeight="Medium"
Foreground="{ui:ThemeResource TextFillColorSecondaryBrush}"
Margin="0,0,0,4" />
<Border x:Name="UsernameBorder" Style="{StaticResource InputBorderStyle}" Margin="0,0,0,10">
<TextBox Text="{Binding Username, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource MockupTextBoxStyle}" />
</Border>
<Popup x:Name="UsernameWarningPopup"
PlacementTarget="{Binding ElementName=UsernameBorder}"
Placement="Bottom" HorizontalOffset="0" VerticalOffset="-4"
AllowsTransparency="True" PopupAnimation="Fade"
IsOpen="{Binding UsernameWarningVisible}"
IsHitTestVisible="False">
<Grid Width="{Binding ActualWidth, ElementName=UsernameBorder}">
<!-- Body -->
<Border Style="{StaticResource WarningPopupBorderStyle}" Margin="0,5,0,0">
<TextBlock Text="{Binding UsernameWarning}"
Style="{StaticResource WarningPopupTextStyle}" />
</Border>
<!-- Arrow (open path: stroke on sloped edges only, no base) -->
<Path Data="M6,6 L12,0 L18,6"
Fill="{DynamicResource WarningPopupBg}"
Stroke="{DynamicResource WarningPopupBorder}" StrokeThickness="1"
HorizontalAlignment="Left" Margin="14,0,0,0"
VerticalAlignment="Top" />
</Grid>
</Popup>
<!-- License Name -->
<TextBlock Text="{Binding Text.LicenseName}"
FontSize="12" FontWeight="Medium"
Foreground="{ui:ThemeResource TextFillColorSecondaryBrush}"
Margin="0,0,0,4" />
<Border x:Name="LicenseNameBorder" Style="{StaticResource InputBorderStyle}" Margin="0,0,0,10">
<TextBox Text="{Binding LicenseName, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource MockupTextBoxStyle}" />
</Border>
<Popup x:Name="LicenseWarningPopup"
PlacementTarget="{Binding ElementName=LicenseNameBorder}"
Placement="Bottom" HorizontalOffset="0" VerticalOffset="-4"
AllowsTransparency="True" PopupAnimation="Fade"
IsOpen="{Binding LicenseNameWarningVisible}"
IsHitTestVisible="False">
<Grid Width="{Binding ActualWidth, ElementName=LicenseNameBorder}">
<!-- Body -->
<Border Style="{StaticResource WarningPopupBorderStyle}" Margin="0,5,0,0">
<TextBlock Text="{Binding LicenseNameWarning}"
Style="{StaticResource WarningPopupTextStyle}" />
</Border>
<!-- Arrow (open path: stroke on sloped edges only, no base) -->
<Path Data="M6,6 L12,0 L18,6"
Fill="{DynamicResource WarningPopupBg}"
Stroke="{DynamicResource WarningPopupBorder}" StrokeThickness="1"
HorizontalAlignment="Left" Margin="14,0,0,0"
VerticalAlignment="Top" />
</Grid>
</Popup>
<!-- Settings Card -->
<Border Background="{DynamicResource SettingsCardBg}"
CornerRadius="8"
Padding="12"
Margin="0,4,0,4">
<StackPanel>
<!-- Encoding -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Text.Encoding}"
FontSize="12" FontWeight="Medium"
VerticalAlignment="Center"
Foreground="{ui:ThemeResource TextFillColorSecondaryBrush}" />
<Border Grid.Column="1"
Background="{DynamicResource SegmentedControlBg}"
CornerRadius="6" Padding="2">
<Grid x:Name="EncodingGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- Sliding pill indicator (behind radio buttons) -->
<Border x:Name="EncodingPill" Grid.Column="0"
Background="{DynamicResource SegmentedActiveBg}"
CornerRadius="6" IsHitTestVisible="False">
<Border.RenderTransform>
<TranslateTransform x:Name="EncodingPillTranslate" X="0" />
</Border.RenderTransform>
<Border.Effect>
<DropShadowEffect BlurRadius="4" ShadowDepth="1"
Opacity="0.1" Color="Black" />
</Border.Effect>
</Border>
<RadioButton Grid.Column="0" Content="UTF-8" Margin="0,0,2,0"
IsChecked="{Binding SelectedEncoding, Converter={StaticResource IntToBoolConverter}, ConverterParameter=0}"
Style="{StaticResource SegmentedRadioStyle}" GroupName="Encoding" />
<RadioButton Grid.Column="1" Content="ASCII" Margin="2,0"
IsChecked="{Binding SelectedEncoding, Converter={StaticResource IntToBoolConverter}, ConverterParameter=1}"
Style="{StaticResource SegmentedRadioStyle}" GroupName="Encoding" />
<RadioButton Grid.Column="2" Content="ANSI" Margin="2,0,0,0"
IsChecked="{Binding SelectedEncoding, Converter={StaticResource IntToBoolConverter}, ConverterParameter=2}"
Style="{StaticResource SegmentedRadioStyle}" GroupName="Encoding" />
</Grid>
</Border>
</Grid>
<Border Height="1" Background="{DynamicResource SettingsDividerBrush}" Margin="0,8" />
<!-- Output file -->
<Grid IsEnabled="{Binding ActivateWinRar, Converter={StaticResource InverseBoolConverter}}">
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding ActivateWinRar}" Value="True">
<Setter Property="Opacity" Value="0.4" />
</DataTrigger>
<DataTrigger Binding="{Binding ActivateWinRar}" Value="False">
<Setter Property="Opacity" Value="1.0" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Text.Output}"
FontSize="12" FontWeight="Medium"
VerticalAlignment="Center"
Foreground="{ui:ThemeResource TextFillColorSecondaryBrush}" />
<Border Grid.Column="1" Style="{StaticResource SmallInputBorderStyle}" Margin="0,0,6,0">
<TextBox Text="{Binding OutputFilePath, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource SmallTextBoxStyle}" />
</Border>
<Button Grid.Column="2" Content="{Binding Text.Browse}"
Command="{Binding BrowseOutputFileCommand}"
Style="{StaticResource SmallBtnStyle}" />
</Grid>
<Border Height="1" Background="{DynamicResource SettingsDividerBrush}" Margin="0,8" />
<!-- Activate toggle -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" VerticalAlignment="Center">
<TextBlock Text="{Binding Text.ActivateWinRar}" FontSize="12" FontWeight="Medium" />
<TextBlock FontSize="10"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}">
<Run Text="{Binding Text.WriteTo}" /><Run x:Name="WinRarPathLink"
Text="%APPDATA%\WinRAR\"
Cursor="Hand"
MouseEnter="WinRarPath_MouseEnter"
MouseLeave="WinRarPath_MouseLeave"
MouseLeftButtonUp="WinRarPath_Click" />
</TextBlock>
</StackPanel>
<ToggleButton Grid.Column="1"
IsChecked="{Binding ActivateWinRar}"
Style="{StaticResource PillToggleStyle}"
VerticalAlignment="Center" />
</Grid>
</StackPanel>
</Border>
<!-- Generate Button -->
<Button Command="{Binding GenerateCommand}"
Style="{StaticResource GenerateButtonStyle}" Margin="0,6,0,0">
<TextBlock Text="{Binding Text.GenerateKey}" FontSize="13" FontWeight="SemiBold" />
</Button>
<!-- Footer -->
<Border Margin="0,12,0,0" BorderThickness="0,1,0,0"
BorderBrush="{DynamicResource SettingsDividerBrush}" Padding="0,10,0,0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal">
<Button Style="{StaticResource FooterBtnStyle}"
Click="Settings_Click" ToolTip="{Binding Text.Settings}" Margin="0,0,4,0">
<ui:SymbolIcon Symbol="Settings24" FontSize="14" />
</Button>
</StackPanel>
<StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding ArchLabel}" FontSize="10"
Foreground="{ui:ThemeResource TextFillColorDisabledBrush}"
VerticalAlignment="Center" Margin="0,0,8,0" />
<Grid>
<TextBlock x:Name="VersionLink"
Text="{Binding VersionDisplayText}" FontSize="10" Cursor="Hand"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}"
VerticalAlignment="Center"
MouseEnter="VersionLink_MouseEnter"
MouseLeave="VersionLink_MouseLeave"
MouseLeftButtonUp="VersionLink_Click"
ToolTip="{Binding Text.CheckForUpdatesTooltip}" />
<Ellipse Width="6" Height="6" Fill="#E53935"
HorizontalAlignment="Right" VerticalAlignment="Top"
Margin="0,-4,-6,0" IsHitTestVisible="False"
Visibility="{Binding HasUpdate, Converter={StaticResource BoolToVisConverter}}" />
</Grid>
</StackPanel>
</Grid>
</Border>
</StackPanel>
</ScrollViewer>
</Border>
<!-- ==================== BACK PANEL (Settings) ==================== -->
<Border x:Name="BackPanel" Visibility="Collapsed" RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<ScaleTransform x:Name="BackScale" ScaleX="0" />
</Border.RenderTransform>
<DockPanel Margin="24,0,24,16" LastChildFill="True">
<!-- Footer at bottom — back button aligned with gear button -->
<Border DockPanel.Dock="Bottom" Margin="0,12,0,0"
BorderThickness="0,1,0,0"
BorderBrush="{DynamicResource SettingsDividerBrush}"
Padding="0,10,0,0">
<StackPanel Orientation="Horizontal">
<Button Style="{StaticResource FooterBtnStyle}"
Click="BackToMain_Click" ToolTip="{Binding Text.Back}" Margin="0,0,8,0">
<ui:SymbolIcon Symbol="ArrowLeft24" FontSize="14" />
</Button>
<TextBlock Text="{Binding Text.Settings}"
FontSize="13" FontWeight="SemiBold"
VerticalAlignment="Center" />
</StackPanel>
</Border>
<!-- Settings content -->
<ScrollViewer x:Name="SettingsScrollViewer"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled"
Focusable="False"
FocusVisualStyle="{x:Null}"
Style="{StaticResource OverlayScrollViewerStyle}">
<StackPanel VerticalAlignment="Top">
<!-- 1. Remember Settings -->
<Border Background="{DynamicResource SettingsCardBg}"
CornerRadius="8" Padding="14" Margin="0,0,0,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" VerticalAlignment="Center">
<TextBlock Text="{Binding Text.RememberSettings}" FontSize="13" FontWeight="Medium" />
<TextBlock Text="{Binding Text.RememberSettingsDescription}" FontSize="11"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}" Margin="0,3,0,0" />
</StackPanel>
<ToggleButton Grid.Column="1" IsChecked="{Binding RememberSettings}"
Style="{StaticResource PillToggleStyle}" VerticalAlignment="Center" />
</Grid>
</Border>
<!-- 2. Appearance -->
<Border Background="{DynamicResource SettingsCardBg}"
CornerRadius="8" Padding="14" Margin="0,0,0,8"
IsEnabled="{Binding RememberSettings}">
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding RememberSettings}" Value="False">
<Setter Property="Opacity" Value="0.4" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<StackPanel>
<TextBlock Text="{Binding Text.Appearance}" FontSize="13" FontWeight="Medium" Margin="0,0,0,8" />
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Text.Theme}"
FontSize="11"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}"
VerticalAlignment="Center" />
<ComboBox Grid.Column="1"
Width="{StaticResource SettingsComboBoxRowWidth}"
MinWidth="{StaticResource SettingsComboBoxRowWidth}"
MaxWidth="{StaticResource SettingsComboBoxRowWidth}"
ItemsSource="{Binding ThemeOptions}"
SelectedValue="{Binding SelectedThemeMode, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Value"
DisplayMemberPath="DisplayName"
PreviewMouseWheel="SettingsComboBox_PreviewMouseWheel"
Style="{StaticResource SettingsComboBoxStyle}" />
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Text.Language}"
FontSize="11"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}"
VerticalAlignment="Center" />
<ComboBox Grid.Column="1"
Width="{StaticResource SettingsComboBoxRowWidth}"
MinWidth="{StaticResource SettingsComboBoxRowWidth}"
MaxWidth="{StaticResource SettingsComboBoxRowWidth}"
ItemsSource="{Binding LanguageOptions}"
SelectedValue="{Binding SelectedLanguageMode, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Value"
DisplayMemberPath="DisplayName"
PreviewMouseWheel="SettingsComboBox_PreviewMouseWheel"
Style="{StaticResource SettingsComboBoxStyle}" />
</Grid>
</StackPanel>
</Border>
<!-- 3. Auto-fill License Name -->
<Border Background="{DynamicResource SettingsCardBg}"
CornerRadius="8" Padding="14" Margin="0,0,0,8"
IsEnabled="{Binding RememberSettings}">
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding RememberSettings}" Value="False">
<Setter Property="Opacity" Value="0.4" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" VerticalAlignment="Center">
<TextBlock Text="{Binding Text.AutofillLicenseName}" FontSize="13" FontWeight="Medium" />
<TextBlock Text="{Binding Text.AutofillLicenseNameDescription}" FontSize="11"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}" Margin="0,3,0,0" />
</StackPanel>
<ToggleButton Grid.Column="1" IsChecked="{Binding AutoFillLicenseName}"
Style="{StaticResource PillToggleStyle}" VerticalAlignment="Center" />
</Grid>
</Border>
<!-- 4. Backup existing key -->
<Border Background="{DynamicResource SettingsCardBg}"
CornerRadius="8" Padding="14" Margin="0,0,0,8"
IsEnabled="{Binding RememberSettings}">
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding RememberSettings}" Value="False">
<Setter Property="Opacity" Value="0.4" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" VerticalAlignment="Center">
<TextBlock Text="{Binding Text.BackUpExistingKey}" FontSize="13" FontWeight="Medium" />
<TextBlock Text="{Binding Text.BackUpExistingKeyDescription}" FontSize="11"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}" Margin="0,3,0,0" />
</StackPanel>
<ToggleButton Grid.Column="1" IsChecked="{Binding BackupExistingKey}"
Style="{StaticResource PillToggleStyle}" VerticalAlignment="Center" />
</Grid>
</Border>
<!-- 5. Check for Updates -->
<Border Background="{DynamicResource SettingsCardBg}"
CornerRadius="8" Padding="14" Margin="0,0,0,8"
IsEnabled="{Binding RememberSettings}">
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding RememberSettings}" Value="False">
<Setter Property="Opacity" Value="0.4" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" VerticalAlignment="Center">
<TextBlock Text="{Binding Text.CheckForUpdates}" FontSize="13" FontWeight="Medium" />
<TextBlock Text="{Binding Text.CheckForUpdatesDescription}" FontSize="11"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}" Margin="0,3,0,0" />
</StackPanel>
<ToggleButton Grid.Column="1" IsChecked="{Binding CheckForUpdates}"
Style="{StaticResource PillToggleStyle}" VerticalAlignment="Center" />
</Grid>
</Border>
</StackPanel>
</ScrollViewer>
</DockPanel>
</Border>
<!-- ==================== RESULT PANEL (Generated Key) ==================== -->
<Border x:Name="ResultPanel" Visibility="Collapsed" RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<ScaleTransform x:Name="ResultScale" ScaleX="0" />
</Border.RenderTransform>
<DockPanel Margin="24,0,24,16" LastChildFill="True">
<!-- Footer at bottom — back button -->
<Border DockPanel.Dock="Bottom" Margin="0,12,0,0"
BorderThickness="0,1,0,0"
BorderBrush="{DynamicResource SettingsDividerBrush}"
Padding="0,10,0,0">
<StackPanel Orientation="Horizontal">
<Button Style="{StaticResource FooterBtnStyle}"
Click="ResultBackToMain_Click" ToolTip="{Binding Text.Back}" Margin="0,0,8,0">
<ui:SymbolIcon Symbol="ArrowLeft24" FontSize="14" />
</Button>
<TextBlock Text="{Binding Text.GeneratedKey}"
FontSize="13" FontWeight="SemiBold"
VerticalAlignment="Center" />
</StackPanel>
</Border>
<!-- Result content -->
<StackPanel VerticalAlignment="Top">
<!-- Generated header + Copy button -->
<Grid Margin="0,0,0,6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Text.Generated}"
FontSize="12" FontWeight="Medium"
Foreground="{ui:ThemeResource TextFillColorSecondaryBrush}"
VerticalAlignment="Center" />
<Button Grid.Column="1" Command="{Binding CopyOutputCommand}"
Style="{StaticResource CopyBtnStyle}">
<StackPanel Orientation="Horizontal">
<ui:SymbolIcon Symbol="Copy24" FontSize="12" Margin="0,0,4,0" />
<TextBlock Text="{Binding CopyButtonText}" />
</StackPanel>
</Button>
</Grid>
<!-- Output box -->
<Border Background="{DynamicResource OutputBoxBg}"
BorderBrush="{DynamicResource OutputBoxBorder}"
BorderThickness="1" CornerRadius="6" Padding="8">
<TextBox Text="{Binding OutputText, Mode=OneWay}"
IsReadOnly="True" TextWrapping="NoWrap"
FontFamily="Cascadia Code, Consolas, Courier New"
FontSize="9.5" BorderThickness="0"
Background="Transparent"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Auto" />
</Border>
<!-- Status message -->
<Border Background="{DynamicResource SettingsCardBg}"
CornerRadius="6" Padding="10,8" Margin="0,8,0,0"
Visibility="{Binding StatusMessage, Converter={StaticResource StringToVisConverter}}">
<TextBlock FontSize="11"
Foreground="{ui:ThemeResource TextFillColorSecondaryBrush}"
TextWrapping="Wrap" LineHeight="17">
<Run Text="{Binding StatusMessage, Mode=OneWay}" />
<LineBreak />
<Run Text="{Binding Text.KeyWrittenTo}" />
<Run x:Name="StatusPathLink"
Text="{Binding StatusFilePath, Mode=OneWay}"
Cursor="Hand"
MouseEnter="StatusPath_MouseEnter"
MouseLeave="StatusPath_MouseLeave"
MouseLeftButtonUp="StatusPath_Click" />
</TextBlock>
</Border>
</StackPanel>
</DockPanel>
</Border>
<!-- ==================== CONFETTI OVERLAY ==================== -->
<Canvas x:Name="ConfettiCanvas" IsHitTestVisible="False" />
</Grid>
</Grid>
</ui:FluentWindow>