Initial commit: FluidExplorer:从零实现的 WinUI 3 文件资源管理器替代品(Mica、命令栏、面包屑)
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<UserControl
|
||||
x:Class="FluidExplorer.Views.ShellView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:vm="using:FluidExplorer.ViewModels"
|
||||
xmlns:views="using:FluidExplorer.Views">
|
||||
|
||||
<!--
|
||||
窗口内容放在 UserControl 而不是直接放在 Window 里:WinUI 的 x:Bind 带 Converter 时
|
||||
生成的代码要求绑定根是 FrameworkElement,而 Window 不是,因此 Window 里不放任何 x:Bind。
|
||||
视觉结构对齐 Windows 11 资源管理器:标签栏位于标题栏区域,Mica 由宿主窗口设置。
|
||||
-->
|
||||
<Grid x:Name="RootGrid">
|
||||
<!--
|
||||
标签页刻意不用 TabItemsSource/TabItemTemplate 绑定:TabView 的 TabItemsSource 与
|
||||
TwoWay SelectedItem 组合在增删标签时会触发容器重建异常(实测出现过整个标签栏与内容区消失)。
|
||||
这里由代码手工管理 TabItems,行为完全可控。
|
||||
-->
|
||||
<TabView
|
||||
x:Name="TabHost"
|
||||
IsAddTabButtonVisible="True"
|
||||
TabWidthMode="SizeToContent"
|
||||
CanDragTabs="True"
|
||||
CanReorderTabs="True"
|
||||
AllowDropTabs="True"
|
||||
CloseButtonOverlayMode="OnPointerOver"
|
||||
AddTabButtonClick="OnAddTabButtonClick"
|
||||
TabCloseRequested="OnTabCloseRequested"
|
||||
TabDroppedOutside="OnTabDroppedOutside"
|
||||
SelectionChanged="OnTabSelectionChanged">
|
||||
|
||||
<TabView.TabStripHeader>
|
||||
<Grid Width="8" />
|
||||
</TabView.TabStripHeader>
|
||||
|
||||
<!-- 标签右侧的空白区域 = 窗口拖动区(宿主窗口的 SetTitleBar 指向它) -->
|
||||
<TabView.TabStripFooter>
|
||||
<Grid x:Name="TitleBarDragRegion" MinWidth="120" Height="40" Background="Transparent" />
|
||||
</TabView.TabStripFooter>
|
||||
</TabView>
|
||||
|
||||
<!-- ═══ 文件操作队列(常驻右下角,不打断操作,可展开/收起) ═══ -->
|
||||
<Border x:Name="QueuePanel"
|
||||
HorizontalAlignment="Right"
|
||||
VerticalAlignment="Bottom"
|
||||
Margin="0,0,16,40"
|
||||
Width="420"
|
||||
MaxHeight="360"
|
||||
CornerRadius="8"
|
||||
BorderThickness="1"
|
||||
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
|
||||
Background="{ThemeResource AcrylicInAppFillColorDefaultBrush}"
|
||||
Visibility="{x:Bind ViewModel.IsQueueExpanded, Mode=OneWay, Converter={StaticResource BoolToVisibility}}">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Grid Grid.Row="0" Padding="12,8" ColumnSpacing="8">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Column="0" Style="{StaticResource BodyStrongTextBlockStyle}" Text="文件操作队列" VerticalAlignment="Center" />
|
||||
<Button Grid.Column="1" Style="{StaticResource ToolbarButtonStyle}" Width="28" Height="24"
|
||||
ToolTipService.ToolTip="清除已完成" Click="OnClearFinishedJobsClick">
|
||||
<FontIcon Glyph="{StaticResource GlyphClear}" FontSize="12" />
|
||||
</Button>
|
||||
<Button Grid.Column="2" Style="{StaticResource ToolbarButtonStyle}" Width="28" Height="24"
|
||||
ToolTipService.ToolTip="收起" Click="OnCollapseQueueClick">
|
||||
<FontIcon Glyph="" FontSize="12" />
|
||||
</Button>
|
||||
</Grid>
|
||||
|
||||
<ListView Grid.Row="1"
|
||||
Padding="4,0,4,8"
|
||||
SelectionMode="None"
|
||||
ItemsSource="{x:Bind ViewModel.JobRows, Mode=OneWay}">
|
||||
<ListView.ItemTemplate>
|
||||
<DataTemplate x:DataType="vm:JobRowViewModel">
|
||||
<Grid Padding="8,6" ColumnSpacing="8">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel Grid.Column="0" Spacing="3">
|
||||
<StackPanel Orientation="Horizontal" Spacing="8">
|
||||
<TextBlock Text="{x:Bind Title, Mode=OneWay}" Style="{StaticResource BodyStrongTextBlockStyle}" TextTrimming="CharacterEllipsis" />
|
||||
<TextBlock Text="{x:Bind StateText, Mode=OneWay}"
|
||||
Style="{StaticResource CaptionTextBlockStyle}"
|
||||
Foreground="{ThemeResource TextFillColorSecondaryBrush}" />
|
||||
</StackPanel>
|
||||
<ProgressBar Value="{x:Bind Progress, Mode=OneWay}" Maximum="1"
|
||||
IsIndeterminate="{x:Bind IsIndeterminate, Mode=OneWay}" />
|
||||
<TextBlock Text="{x:Bind ProgressText, Mode=OneWay}"
|
||||
Style="{StaticResource CaptionTextBlockStyle}"
|
||||
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
|
||||
TextTrimming="CharacterEllipsis" />
|
||||
<TextBlock Text="{x:Bind CurrentItem, Mode=OneWay}"
|
||||
Style="{StaticResource CaptionTextBlockStyle}"
|
||||
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
|
||||
TextTrimming="CharacterEllipsis" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="4" VerticalAlignment="Center">
|
||||
<Button Style="{StaticResource ToolbarButtonStyle}" Width="28" Height="28"
|
||||
Tag="{x:Bind}" Click="OnPauseJobClick"
|
||||
Visibility="{x:Bind CanPause, Mode=OneWay, Converter={StaticResource BoolToVisibility}}">
|
||||
<FontIcon Glyph="{x:Bind PauseGlyph, Mode=OneWay}" FontSize="12" />
|
||||
</Button>
|
||||
<Button Style="{StaticResource ToolbarButtonStyle}" Width="28" Height="28"
|
||||
Tag="{x:Bind}" Click="OnCancelJobClick"
|
||||
Visibility="{x:Bind CanCancel, Mode=OneWay, Converter={StaticResource BoolToVisibility}}">
|
||||
<FontIcon Glyph="{StaticResource GlyphStop}" FontSize="12" />
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ListView.ItemTemplate>
|
||||
</ListView>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
Reference in New Issue
Block a user