Files
DeskCore/MainWindow.xaml
T
M_ViperandClaude Opus 5.5 77bb3e6b9d DeskCore 1.0.0
Desktop-Icons in eigene Kategorien sortieren: Windows-11-Design (hell/dunkel),
Desktop-Boxen, automatisches Einsortieren nach Regeln, Rückgängig, Suche,
Infobereich mit Tastenkürzel, Sicherung als ZIP und Installer ohne Adminrechte.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 20:19:32 +02:00

626 lines
46 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<Window x:Class="DeskCore.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=System.Runtime"
Title="DeskCore" Icon="app.ico" Width="1120" Height="720" MinWidth="760" MinHeight="480"
Background="{DynamicResource BaseBrush}" Foreground="{DynamicResource TextBrush}"
FontFamily="{DynamicResource UiFont}" FontSize="14"
TextOptions.TextFormattingMode="Display" UseLayoutRounding="True"
WindowStartupLocation="CenterScreen">
<WindowChrome.WindowChrome>
<WindowChrome CaptionHeight="40" ResizeBorderThickness="6" GlassFrameThickness="0,0,0,1"
CornerRadius="0" UseAeroCaptionButtons="False"/>
</WindowChrome.WindowChrome>
<Window.Resources>
<!-- Kachelgrößen – werden je nach Ansicht im Code umgestellt -->
<sys:Double x:Key="TileWidth">108</sys:Double>
<sys:Double x:Key="TileHeight">116</sys:Double>
<sys:Double x:Key="TileIcon">48</sys:Double>
<Thickness x:Key="TileIconMargin">0,14,0,0</Thickness>
<!-- Eintrag in der Seitenleiste -->
<DataTemplate x:Key="NavTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Glyph}" FontFamily="{DynamicResource IconFont}" FontSize="16"
VerticalAlignment="Center" Margin="0,0,14,0">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="{Binding GlyphBrush}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding GlyphBrush}" Value="{x:Null}">
<Setter Property="Foreground" Value="{DynamicResource TextBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TextBlock Grid.Column="1" Text="{Binding Name}" TextTrimming="CharacterEllipsis" VerticalAlignment="Center"/>
<TextBlock Grid.Column="2" Text="&#xE8A1;" FontFamily="{DynamicResource IconFont}" FontSize="12" VerticalAlignment="Center"
Margin="8,0,0,0" Foreground="{DynamicResource TextTertiaryBrush}" ToolTip="Wird als Box auf dem Desktop angezeigt">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding HasFence}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TextBlock Grid.Column="3" Text="{Binding Count}" FontSize="12" Foreground="{DynamicResource TextTertiaryBrush}"
VerticalAlignment="Center" HorizontalAlignment="Right" Margin="8,0,0,0">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" Value="True"/>
<Condition Binding="{Binding IsDesktop}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Hidden"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<!-- Griff zum Umsortieren (nur beim Überfahren) -->
<TextBlock Grid.Column="3" Text="&#xE700;" FontFamily="{DynamicResource IconFont}" FontSize="14" Cursor="SizeNS"
Foreground="{DynamicResource TextSecondaryBrush}" VerticalAlignment="Center" HorizontalAlignment="Right"
ToolTip="Ziehen zum Umsortieren (oder Alt+↑/↓)">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" Value="True"/>
<Condition Binding="{Binding IsDesktop}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Visible"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
</DataTemplate>
<!-- Kachel -->
<DataTemplate x:Key="TileTemplate">
<StackPanel Width="{DynamicResource TileWidth}" Height="{DynamicResource TileHeight}" ToolTip="{Binding ToolTip}">
<Grid Width="{DynamicResource TileIcon}" Height="{DynamicResource TileIcon}" Margin="{DynamicResource TileIconMargin}">
<Image Source="{Binding Icon}" RenderOptions.BitmapScalingMode="HighQuality">
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSorted}" Value="True">
<Setter Property="Opacity" Value="0.4"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<Border HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,-7,-5"
Width="20" Height="20" CornerRadius="10" Background="{DynamicResource SuccessBrush}"
BorderBrush="{DynamicResource LayerBrush}" BorderThickness="2">
<Border.Style>
<Style TargetType="Border">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsSorted}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<TextBlock Text="&#xE73E;" FontFamily="{DynamicResource IconFont}" FontSize="9" Foreground="White"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</Grid>
<TextBlock Text="{Binding Name}" FontSize="12" TextAlignment="Center" TextWrapping="Wrap"
TextTrimming="CharacterEllipsis" MaxHeight="34" LineHeight="16" Margin="6,9,6,0"/>
</StackPanel>
</DataTemplate>
<!-- Listenzeile -->
<DataTemplate x:Key="ListTemplate">
<Grid Height="40" Margin="14,0,10,0" ToolTip="{Binding ToolTip}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="160"/>
</Grid.ColumnDefinitions>
<Image Source="{Binding Icon}" Width="24" Height="24" Margin="0,0,14,0" RenderOptions.BitmapScalingMode="HighQuality"/>
<TextBlock Grid.Column="1" Text="{Binding Name}" VerticalAlignment="Center" TextTrimming="CharacterEllipsis"/>
<TextBlock Grid.Column="2" Text="{Binding LocationText}" VerticalAlignment="Center" TextTrimming="CharacterEllipsis"
Foreground="{DynamicResource TextSecondaryBrush}" FontSize="12"/>
<TextBlock Grid.Column="3" Text="{Binding TypeText}" VerticalAlignment="Center" TextTrimming="CharacterEllipsis"
Foreground="{DynamicResource TextSecondaryBrush}" FontSize="12"/>
</Grid>
</DataTemplate>
<ItemsPanelTemplate x:Key="WrapPanelTemplate">
<WrapPanel/>
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="StackPanelTemplate">
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
<!-- Regelzeile in den Einstellungen -->
<DataTemplate x:Key="RuleTemplate">
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="Name enthält" VerticalAlignment="Center" Margin="0,0,12,0" Foreground="{DynamicResource TextSecondaryBrush}"/>
<TextBox Grid.Column="1" Text="{Binding Contains, UpdateSourceTrigger=PropertyChanged}" LostFocus="RuleText_LostFocus"/>
<TextBlock Grid.Column="2" Text="&#xE76C;" FontFamily="{DynamicResource IconFont}" FontSize="12" VerticalAlignment="Center"
Margin="12,0" Foreground="{DynamicResource TextSecondaryBrush}"/>
<Button Grid.Column="3" HorizontalContentAlignment="Stretch" Click="RuleCategory_Click" Tag="{Binding}">
<DockPanel>
<TextBlock DockPanel.Dock="Right" Text="&#xE70D;" FontFamily="{DynamicResource IconFont}" FontSize="10"
VerticalAlignment="Center" Margin="8,0,0,0"/>
<TextBlock Text="{Binding Category}" TextTrimming="CharacterEllipsis"/>
</DockPanel>
</Button>
<Button Grid.Column="4" Style="{StaticResource SubtleButton}" Margin="6,0,0,0" Click="RuleDelete_Click" Tag="{Binding}"
ToolTip="Regel entfernen">
<TextBlock Text="&#xE74D;" FontFamily="{DynamicResource IconFont}" FontSize="14"/>
</Button>
</Grid>
</DataTemplate>
</Window.Resources>
<Grid x:Name="RootGrid">
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="280"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- ===== Titelleiste ===== -->
<Grid Grid.ColumnSpan="2">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Margin="16,0,0,0">
<Image Source="app.ico" Width="16" Height="16" RenderOptions.BitmapScalingMode="HighQuality"/>
<TextBlock Text="DeskCore" FontSize="12" Margin="12,0,0,0" VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top">
<Button x:Name="ThemeButton" Style="{StaticResource CaptionButton}" FontSize="14" Click="ThemeButton_Click"
WindowChrome.IsHitTestVisibleInChrome="True" ToolTip="Design: Hell / Dunkel">
<Button.ContextMenu>
<ContextMenu x:Name="ThemeMenu" Placement="Bottom"/>
</Button.ContextMenu>
</Button>
<Button Style="{StaticResource CaptionButton}" Content="&#xE921;" Click="Minimize_Click"
WindowChrome.IsHitTestVisibleInChrome="True" ToolTip="Minimieren"/>
<Button x:Name="MaxButton" Style="{StaticResource CaptionButton}" Content="&#xE922;" Click="Maximize_Click"
WindowChrome.IsHitTestVisibleInChrome="True" ToolTip="Maximieren"/>
<Button Style="{StaticResource CloseCaptionButton}" Content="&#xE8BB;" Click="Close_Click"
WindowChrome.IsHitTestVisibleInChrome="True" ToolTip="Schließen"/>
</StackPanel>
</Grid>
<!-- ===== Seitenleiste ===== -->
<DockPanel Grid.Row="1">
<ListBox x:Name="DesktopNav" DockPanel.Dock="Top" Margin="8,6,8,0"
ItemContainerStyle="{StaticResource NavItem}" ItemTemplate="{StaticResource NavTemplate}"
SelectionChanged="Nav_SelectionChanged"
AllowDrop="True" DragOver="Nav_DragOver" DragLeave="Nav_DragLeave" Drop="Nav_Drop"/>
<Grid DockPanel.Dock="Top" Margin="22,20,14,6">
<TextBlock Text="Kategorien" FontSize="12" FontWeight="SemiBold" Foreground="{DynamicResource TextSecondaryBrush}"
VerticalAlignment="Center" ToolTip="Reihenfolge ändern: Kategorie mit der Maus ziehen, Alt+↑/↓ oder Rechtsklick"/>
<Button Style="{StaticResource SubtleButton}" HorizontalAlignment="Right" Padding="6,4" MinHeight="0"
Click="NewCategory_Click" ToolTip="Neue Kategorie (Strg+N)">
<TextBlock Text="&#xE710;" FontFamily="{DynamicResource IconFont}" FontSize="12"/>
</Button>
</Grid>
<StackPanel DockPanel.Dock="Bottom" Margin="8,8,8,12">
<Button Style="{StaticResource SubtleButton}" Padding="16,9" HorizontalContentAlignment="Left" Click="NewCategory_Click">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE710;" FontFamily="{DynamicResource IconFont}" FontSize="16" Margin="0,0,14,0"
VerticalAlignment="Center" Foreground="{DynamicResource AccentBrush}"/>
<TextBlock Text="Neue Kategorie" VerticalAlignment="Center"/>
</StackPanel>
</Button>
<ListBox x:Name="SettingsNav" Margin="0,2,0,0" ItemContainerStyle="{StaticResource NavItem}"
SelectionChanged="SettingsNav_SelectionChanged">
<ListBoxItem>
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE713;" FontFamily="{DynamicResource IconFont}" FontSize="16" Margin="0,0,14,0" VerticalAlignment="Center"/>
<TextBlock Text="Einstellungen" VerticalAlignment="Center"/>
</StackPanel>
</ListBoxItem>
</ListBox>
</StackPanel>
<Grid>
<ListBox x:Name="CategoryList" Margin="8,0"
ItemContainerStyle="{StaticResource NavItem}" ItemTemplate="{StaticResource NavTemplate}"
SelectionChanged="Nav_SelectionChanged"
PreviewMouseLeftButtonDown="CategoryList_PreviewMouseLeftButtonDown" PreviewMouseMove="CategoryList_PreviewMouseMove"
ContextMenuOpening="CategoryList_ContextMenuOpening"
AllowDrop="True" DragOver="Nav_DragOver" DragLeave="Nav_DragLeave" Drop="Nav_Drop">
<ListBox.ContextMenu>
<ContextMenu x:Name="CategoryMenu"/>
</ListBox.ContextMenu>
</ListBox>
<TextBlock x:Name="NoCategoriesText" Margin="24,8,24,0" TextWrapping="Wrap" FontSize="12"
Foreground="{DynamicResource TextTertiaryBrush}" IsHitTestVisible="False"
Text="Noch keine Kategorien. Lege unten deine erste an – z. B. „Spiele“, „Arbeit“ oder „Tools“."/>
</Grid>
</DockPanel>
<!-- ===== Inhalt ===== -->
<Border Grid.Row="1" Grid.Column="1" Background="{DynamicResource LayerBrush}"
BorderBrush="{DynamicResource LayerStrokeBrush}" BorderThickness="1,1,0,0" CornerRadius="8,0,0,0">
<Grid>
<DockPanel x:Name="BrowseView">
<!-- Kopfbereich -->
<Grid DockPanel.Dock="Top" Margin="36,26,30,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel VerticalAlignment="Center">
<TextBlock x:Name="HeaderText" FontFamily="{DynamicResource DisplayFont}" FontSize="28" FontWeight="SemiBold"
TextTrimming="CharacterEllipsis"/>
<TextBlock x:Name="SubText" Foreground="{DynamicResource TextSecondaryBrush}" Margin="0,2,0,0"/>
</StackPanel>
<Grid Grid.Column="1" Width="280" VerticalAlignment="Center" Margin="24,0,0,0">
<TextBox x:Name="SearchBox" Padding="36,6,30,6" TextChanged="SearchBox_TextChanged"
ToolTip="Sucht in allen Kategorien und auf dem Desktop (Strg+F)"/>
<TextBlock Text="&#xE721;" FontFamily="{DynamicResource IconFont}" FontSize="14" IsHitTestVisible="False"
Foreground="{DynamicResource TextSecondaryBrush}" VerticalAlignment="Center" Margin="12,0,0,0"/>
<TextBlock x:Name="SearchPlaceholder" Text="Suchen" IsHitTestVisible="False" VerticalAlignment="Center"
Margin="37,0,0,0" Foreground="{DynamicResource TextTertiaryBrush}"/>
<Button x:Name="ClearSearchBtn" Style="{StaticResource SubtleButton}" HorizontalAlignment="Right" Margin="0,0,3,0"
Padding="6,4" MinHeight="0" Visibility="Collapsed" Click="ClearSearch_Click" ToolTip="Suche leeren (Esc)">
<TextBlock Text="&#xE711;" FontFamily="{DynamicResource IconFont}" FontSize="10"/>
</Button>
</Grid>
<StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Center" Margin="6,0,0,0">
<Button x:Name="UndoButton" Style="{StaticResource SubtleButton}" Padding="9" Click="Undo_Click" IsEnabled="False"
ToolTip="Rückgängig (Strg+Z)">
<TextBlock Text="&#xE7A7;" FontFamily="{DynamicResource IconFont}" FontSize="16"/>
</Button>
<Button x:Name="ViewButton" Style="{StaticResource SubtleButton}" Padding="9" Click="ViewButton_Click" ToolTip="Ansicht">
<TextBlock x:Name="ViewGlyph" Text="&#xE8A9;" FontFamily="{DynamicResource IconFont}" FontSize="16"/>
<Button.ContextMenu>
<ContextMenu x:Name="ViewMenu" Placement="Bottom"/>
</Button.ContextMenu>
</Button>
<Button Style="{StaticResource SubtleButton}" Padding="9" Click="Refresh_Click" ToolTip="Aktualisieren (F5)">
<TextBlock Text="&#xE72C;" FontFamily="{DynamicResource IconFont}" FontSize="16"/>
</Button>
</StackPanel>
</Grid>
<!-- Befehlsleiste (nur bei Kategorien) -->
<StackPanel x:Name="CategoryCommands" DockPanel.Dock="Top" Orientation="Horizontal" Margin="30,14,30,6">
<Button Style="{StaticResource SubtleButton}" Click="EditCategory_Click" Margin="0,0,4,0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE70F;" FontFamily="{DynamicResource IconFont}" FontSize="16" Margin="0,0,10,0" VerticalAlignment="Center"/>
<TextBlock Text="Bearbeiten" VerticalAlignment="Center"/>
</StackPanel>
</Button>
<Button x:Name="FenceToggleButton" Style="{StaticResource SubtleButton}" Click="FenceToggle_Click" Margin="0,0,4,0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE8A1;" FontFamily="{DynamicResource IconFont}" FontSize="16" Margin="0,0,10,0" VerticalAlignment="Center"/>
<TextBlock x:Name="FenceToggleText" Text="Als Box auf den Desktop" VerticalAlignment="Center"/>
</StackPanel>
</Button>
<Button Style="{StaticResource SubtleButton}" Click="OpenFolder_Click" Margin="0,0,4,0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xED25;" FontFamily="{DynamicResource IconFont}" FontSize="16" Margin="0,0,10,0" VerticalAlignment="Center"/>
<TextBlock Text="Im Explorer öffnen" VerticalAlignment="Center"/>
</StackPanel>
</Button>
<Button Style="{StaticResource SubtleButton}" Click="DeleteCategory_Click">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE74D;" FontFamily="{DynamicResource IconFont}" FontSize="16" Margin="0,0,10,0" VerticalAlignment="Center"/>
<TextBlock Text="Kategorie löschen" VerticalAlignment="Center"/>
</StackPanel>
</Button>
</StackPanel>
<!-- Hinweis (InfoBar) -->
<Border x:Name="InfoBar" DockPanel.Dock="Top" Margin="36,20,36,8" Padding="16,12" CornerRadius="6"
Background="{DynamicResource AccentSubtleBrush}" BorderBrush="{DynamicResource AccentSubtleStrokeBrush}" BorderThickness="1">
<DockPanel>
<TextBlock DockPanel.Dock="Left" Text="&#xE946;" FontFamily="{DynamicResource IconFont}" FontSize="18"
Foreground="{DynamicResource AccentBrush}" VerticalAlignment="Top" Margin="0,1,14,0"/>
<TextBlock TextWrapping="Wrap" LineHeight="20">
<Run FontWeight="SemiBold" Text="So räumst du auf:"/>
<Run Text="Ziehe Icons auf eine Kategorie links – sie werden dort gesichert. Icons mit"/>
<Run Foreground="{DynamicResource SuccessBrush}" FontWeight="SemiBold" Text="✓"/>
<Run Text="sind gesichert und können vom Desktop gelöscht werden (Rechtsklick → Vom Desktop löschen)."/>
</TextBlock>
</DockPanel>
</Border>
<!-- Spaltenköpfe der Listenansicht -->
<Grid x:Name="ListHeader" DockPanel.Dock="Top" Margin="42,10,48,4" Visibility="Collapsed">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="160"/>
</Grid.ColumnDefinitions>
<TextBlock Text="Name" FontSize="12" Foreground="{DynamicResource TextSecondaryBrush}" Margin="38,0,0,0"/>
<TextBlock Grid.Column="1" Text="Ort" FontSize="12" Foreground="{DynamicResource TextSecondaryBrush}"/>
<TextBlock Grid.Column="2" Text="Typ" FontSize="12" Foreground="{DynamicResource TextSecondaryBrush}"/>
</Grid>
<!-- Kacheln / Liste -->
<Grid>
<ListBox x:Name="IconList" Padding="28,4,28,24" SelectionMode="Extended"
ItemContainerStyle="{StaticResource TileItem}" ItemTemplate="{StaticResource TileTemplate}"
ItemsPanel="{StaticResource WrapPanelTemplate}"
AllowDrop="True" Drop="IconList_Drop" DragOver="IconList_DragOver"
PreviewMouseLeftButtonDown="IconList_PreviewMouseLeftButtonDown" PreviewMouseMove="IconList_PreviewMouseMove"
MouseDoubleClick="IconList_MouseDoubleClick" KeyDown="IconList_KeyDown"
ContextMenuOpening="IconList_ContextMenuOpening">
<ListBox.ContextMenu>
<ContextMenu x:Name="IconMenu"/>
</ListBox.ContextMenu>
</ListBox>
<!-- Leerer Zustand -->
<StackPanel x:Name="EmptyState" HorizontalAlignment="Center" VerticalAlignment="Center" IsHitTestVisible="False"
Margin="0,0,0,60" MaxWidth="360">
<TextBlock x:Name="EmptyGlyph" FontFamily="{DynamicResource IconFont}" FontSize="48" HorizontalAlignment="Center"
Foreground="{DynamicResource TextTertiaryBrush}"/>
<TextBlock x:Name="EmptyTitle" FontSize="18" FontWeight="SemiBold" HorizontalAlignment="Center" Margin="0,18,0,6"
FontFamily="{DynamicResource DisplayFont}"/>
<TextBlock x:Name="EmptyText" TextAlignment="Center" TextWrapping="Wrap" LineHeight="20"
Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</Grid>
</DockPanel>
<!-- ===== Einstellungen ===== -->
<ScrollViewer x:Name="SettingsView" Visibility="Collapsed" VerticalScrollBarVisibility="Auto">
<StackPanel Margin="36,26,36,36" MaxWidth="860" HorizontalAlignment="Stretch">
<TextBlock Text="Einstellungen" FontFamily="{DynamicResource DisplayFont}" FontSize="28" FontWeight="SemiBold"/>
<TextBlock Text="Darstellung" Style="{StaticResource SectionTitle}"/>
<Border Style="{StaticResource Card}">
<DockPanel>
<Border DockPanel.Dock="Right" Style="{StaticResource SegmentGroup}" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal">
<RadioButton x:Name="DesignLight" Style="{StaticResource SegmentRadio}" GroupName="Design" Content="Hell" Checked="Design_Checked"/>
<RadioButton x:Name="DesignDark" Style="{StaticResource SegmentRadio}" GroupName="Design" Content="Dunkel" Checked="Design_Checked"/>
<RadioButton x:Name="DesignSystem" Style="{StaticResource SegmentRadio}" GroupName="Design" Content="Wie Windows" Checked="Design_Checked"/>
</StackPanel>
</Border>
<TextBlock DockPanel.Dock="Left" Text="&#xE706;" FontFamily="{DynamicResource IconFont}" FontSize="18" VerticalAlignment="Center" Margin="0,0,16,0"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="Design"/>
<TextBlock Text="Helles oder dunkles Erscheinungsbild" FontSize="12" Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</DockPanel>
</Border>
<Border Style="{StaticResource Card}">
<DockPanel>
<Border DockPanel.Dock="Right" Style="{StaticResource SegmentGroup}" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal">
<RadioButton x:Name="ViewSmall" Style="{StaticResource SegmentRadio}" GroupName="View" Content="Klein" Checked="View_Checked"/>
<RadioButton x:Name="ViewMedium" Style="{StaticResource SegmentRadio}" GroupName="View" Content="Mittel" Checked="View_Checked"/>
<RadioButton x:Name="ViewLarge" Style="{StaticResource SegmentRadio}" GroupName="View" Content="Groß" Checked="View_Checked"/>
<RadioButton x:Name="ViewList" Style="{StaticResource SegmentRadio}" GroupName="View" Content="Liste" Checked="View_Checked"/>
</StackPanel>
</Border>
<TextBlock DockPanel.Dock="Left" Text="&#xE80A;" FontFamily="{DynamicResource IconFont}" FontSize="18" VerticalAlignment="Center" Margin="0,0,16,0"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="Ansicht"/>
<TextBlock Text="Größe der Kacheln oder Listenansicht" FontSize="12" Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</DockPanel>
</Border>
<TextBlock Text="Start &amp; Erreichbarkeit" Style="{StaticResource SectionTitle}"/>
<Border Style="{StaticResource Card}">
<DockPanel>
<CheckBox x:Name="AutostartToggle" DockPanel.Dock="Right" Style="{StaticResource ToggleSwitch}" VerticalAlignment="Center" Click="AutostartToggle_Click"/>
<TextBlock DockPanel.Dock="Left" Text="&#xE7E8;" FontFamily="{DynamicResource IconFont}" FontSize="18" VerticalAlignment="Center" Margin="0,0,16,0"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="Mit Windows starten"/>
<TextBlock Text="Startet unauffällig im Infobereich – Desktop-Boxen und Auto-Sortierung sind dann sofort aktiv" FontSize="12"
TextWrapping="Wrap" Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</DockPanel>
</Border>
<Border Style="{StaticResource Card}">
<DockPanel>
<CheckBox x:Name="TrayToggle" DockPanel.Dock="Right" Style="{StaticResource ToggleSwitch}" VerticalAlignment="Center" Click="TrayToggle_Click"/>
<TextBlock DockPanel.Dock="Left" Text="&#xE8A1;" FontFamily="{DynamicResource IconFont}" FontSize="18" VerticalAlignment="Center" Margin="0,0,16,0"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="Symbol im Infobereich"/>
<TextBlock Text="Unten rechts neben der Uhr – Klick öffnet die App, Rechtsklick zeigt deine Kategorien" FontSize="12"
TextWrapping="Wrap" Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</DockPanel>
</Border>
<Border Style="{StaticResource Card}">
<DockPanel>
<CheckBox x:Name="CloseToTrayToggle" DockPanel.Dock="Right" Style="{StaticResource ToggleSwitch}" VerticalAlignment="Center" Click="CloseToTrayToggle_Click"/>
<TextBlock DockPanel.Dock="Left" Text="&#xE8BB;" FontFamily="{DynamicResource IconFont}" FontSize="18" VerticalAlignment="Center" Margin="0,0,16,0"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="Beim Schließen weiterlaufen"/>
<TextBlock Text="Das X versteckt das Fenster nur – beenden über Rechtsklick auf das Infobereich-Symbol" FontSize="12"
TextWrapping="Wrap" Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</DockPanel>
</Border>
<Border Style="{StaticResource Card}">
<DockPanel>
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal" VerticalAlignment="Center">
<TextBox x:Name="HotkeyBox" Width="200" IsReadOnly="True" Margin="0,0,16,0" IsReadOnlyCaretVisible="False"
PreviewKeyDown="HotkeyBox_PreviewKeyDown" ToolTip="Hier klicken und neue Tastenkombination drücken"/>
<CheckBox x:Name="HotkeyToggle" Style="{StaticResource ToggleSwitch}" VerticalAlignment="Center" Click="HotkeyToggle_Click"/>
</StackPanel>
<TextBlock DockPanel.Dock="Left" Text="&#xE765;" FontFamily="{DynamicResource IconFont}" FontSize="18" VerticalAlignment="Center" Margin="0,0,16,0"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="Tastenkürzel"/>
<TextBlock x:Name="HotkeyHint" Text="Öffnet die App von überall – ins Feld klicken und neue Kombination drücken" FontSize="12"
TextWrapping="Wrap" Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</DockPanel>
</Border>
<TextBlock Text="Automatisch sortieren" Style="{StaticResource SectionTitle}"/>
<Border Style="{StaticResource Card}">
<DockPanel>
<CheckBox x:Name="AutoSortToggle" DockPanel.Dock="Right" Style="{StaticResource ToggleSwitch}" VerticalAlignment="Center" Click="AutoSortToggle_Click"/>
<TextBlock DockPanel.Dock="Left" Text="&#xE9E9;" FontFamily="{DynamicResource IconFont}" FontSize="18" VerticalAlignment="Center" Margin="0,0,16,0"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="Neue Desktop-Icons automatisch einsortieren"/>
<TextBlock Text="Sobald z. B. ein Installer eine Verknüpfung auf den Desktop legt, wird sie nach deinen Regeln gesichert" FontSize="12"
TextWrapping="Wrap" Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</DockPanel>
</Border>
<Border Style="{StaticResource Card}">
<DockPanel>
<CheckBox x:Name="AutoRemoveToggle" DockPanel.Dock="Right" Style="{StaticResource ToggleSwitch}" VerticalAlignment="Center" Click="AutoRemoveToggle_Click"/>
<TextBlock DockPanel.Dock="Left" Text="&#xE74D;" FontFamily="{DynamicResource IconFont}" FontSize="18" VerticalAlignment="Center" Margin="0,0,16,0"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="Danach vom Desktop entfernen"/>
<TextBlock Text="Das Original verschwindet vom Desktop (rückgängig machbar mit Strg+Z)" FontSize="12"
TextWrapping="Wrap" Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</DockPanel>
</Border>
<Border Style="{StaticResource Card}">
<StackPanel>
<TextBlock Text="Regeln" Margin="0,0,0,4"/>
<TextBlock Text="Die erste passende Regel gewinnt. Groß-/Kleinschreibung ist egal." FontSize="12"
Foreground="{DynamicResource TextSecondaryBrush}" Margin="0,0,0,14"/>
<ItemsControl x:Name="RulesList" ItemTemplate="{StaticResource RuleTemplate}"/>
<TextBlock x:Name="NoRulesText" Text="Noch keine Regeln." FontSize="12" Foreground="{DynamicResource TextTertiaryBrush}" Margin="0,0,0,12"/>
<StackPanel Orientation="Horizontal" Margin="0,4,0,0">
<Button Click="AddRule_Click" Margin="0,0,8,0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE710;" FontFamily="{DynamicResource IconFont}" FontSize="12" Margin="0,0,8,0" VerticalAlignment="Center"/>
<TextBlock Text="Regel hinzufügen"/>
</StackPanel>
</Button>
<Button Click="ApplyRulesNow_Click" Content="Jetzt auf den Desktop anwenden"/>
</StackPanel>
</StackPanel>
</Border>
<TextBlock Text="Desktop-Boxen" Style="{StaticResource SectionTitle}"/>
<Border Style="{StaticResource Card}">
<DockPanel>
<CheckBox x:Name="FencesToggle" DockPanel.Dock="Right" Style="{StaticResource ToggleSwitch}" VerticalAlignment="Center" Click="FencesToggle_Click"/>
<TextBlock DockPanel.Dock="Left" Text="&#xE8A1;" FontFamily="{DynamicResource IconFont}" FontSize="18" VerticalAlignment="Center" Margin="0,0,16,0"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="Boxen auf dem Desktop anzeigen"/>
<TextBlock Text="Kategorien als verschiebbare Kästen direkt auf dem Desktop. Welche Kategorie eine Box bekommt, stellst du bei der Kategorie ein (Bearbeiten → „Als Box auf dem Desktop“). Doppelklick auf den Titel klappt eine Box ein." FontSize="12"
TextWrapping="Wrap" Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</DockPanel>
</Border>
<TextBlock Text="Sicherung" Style="{StaticResource SectionTitle}"/>
<Border Style="{StaticResource Card}">
<DockPanel>
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal" VerticalAlignment="Center">
<Button Click="Export_Click" Margin="0,0,8,0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE898;" FontFamily="{DynamicResource IconFont}" FontSize="14" Margin="0,0,8,0" VerticalAlignment="Center"/>
<TextBlock Text="Sichern…"/>
</StackPanel>
</Button>
<Button Click="Import_Click">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE896;" FontFamily="{DynamicResource IconFont}" FontSize="14" Margin="0,0,8,0" VerticalAlignment="Center"/>
<TextBlock Text="Wiederherstellen…"/>
</StackPanel>
</Button>
</StackPanel>
<TextBlock DockPanel.Dock="Left" Text="&#xE8C8;" FontFamily="{DynamicResource IconFont}" FontSize="18" VerticalAlignment="Center" Margin="0,0,16,0"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="Kategorien sichern &amp; wiederherstellen"/>
<TextBlock x:Name="BackupHint" FontSize="12" TextWrapping="Wrap" Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</DockPanel>
</Border>
<TextBlock Text="Info" Style="{StaticResource SectionTitle}"/>
<Border Style="{StaticResource Card}">
<DockPanel>
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal" VerticalAlignment="Center">
<Button Content="Lizenz" Click="License_Click" Margin="0,0,8,0"/>
<Button Content="Speicherort öffnen" Click="OpenStorage_Click" Margin="0,0,8,0"/>
<Button Click="Quit_Click">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE7E8;" FontFamily="{DynamicResource IconFont}" FontSize="14" Margin="0,0,8,0" VerticalAlignment="Center"/>
<TextBlock Text="Beenden"/>
</StackPanel>
</Button>
</StackPanel>
<Image DockPanel.Dock="Left" Source="app.ico" Width="24" Height="24" Margin="0,0,16,0" VerticalAlignment="Center"/>
<StackPanel VerticalAlignment="Center">
<TextBlock x:Name="AboutTitle" Text="DeskCore"/>
<TextBlock x:Name="AboutCopyright" FontSize="12" Foreground="{DynamicResource TextSecondaryBrush}"/>
<TextBlock x:Name="StoragePathText" FontSize="12" TextWrapping="Wrap" Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel>
</DockPanel>
</Border>
<Border Style="{StaticResource Card}">
<StackPanel>
<TextBlock Text="Tastenkürzel in der App" Margin="0,0,0,8"/>
<TextBlock FontSize="12" Foreground="{DynamicResource TextSecondaryBrush}" LineHeight="20" TextWrapping="Wrap"
Text="Strg+F Suchen · Esc Suche leeren · Strg+A Alles markieren · Enter Öffnen · F2 Umbenennen · Entf Löschen · Strg+Z Rückgängig · Strg+N Neue Kategorie · Alt+↑/↓ Kategorie verschieben · F5 Aktualisieren · Strg+1…9 Kategorie wechseln"/>
</StackPanel>
</Border>
</StackPanel>
</ScrollViewer>
<!-- Rückmeldung (Toast) -->
<Border x:Name="Toast" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0,0,0,24"
Padding="16,11" CornerRadius="8" Opacity="0" IsHitTestVisible="False"
Background="{DynamicResource FlyoutBrush}" BorderBrush="{DynamicResource FlyoutStrokeBrush}" BorderThickness="1"
Effect="{StaticResource FlyoutShadow}">
<Border.RenderTransform>
<TranslateTransform x:Name="ToastShift" Y="12"/>
</Border.RenderTransform>
<StackPanel Orientation="Horizontal">
<Border x:Name="ToastBadge" Width="20" Height="20" CornerRadius="10" Background="{DynamicResource SuccessBrush}" Margin="0,0,12,0">
<TextBlock x:Name="ToastGlyph" Text="&#xE73E;" FontFamily="{DynamicResource IconFont}" FontSize="10" Foreground="White"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<TextBlock x:Name="ToastText" VerticalAlignment="Center" MaxWidth="560" TextTrimming="CharacterEllipsis"/>
<Button x:Name="ToastUndo" Content="Rückgängig" Style="{StaticResource SubtleButton}" Margin="12,-4,-6,-4" Padding="10,4"
Foreground="{DynamicResource AccentBrush}" Click="Undo_Click" Visibility="Collapsed"/>
</StackPanel>
</Border>
</Grid>
</Border>
<!-- Abdunkeln bei offenem Dialog -->
<Border x:Name="DimOverlay" Grid.RowSpan="2" Grid.ColumnSpan="2" Background="{DynamicResource OverlayBrush}" Visibility="Collapsed"/>
</Grid>
</Window>