Skip to content

Commit 8b10ab7

Browse files
authored
添加导航条目头部标识 (#147)
1 parent 96b0b25 commit 8b10ab7

File tree

18 files changed

+363
-116
lines changed

18 files changed

+363
-116
lines changed

src/App/App.csproj

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
<None Remove="Assets\not_login.png" />
3737
<None Remove="Assets\ReaderClean.js" />
3838
<None Remove="Controls\AIFeatureDialog.xaml" />
39+
<None Remove="Controls\AppNavView.xaml" />
3940
<None Remove="Controls\AppTitleBar.xaml" />
4041
<None Remove="Controls\Base\BiliPlayer\BiliPlayer.xaml" />
4142
<None Remove="Controls\Base\DownloadSection.xaml" />
@@ -162,11 +163,11 @@
162163
<PackageReference Include="Microsoft.AppCenter.Analytics" Version="5.0.3" />
163164
<PackageReference Include="Microsoft.AppCenter.Crashes" Version="5.0.3" />
164165
<PackageReference Include="Microsoft.Graphics.Win2D" Version="1.0.5.1" />
165-
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.46-beta">
166+
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.49-beta">
166167
<PrivateAssets>all</PrivateAssets>
167168
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
168169
</PackageReference>
169-
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.4.230913002" />
170+
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.4.231008000" />
170171
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.756" />
171172
<PackageReference Include="NLog" Version="5.2.4" />
172173
<PackageReference Include="Vortice.WinUI" Version="3.3.3-beta" />
@@ -219,6 +220,9 @@
219220
<None Update="Assets\ffmpeg\swscale-7.dll">
220221
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
221222
</None>
223+
<Page Update="Controls\AppNavView.xaml">
224+
<Generator>MSBuild:Compile</Generator>
225+
</Page>
222226
<Page Update="Controls\Modules\FixModule.xaml">
223227
<Generator>MSBuild:Compile</Generator>
224228
</Page>

src/App/Controls/AppNavView.xaml

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<local:AppNavViewBase
3+
x:Class="Bili.Copilot.App.Controls.AppNavView"
4+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
5+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
6+
xmlns:base="using:Bili.Copilot.App.Controls.Base"
7+
xmlns:converters="using:Bili.Copilot.App.Converters"
8+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
9+
xmlns:ext="using:Bili.Copilot.App.Extensions"
10+
xmlns:items="using:Bili.Copilot.ViewModels.Items"
11+
xmlns:local="using:Bili.Copilot.App.Controls"
12+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
13+
mc:Ignorable="d">
14+
15+
<UserControl.Resources>
16+
<DataTemplate x:Key="ItemTemplate" x:DataType="items:NavigateItemViewModel">
17+
<NavigationViewItem
18+
AccessKey="{x:Bind Data.Index}"
19+
Content="{x:Bind DisplayTitle, Mode=OneWay}"
20+
DataContext="{x:Bind}"
21+
ToolTipService.ToolTip="{x:Bind Data.Title}">
22+
<NavigationViewItem.Icon>
23+
<base:FluentIcon Symbol="{x:Bind Data.Icon}" />
24+
</NavigationViewItem.Icon>
25+
</NavigationViewItem>
26+
</DataTemplate>
27+
<DataTemplate x:Key="HeaderTemplate" x:DataType="items:NavigateItemViewModel">
28+
<NavigationViewItemHeader
29+
Content="{x:Bind DisplayTitle, Mode=OneWay}"
30+
Style="{StaticResource SmallNavigationViewItemHeaderStyle}"
31+
Visibility="{x:Bind IsVisible, Mode=OneWay}" />
32+
</DataTemplate>
33+
<converters:NavigateItemTemplateSelector
34+
x:Key="TemplateSelector"
35+
Header="{StaticResource HeaderTemplate}"
36+
Item="{StaticResource ItemTemplate}" />
37+
</UserControl.Resources>
38+
39+
<Grid
40+
x:Name="NavContainer"
41+
Height="56"
42+
Padding="4,0"
43+
Visibility="{x:Bind ViewModel.IsNavigationMenuShown, Mode=OneWay}">
44+
<NavigationView
45+
x:Name="MainNavView"
46+
Height="48"
47+
Margin="0,-4,0,0"
48+
CompactPaneLength="48"
49+
IsBackButtonVisible="Collapsed"
50+
IsPaneOpen="False"
51+
IsPaneToggleButtonVisible="False"
52+
IsSettingsVisible="False"
53+
IsTitleBarAutoPaddingEnabled="False"
54+
MenuItemTemplateSelector="{StaticResource TemplateSelector}"
55+
MenuItemsSource="{x:Bind ViewModel.NavigateItems}"
56+
OpenPaneLength="240"
57+
PaneDisplayMode="Top"
58+
SelectedItem="{x:Bind ViewModel.CurrentNavigateItem, Mode=TwoWay}">
59+
<NavigationView.PaneFooter>
60+
<Grid>
61+
<Button
62+
x:Name="SettingIconButton"
63+
Margin="6,0,0,0"
64+
HorizontalAlignment="Center"
65+
AccessKey="S"
66+
Click="OnSettingsButtonClick"
67+
Style="{StaticResource IconButtonStyle}"
68+
ToolTipService.ToolTip="{ext:Locale Name=Settings}">
69+
<base:FluentIcon FontSize="17" Symbol="Settings" />
70+
</Button>
71+
<Button
72+
x:Name="SettingFullButton"
73+
Margin="4,0,4,-4"
74+
Padding="12,10"
75+
HorizontalAlignment="Stretch"
76+
HorizontalContentAlignment="Left"
77+
AccessKey="S"
78+
Background="Transparent"
79+
BorderThickness="0"
80+
Click="OnSettingsButtonClick"
81+
Visibility="Collapsed">
82+
<StackPanel Orientation="Horizontal" Spacing="12">
83+
<base:FluentIcon
84+
VerticalAlignment="Center"
85+
FontSize="15"
86+
Symbol="Settings" />
87+
<TextBlock
88+
VerticalAlignment="Center"
89+
Text="{ext:Locale Name=Settings}"
90+
TextLineBounds="Tight" />
91+
</StackPanel>
92+
</Button>
93+
</Grid>
94+
</NavigationView.PaneFooter>
95+
</NavigationView>
96+
</Grid>
97+
98+
</local:AppNavViewBase>

src/App/Controls/AppNavView.xaml.cs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// Copyright (c) Bili Copilot. All rights reserved.
2+
3+
using Bili.Copilot.App.Controls.Base;
4+
using Bili.Copilot.Models.Constants.App;
5+
using Bili.Copilot.ViewModels;
6+
using Microsoft.UI.Xaml;
7+
using Microsoft.UI.Xaml.Controls;
8+
9+
namespace Bili.Copilot.App.Controls;
10+
11+
/// <summary>
12+
/// 应用导航视图.
13+
/// </summary>
14+
public sealed partial class AppNavView : AppNavViewBase
15+
{
16+
/// <summary>
17+
/// Initializes a new instance of the <see cref="AppNavView"/> class.
18+
/// </summary>
19+
public AppNavView()
20+
{
21+
InitializeComponent();
22+
ViewModel = AppViewModel.Instance;
23+
}
24+
25+
/// <summary>
26+
/// 改变导航布局.
27+
/// </summary>
28+
/// <param name="position">位置.</param>
29+
public void ChangeLayout(string position)
30+
{
31+
if (position == "bottom")
32+
{
33+
NavContainer.Padding = new Thickness(4, 0, 4, 0);
34+
NavContainer.Height = 56;
35+
MainNavView.Height = 48;
36+
NavContainer.Width = double.NaN;
37+
MainNavView.Width = double.NaN;
38+
MainNavView.Margin = new Thickness(0, -4, 0, 0);
39+
MainNavView.PaneDisplayMode = NavigationViewPaneDisplayMode.Top;
40+
MainNavView.IsPaneOpen = false;
41+
SettingIconButton.Visibility = Visibility.Visible;
42+
SettingFullButton.Visibility = Visibility.Collapsed;
43+
foreach (var item in ViewModel.NavigateItems)
44+
{
45+
if (!item.IsHeader)
46+
{
47+
item.DisplayTitle = default;
48+
}
49+
else
50+
{
51+
item.IsVisible = false;
52+
}
53+
}
54+
}
55+
else
56+
{
57+
NavContainer.Padding = new Thickness(0, 0, 0, 0);
58+
NavContainer.Height = double.NaN;
59+
MainNavView.Height = double.NaN;
60+
NavContainer.Width = 240;
61+
MainNavView.Width = 240;
62+
MainNavView.Margin = new Thickness(0);
63+
MainNavView.PaneDisplayMode = NavigationViewPaneDisplayMode.Left;
64+
MainNavView.IsPaneOpen = true;
65+
SettingIconButton.Visibility = Visibility.Collapsed;
66+
SettingFullButton.Visibility = Visibility.Visible;
67+
foreach (var item in ViewModel.NavigateItems)
68+
{
69+
if (!item.IsHeader)
70+
{
71+
item.DisplayTitle = item.Data.Title;
72+
}
73+
else
74+
{
75+
item.IsVisible = true;
76+
}
77+
}
78+
}
79+
}
80+
81+
private void OnSettingsButtonClick(object sender, RoutedEventArgs e)
82+
=> ViewModel.Navigate(PageType.Settings);
83+
}
84+
85+
/// <summary>
86+
/// 应用导航视图基类.
87+
/// </summary>
88+
public abstract class AppNavViewBase : ReactiveUserControl<AppViewModel>
89+
{
90+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright (c) Bili Copilot. All rights reserved.
2+
3+
using Bili.Copilot.ViewModels.Items;
4+
using Microsoft.UI.Xaml;
5+
using Microsoft.UI.Xaml.Controls;
6+
7+
namespace Bili.Copilot.App.Converters;
8+
9+
internal sealed class NavigateItemTemplateSelector : DataTemplateSelector
10+
{
11+
public DataTemplate Item { get; set; }
12+
13+
public DataTemplate Header { get; set; }
14+
15+
protected override DataTemplate SelectTemplateCore(object item)
16+
{
17+
var navItem = item as NavigateItemViewModel;
18+
return navItem.IsHeader ? Header : Item;
19+
}
20+
}

src/App/Forms/MainWindow.xaml

Lines changed: 2 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -38,79 +38,11 @@
3838
Background="{ThemeResource LayerFillColorDefaultBrush}"
3939
BorderBrush="{ThemeResource NavigationViewContentGridBorderBrush}"
4040
BorderThickness="0,0,0,1" />
41-
<Grid
41+
<controls:AppNavView
4242
x:Name="NavContainer"
4343
Grid.Row="2"
4444
Grid.RowSpan="1"
45-
Grid.Column="1"
46-
Height="56"
47-
Padding="4,0"
48-
Visibility="{x:Bind _appViewModel.IsNavigationMenuShown, Mode=OneWay}">
49-
<NavigationView
50-
x:Name="MainNavView"
51-
Height="48"
52-
Margin="0,-4,0,0"
53-
CompactPaneLength="48"
54-
IsBackButtonVisible="Collapsed"
55-
IsPaneOpen="False"
56-
IsPaneToggleButtonVisible="False"
57-
IsSettingsVisible="False"
58-
IsTitleBarAutoPaddingEnabled="False"
59-
MenuItemsSource="{x:Bind _appViewModel.NavigateItems}"
60-
OpenPaneLength="240"
61-
PaneDisplayMode="Top"
62-
SelectedItem="{x:Bind _appViewModel.CurrentNavigateItem, Mode=TwoWay}">
63-
<NavigationView.MenuItemTemplate>
64-
<DataTemplate x:DataType="items:NavigateItemViewModel">
65-
<NavigationViewItem
66-
AccessKey="{x:Bind Data.Index}"
67-
Content="{x:Bind DisplayTitle, Mode=OneWay}"
68-
DataContext="{x:Bind}"
69-
ToolTipService.ToolTip="{x:Bind Data.Title}">
70-
<NavigationViewItem.Icon>
71-
<base:FluentIcon Symbol="{x:Bind Data.Icon}" />
72-
</NavigationViewItem.Icon>
73-
</NavigationViewItem>
74-
</DataTemplate>
75-
</NavigationView.MenuItemTemplate>
76-
<NavigationView.PaneFooter>
77-
<Grid>
78-
<Button
79-
x:Name="SettingIconButton"
80-
Margin="6,0,0,0"
81-
HorizontalAlignment="Center"
82-
AccessKey="S"
83-
Click="OnSettingsButtonClick"
84-
Style="{StaticResource IconButtonStyle}"
85-
ToolTipService.ToolTip="{ext:Locale Name=Settings}">
86-
<base:FluentIcon FontSize="17" Symbol="Settings" />
87-
</Button>
88-
<Button
89-
x:Name="SettingFullButton"
90-
Margin="4,0,4,-4"
91-
Padding="12,10"
92-
HorizontalAlignment="Stretch"
93-
HorizontalContentAlignment="Left"
94-
AccessKey="S"
95-
Background="Transparent"
96-
BorderThickness="0"
97-
Click="OnSettingsButtonClick"
98-
Visibility="Collapsed">
99-
<StackPanel Orientation="Horizontal" Spacing="12">
100-
<base:FluentIcon
101-
VerticalAlignment="Center"
102-
FontSize="15"
103-
Symbol="Settings" />
104-
<TextBlock
105-
VerticalAlignment="Center"
106-
Text="{ext:Locale Name=Settings}"
107-
TextLineBounds="Tight" />
108-
</StackPanel>
109-
</Button>
110-
</Grid>
111-
</NavigationView.PaneFooter>
112-
</NavigationView>
113-
</Grid>
45+
Grid.Column="1" />
11446
<Grid
11547
x:Name="TipContainer"
11648
Grid.RowSpan="3"

src/App/Forms/MainWindow.xaml.cs

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -107,62 +107,34 @@ public void CheckMenuLayout()
107107
}
108108

109109
_currentPosition = position;
110-
110+
NavContainer.ChangeLayout(position);
111111
if (position == "bottom")
112112
{
113113
Grid.SetRow(NavContainer, 2);
114114
Grid.SetRowSpan(NavContainer, 1);
115115
Grid.SetColumn(NavContainer, 1);
116-
NavContainer.Padding = new Thickness(4, 0, 4, 0);
117-
NavContainer.Height = 56;
118-
MainNavView.Height = 48;
119-
NavContainer.Width = double.NaN;
120-
MainNavView.Width = double.NaN;
121-
MainNavView.Margin = new Thickness(0, -4, 0, 0);
122-
MainNavView.PaneDisplayMode = NavigationViewPaneDisplayMode.Top;
123116
MainFrame.BorderThickness = new Thickness(0, 0, 0, 1);
124117
CustomTitleBar.IsCompact = true;
125-
MainNavView.IsPaneOpen = false;
126118
MainFrame.CornerRadius = new CornerRadius(0, 0, 0, 0);
127119
MainFrame.Padding = new Thickness(0, 12, 0, 0);
128-
SettingIconButton.Visibility = Visibility.Visible;
129-
SettingFullButton.Visibility = Visibility.Collapsed;
130120
AppWindow.TitleBar.PreferredHeightOption = Microsoft.UI.Windowing.TitleBarHeightOption.Standard;
131121

132122
_appViewModel.PagePadding = 20;
133123
_appViewModel.HeaderFontSize = 20;
134-
foreach (var item in _appViewModel.NavigateItems)
135-
{
136-
item.DisplayTitle = default;
137-
}
138124
}
139125
else
140126
{
141127
Grid.SetRow(NavContainer, 1);
142128
Grid.SetRowSpan(NavContainer, 2);
143129
Grid.SetColumn(NavContainer, 0);
144-
NavContainer.Padding = new Thickness(0, 0, 0, 0);
145-
NavContainer.Height = double.NaN;
146-
MainNavView.Height = double.NaN;
147-
NavContainer.Width = 240;
148-
MainNavView.Width = 240;
149-
MainNavView.Margin = new Thickness(0);
150-
MainNavView.PaneDisplayMode = NavigationViewPaneDisplayMode.Left;
151-
MainNavView.IsPaneOpen = true;
152130
MainFrame.BorderThickness = new Thickness(1, 1, 0, 0);
153131
CustomTitleBar.IsCompact = false;
154132
MainFrame.CornerRadius = new CornerRadius(8, 0, 0, 0);
155133
MainFrame.Padding = new Thickness(0, 30, 0, 0);
156-
SettingIconButton.Visibility = Visibility.Collapsed;
157-
SettingFullButton.Visibility = Visibility.Visible;
158134
AppWindow.TitleBar.PreferredHeightOption = Microsoft.UI.Windowing.TitleBarHeightOption.Tall;
159135

160136
_appViewModel.PagePadding = 44;
161137
_appViewModel.HeaderFontSize = 28;
162-
foreach (var item in _appViewModel.NavigateItems)
163-
{
164-
item.DisplayTitle = item.Data.Title;
165-
}
166138
}
167139
}
168140

@@ -266,9 +238,6 @@ private void OnRequestSearch(object sender, string e)
266238
}
267239
}
268240

269-
private void OnSettingsButtonClick(object sender, RoutedEventArgs e)
270-
=> _appViewModel.Navigate(PageType.Settings);
271-
272241
private void OnBackButtonClick(object sender, EventArgs e)
273242
=> _appViewModel.BackCommand.Execute(default);
274243

0 commit comments

Comments
 (0)