Vollständige Implementierung des EngineeringSync-Middleware-Tools: - Windows Service (Kestrel :5050) mit FileSystemWatcher + SignalR - WPF Tray-App mit PendingChanges- und Projektverwaltungs-Fenster - Setup-Wizard (8-Schritte-Installer) - SQLite/EF Core Datenschicht (WAL-Modus) - SHA-256-basiertes Debouncing (2s Fenster) - Backup-System mit konfigurierbarer Aufbewahrung Bugfixes & Verbesserungen: - BUG-1: AppDbContext OnConfiguring invertierte Bedingung behoben - BUG-2: Event-Handler-Leak in TrayApp (Fenster-Singleton-Pattern) - BUG-3: ProjectConfigChanged SignalR-Signal in allen CRUD-Endpoints - BUG-5: Rename-Sync löscht alte Datei im Simulations-Ordner - BUG-6: Doppeltes Dispose von SignalR verhindert - BUG-7: Registry-Deinstallation nur EngineeringSync-Eintrag entfernt - S1: Path-Traversal-Schutz via SafeCombine() im SyncManager - E1: FSW Buffer 64KB + automatischer Re-Scan bei Overflow - E2: Retry-Logik (3x) für gesperrte Dateien mit exponentiellem Backoff - E4: Channel.Writer.TryComplete() beim Shutdown - C2: HubMethodNames-Konstanten statt Magic Strings - E3: Pagination in Changes-API (page/pageSize Query-Parameter) - A1: Fire-and-Forget mit try/catch + Logging Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
252 lines
13 KiB
XML
252 lines
13 KiB
XML
<Window x:Class="EngineeringSync.Setup.Views.WizardWindow"
|
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:vm="clr-namespace:EngineeringSync.Setup.ViewModels"
|
|
Title="EngineeringSync Setup"
|
|
Width="860" Height="580"
|
|
WindowStartupLocation="CenterScreen"
|
|
ResizeMode="NoResize"
|
|
WindowStyle="None"
|
|
AllowsTransparency="True"
|
|
Background="Transparent">
|
|
|
|
<Window.DataContext>
|
|
<vm:WizardViewModel/>
|
|
</Window.DataContext>
|
|
|
|
<!-- Äußerer Schatten-Container -->
|
|
<Border CornerRadius="10"
|
|
Background="White">
|
|
<Border.Effect>
|
|
<DropShadowEffect Color="#40000000" BlurRadius="30" ShadowDepth="0" Opacity="0.4"/>
|
|
</Border.Effect>
|
|
|
|
<Grid>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="260"/>
|
|
<ColumnDefinition Width="*"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<!-- ═══════════════════════════════
|
|
LINKE SIDEBAR
|
|
═══════════════════════════════ -->
|
|
<Border Grid.Column="0"
|
|
Background="{StaticResource SidebarGradient}"
|
|
CornerRadius="10,0,0,10">
|
|
<Grid>
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
<RowDefinition Height="Auto"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<!-- Logo-Bereich -->
|
|
<StackPanel Grid.Row="0" Margin="24,32,24,32">
|
|
<!-- App-Icon (Segoe MDL2 Gear-ähnliches Symbol) -->
|
|
<Border Width="52" Height="52"
|
|
CornerRadius="12"
|
|
HorizontalAlignment="Left"
|
|
Margin="0,0,0,16">
|
|
<Border.Background>
|
|
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
|
|
<GradientStop Color="#0078D4" Offset="0"/>
|
|
<GradientStop Color="#00B4FF" Offset="1"/>
|
|
</LinearGradientBrush>
|
|
</Border.Background>
|
|
<TextBlock Text=""
|
|
FontFamily="Segoe MDL2 Assets"
|
|
FontSize="26"
|
|
Foreground="White"
|
|
HorizontalAlignment="Center"
|
|
VerticalAlignment="Center"/>
|
|
</Border>
|
|
|
|
<TextBlock Text="EngineeringSync"
|
|
FontFamily="Segoe UI"
|
|
FontSize="16"
|
|
FontWeight="SemiBold"
|
|
Foreground="White"/>
|
|
<TextBlock Text="Setup-Assistent"
|
|
FontFamily="Segoe UI"
|
|
FontSize="11"
|
|
Foreground="#7788AA"/>
|
|
</StackPanel>
|
|
|
|
<!-- Schritt-Indikatoren -->
|
|
<ItemsControl Grid.Row="1"
|
|
ItemsSource="{Binding Steps}"
|
|
Margin="20,0,20,0">
|
|
<ItemsControl.ItemTemplate>
|
|
<DataTemplate>
|
|
<ContentControl Style="{StaticResource StepItemStyle}"
|
|
Content="{Binding}"/>
|
|
</DataTemplate>
|
|
</ItemsControl.ItemTemplate>
|
|
</ItemsControl>
|
|
|
|
<!-- Version -->
|
|
<TextBlock Grid.Row="2"
|
|
Text="Version 1.0.0"
|
|
FontFamily="Segoe UI"
|
|
FontSize="10"
|
|
Foreground="#445566"
|
|
Margin="24,0,24,20"
|
|
HorizontalAlignment="Left"/>
|
|
</Grid>
|
|
</Border>
|
|
|
|
<!-- ═══════════════════════════════
|
|
RECHTE INHALTSSEITE + NAVIGATION
|
|
═══════════════════════════════ -->
|
|
<Grid Grid.Column="1">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/> <!-- Custom Title Bar -->
|
|
<RowDefinition Height="*"/> <!-- Page Content -->
|
|
<RowDefinition Height="Auto"/> <!-- Navigation Bar -->
|
|
</Grid.RowDefinitions>
|
|
|
|
<!-- Custom Title Bar (Drag + Schließen) -->
|
|
<Border Grid.Row="0"
|
|
Height="40"
|
|
CornerRadius="0,10,0,0"
|
|
MouseLeftButtonDown="TitleBar_MouseDown">
|
|
<Grid>
|
|
<TextBlock Text="EngineeringSync Setup"
|
|
FontFamily="Segoe UI"
|
|
FontSize="12"
|
|
Foreground="#888888"
|
|
VerticalAlignment="Center"
|
|
Margin="16,0,0,0"/>
|
|
<Button Content=""
|
|
FontFamily="Segoe MDL2 Assets"
|
|
FontSize="12"
|
|
HorizontalAlignment="Right"
|
|
VerticalAlignment="Center"
|
|
Width="40" Height="40"
|
|
Background="Transparent"
|
|
BorderThickness="0"
|
|
Foreground="#888888"
|
|
Cursor="Hand"
|
|
Click="CloseButton_Click"
|
|
ToolTip="Schließen">
|
|
<Button.Style>
|
|
<Style TargetType="Button">
|
|
<Setter Property="Template">
|
|
<Setter.Value>
|
|
<ControlTemplate TargetType="Button">
|
|
<Border x:Name="bg"
|
|
Background="Transparent"
|
|
CornerRadius="0,10,0,0">
|
|
<ContentPresenter HorizontalAlignment="Center"
|
|
VerticalAlignment="Center"/>
|
|
</Border>
|
|
<ControlTemplate.Triggers>
|
|
<Trigger Property="IsMouseOver" Value="True">
|
|
<Setter TargetName="bg" Property="Background" Value="#FFE81123"/>
|
|
<Setter Property="Foreground" Value="White"/>
|
|
</Trigger>
|
|
</ControlTemplate.Triggers>
|
|
</ControlTemplate>
|
|
</Setter.Value>
|
|
</Setter>
|
|
</Style>
|
|
</Button.Style>
|
|
</Button>
|
|
</Grid>
|
|
</Border>
|
|
|
|
<!-- ── Separator ── -->
|
|
<Border Grid.Row="0" Height="1" Background="{StaticResource BorderBrush}"
|
|
VerticalAlignment="Bottom"/>
|
|
|
|
<!-- Seiten-Content mit Animation -->
|
|
<ContentPresenter Grid.Row="1"
|
|
Content="{Binding CurrentPage}"
|
|
Margin="0"/>
|
|
|
|
<!-- ── Separator ── -->
|
|
<Border Grid.Row="2" Height="1" Background="{StaticResource BorderBrush}"
|
|
VerticalAlignment="Top"/>
|
|
|
|
<!-- Navigation Bar -->
|
|
<Border Grid.Row="2"
|
|
Background="#FAFAFA"
|
|
CornerRadius="0,0,10,0"
|
|
Padding="24,12">
|
|
<Grid>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<!-- Abbrechen (links) -->
|
|
<Button Grid.Column="0"
|
|
Content="Abbrechen"
|
|
HorizontalAlignment="Left"
|
|
Style="{StaticResource SecondaryButtonStyle}"
|
|
Command="{Binding CancelCommand}"
|
|
Visibility="{Binding IsCompleted,
|
|
Converter={StaticResource BoolToInvVisConverter}}"/>
|
|
|
|
<!-- Zurück -->
|
|
<Button Grid.Column="1"
|
|
Style="{StaticResource SecondaryButtonStyle}"
|
|
Margin="0,0,8,0"
|
|
Command="{Binding GoBackCommand}"
|
|
Visibility="{Binding CanGoBack,
|
|
Converter={StaticResource BoolToVisConverter}}">
|
|
<Button.Content>
|
|
<StackPanel Orientation="Horizontal">
|
|
<TextBlock Text=""
|
|
FontFamily="Segoe MDL2 Assets"
|
|
Margin="0,0,6,0"/>
|
|
<TextBlock Text="Zurück"
|
|
FontFamily="Segoe UI"/>
|
|
</StackPanel>
|
|
</Button.Content>
|
|
</Button>
|
|
|
|
<!-- Weiter / Installieren -->
|
|
<Button Grid.Column="2"
|
|
Style="{StaticResource PrimaryButtonStyle}"
|
|
Command="{Binding GoNextCommand}"
|
|
Visibility="{Binding ShowNextButton,
|
|
Converter={StaticResource BoolToVisConverter}}">
|
|
<Button.Content>
|
|
<StackPanel Orientation="Horizontal">
|
|
<TextBlock x:Name="nextLabel"
|
|
Text="{Binding IsLastStep,
|
|
Converter={StaticResource LastStepLabelConverter}}"/>
|
|
<TextBlock Text=" "
|
|
FontFamily="Segoe MDL2 Assets"
|
|
Visibility="{Binding IsLastStep,
|
|
Converter={StaticResource BoolToInvVisConverter}}"/>
|
|
</StackPanel>
|
|
</Button.Content>
|
|
</Button>
|
|
|
|
<!-- Fertig-Button -->
|
|
<Button Grid.Column="3"
|
|
Style="{StaticResource PrimaryButtonStyle}"
|
|
Command="{Binding FinishCommand}"
|
|
Visibility="{Binding IsCompleted,
|
|
Converter={StaticResource BoolToVisConverter}}">
|
|
<Button.Content>
|
|
<StackPanel Orientation="Horizontal">
|
|
<TextBlock Text=""
|
|
FontFamily="Segoe MDL2 Assets"
|
|
Margin="0,0,6,0"/>
|
|
<TextBlock Text="Schließen"
|
|
FontFamily="Segoe UI"/>
|
|
</StackPanel>
|
|
</Button.Content>
|
|
</Button>
|
|
</Grid>
|
|
</Border>
|
|
</Grid>
|
|
</Grid>
|
|
</Border>
|
|
</Window>
|