Initial commit: EngineeringSync v1.0.0
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>
This commit is contained in:
251
EngineeringSync.Setup/Views/WizardWindow.xaml
Normal file
251
EngineeringSync.Setup/Views/WizardWindow.xaml
Normal file
@@ -0,0 +1,251 @@
|
||||
<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>
|
||||
Reference in New Issue
Block a user