refactor(设置): 清理并重构设置页面代码
删除未使用的设置页面文件,包括外观、设计、字体、主题等页面 简化主页导航逻辑,移除动态生成导航项代码 更新导航菜单项图标和跳转逻辑 优化页面布局和代码结构
This commit is contained in:
@@ -1,49 +0,0 @@
|
||||
<Page x:Class="Ink_Canvas.Windows.SettingsViews.Pages.AppearancePage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Ink_Canvas.Windows.SettingsViews.Pages"
|
||||
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800"
|
||||
Title="外观">
|
||||
|
||||
<Grid Margin="24">
|
||||
<StackPanel>
|
||||
<TextBlock Text="外观设置" Style="{DynamicResource TitleTextBlockStyle}" Margin="0,0,0,16" />
|
||||
|
||||
<ui:SettingsCard
|
||||
Header="主题"
|
||||
Description="点击跳转到主题设置页面"
|
||||
IsClickEnabled="True"
|
||||
Click="SettingsCard_Click">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Color}"/>
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
|
||||
<ui:SettingsCard
|
||||
Header="颜色"
|
||||
Description="点击跳转到颜色设置页面"
|
||||
IsClickEnabled="True"
|
||||
Click="SettingsCard_Click_1"
|
||||
Margin="0,8,0,0">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Color}"/>
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
|
||||
<ui:SettingsCard
|
||||
Header="字体"
|
||||
Description="点击跳转到字体设置页面"
|
||||
IsClickEnabled="True"
|
||||
Click="SettingsCard_Click_2"
|
||||
Margin="0,8,0,0">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Font}"/>
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Page>
|
||||
@@ -1,40 +0,0 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace Ink_Canvas.Windows.SettingsViews.Pages
|
||||
{
|
||||
public partial class AppearancePage : Page
|
||||
{
|
||||
public AppearancePage()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void SettingsCard_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
SettingsWindow settingsWindow = Window.GetWindow(this) as SettingsWindow;
|
||||
if (settingsWindow != null)
|
||||
{
|
||||
settingsWindow.NavigateToPage("ThemePage");
|
||||
}
|
||||
}
|
||||
|
||||
private void SettingsCard_Click_1(object sender, RoutedEventArgs e)
|
||||
{
|
||||
SettingsWindow settingsWindow = Window.GetWindow(this) as SettingsWindow;
|
||||
if (settingsWindow != null)
|
||||
{
|
||||
settingsWindow.NavigateToPage("ColorsPage");
|
||||
}
|
||||
}
|
||||
|
||||
private void SettingsCard_Click_2(object sender, RoutedEventArgs e)
|
||||
{
|
||||
SettingsWindow settingsWindow = Window.GetWindow(this) as SettingsWindow;
|
||||
if (settingsWindow != null)
|
||||
{
|
||||
settingsWindow.NavigateToPage("FontsPage");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
<Page x:Class="Ink_Canvas.Windows.SettingsViews.Pages.BasicPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Ink_Canvas.Windows.SettingsViews.Pages"
|
||||
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
|
||||
xmlns:ikw="http://schemas.inkore.net/lib/ui/wpf"
|
||||
xmlns:sys="clr-namespace:System;assembly=mscorlib"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800"
|
||||
Title="基本">
|
||||
|
||||
<ScrollViewer Padding="59,0,59,0">
|
||||
<FrameworkElement.Resources>
|
||||
<sys:Double x:Key="SettingsCardSpacing">4</sys:Double>
|
||||
<Style x:Key="SettingsSectionHeaderTextBlockStyle"
|
||||
BasedOn="{StaticResource BodyStrongTextBlockStyle}"
|
||||
TargetType="TextBlock">
|
||||
<Style.Setters>
|
||||
<Setter Property="Margin" Value="1,30,0,6" />
|
||||
</Style.Setters>
|
||||
</Style>
|
||||
</FrameworkElement.Resources>
|
||||
<Grid>
|
||||
<ikw:SimpleStackPanel MaxWidth="800"
|
||||
HorizontalAlignment="Stretch"
|
||||
Spacing="{StaticResource SettingsCardSpacing}">
|
||||
|
||||
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}"
|
||||
Text="基本设置" />
|
||||
|
||||
<ItemsControl x:Name="SubPageItems">
|
||||
<ItemsControl.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<ikw:SimpleStackPanel Spacing="{StaticResource SettingsCardSpacing}" />
|
||||
</ItemsPanelTemplate>
|
||||
</ItemsControl.ItemsPanel>
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<ui:SettingsCard
|
||||
Header="{Binding Header}"
|
||||
Description="{Binding Description}"
|
||||
IsClickEnabled="True"
|
||||
Click="SubPageCard_Click"
|
||||
Tag="{Binding PageTag}">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Glyph="{Binding IconGlyph}" FontFamily="{Binding IconFontFamily}" />
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
|
||||
</ikw:SimpleStackPanel>
|
||||
</Grid>
|
||||
</ScrollViewer>
|
||||
</Page>
|
||||
@@ -1,125 +0,0 @@
|
||||
using iNKORE.UI.WPF.Modern.Common.IconKeys;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Reflection;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
using SWC = System.Windows.Controls;
|
||||
|
||||
namespace Ink_Canvas.Windows.SettingsViews.Pages
|
||||
{
|
||||
public class SubPageNavItem
|
||||
{
|
||||
public string Header { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string PageTag { get; set; }
|
||||
public string IconGlyph { get; set; }
|
||||
public FontFamily IconFontFamily { get; set; }
|
||||
}
|
||||
|
||||
public partial class BasicPage : SWC.Page
|
||||
{
|
||||
private readonly ObservableCollection<SubPageNavItem> _subPageItems = new();
|
||||
|
||||
public BasicPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
SubPageItems.ItemsSource = _subPageItems;
|
||||
Loaded += BasicPage_Loaded;
|
||||
}
|
||||
|
||||
private void BasicPage_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
LoadSubPages();
|
||||
}
|
||||
|
||||
private void LoadSubPages()
|
||||
{
|
||||
_subPageItems.Clear();
|
||||
|
||||
var settingsWindow = Window.GetWindow(this) as SettingsWindow;
|
||||
if (settingsWindow == null) return;
|
||||
|
||||
var navView = settingsWindow.GetNavigationView();
|
||||
if (navView == null) return;
|
||||
|
||||
foreach (var item in navView.MenuItems)
|
||||
{
|
||||
if (item is NavigationViewItem navItem)
|
||||
{
|
||||
string tag = navItem.Tag as string;
|
||||
if (tag == "BasicPage" && navItem.MenuItems.Count > 0)
|
||||
{
|
||||
foreach (var child in navItem.MenuItems)
|
||||
{
|
||||
if (child is NavigationViewItem childItem)
|
||||
{
|
||||
string childTag = childItem.Tag as string;
|
||||
if (!string.IsNullOrEmpty(childTag))
|
||||
{
|
||||
(string glyph, FontFamily fontFamily) = ExtractIconInfo(childItem);
|
||||
string description = SWC.ToolTipService.GetToolTip(childItem) as string
|
||||
?? $"点击跳转到{childItem.Content}";
|
||||
|
||||
_subPageItems.Add(new SubPageNavItem
|
||||
{
|
||||
Header = childItem.Content?.ToString() ?? "",
|
||||
Description = description,
|
||||
PageTag = childTag,
|
||||
IconGlyph = glyph,
|
||||
IconFontFamily = fontFamily
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private (string glyph, FontFamily fontFamily) ExtractIconInfo(NavigationViewItem navItem)
|
||||
{
|
||||
if (navItem.Icon is FontIcon fontIcon)
|
||||
{
|
||||
string glyph = fontIcon.Glyph ?? "\uE713";
|
||||
FontFamily fontFamily = fontIcon.FontFamily ?? new FontFamily("Segoe Fluent Icons");
|
||||
|
||||
if (fontIcon.Icon != null)
|
||||
{
|
||||
string iconStr = fontIcon.Icon.ToString();
|
||||
if (iconStr.Contains("_20_"))
|
||||
{
|
||||
string key24 = iconStr.Replace("_20_", "_24_");
|
||||
var field = typeof(FluentSystemIcons).GetField(key24, BindingFlags.Public | BindingFlags.Static);
|
||||
if (field != null)
|
||||
{
|
||||
var value = field.GetValue(null);
|
||||
if (value is FontIconData data24)
|
||||
{
|
||||
glyph = data24.Glyph ?? glyph;
|
||||
fontFamily = data24.FontFamily ?? fontFamily;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (glyph, fontFamily);
|
||||
}
|
||||
|
||||
if (navItem.Icon is SymbolIcon symbolIcon)
|
||||
return (char.ConvertFromUtf32((int)symbolIcon.Symbol), new FontFamily("Segoe Fluent Icons"));
|
||||
|
||||
return ("\uE713", new FontFamily("Segoe Fluent Icons"));
|
||||
}
|
||||
|
||||
private void SubPageCard_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (sender is FrameworkElement element && element.Tag is string pageTag)
|
||||
{
|
||||
var settingsWindow = Window.GetWindow(this) as SettingsWindow;
|
||||
settingsWindow?.NavigateToPage(pageTag);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,9 +11,7 @@
|
||||
xmlns:controls="clr-namespace:Ink_Canvas.Controls;assembly=InkCanvas.Controls"
|
||||
xmlns:c="clr-namespace:Ink_Canvas.Converter"
|
||||
mc:Ignorable="d"
|
||||
|
||||
Title="画板">
|
||||
|
||||
<ScrollViewer PanningMode="VerticalFirst">
|
||||
<Grid Margin="59,0,59,0">
|
||||
<FrameworkElement.Resources>
|
||||
@@ -28,8 +26,7 @@
|
||||
</Style>
|
||||
</FrameworkElement.Resources>
|
||||
<Grid>
|
||||
<ikw:SimpleStackPanel MaxWidth="1000"
|
||||
HorizontalAlignment="Stretch"
|
||||
<ikw:SimpleStackPanel MaxWidth="1000" HorizontalAlignment="Stretch"
|
||||
Spacing="{StaticResource SettingsCardSpacing}">
|
||||
|
||||
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}"
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
<ui:Page
|
||||
x:Class="Ink_Canvas.Windows.SettingsViews.Pages.ColorsPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
|
||||
xmlns:ikw="http://schemas.inkore.net/lib/ui/wpf"
|
||||
Title="颜色设置"
|
||||
mc:Ignorable="d">
|
||||
<Grid>
|
||||
<StackPanel Margin="24">
|
||||
<TextBlock Text="颜色设置" Style="{DynamicResource TitleTextBlockStyle}" Margin="0,0,0,16" />
|
||||
<TextBlock Text="这里是颜色设置页面" Style="{DynamicResource BodyTextBlockStyle}" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</ui:Page>
|
||||
@@ -1,12 +0,0 @@
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
|
||||
namespace Ink_Canvas.Windows.SettingsViews.Pages
|
||||
{
|
||||
public partial class ColorsPage : Page
|
||||
{
|
||||
public ColorsPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
<Page x:Class="Ink_Canvas.Windows.SettingsViews.Pages.DesignPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Ink_Canvas.Windows.SettingsViews.Pages"
|
||||
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800"
|
||||
Title="设计">
|
||||
|
||||
<Grid Margin="24">
|
||||
<StackPanel>
|
||||
<TextBlock Text="设计设置" Style="{DynamicResource TitleTextBlockStyle}" Margin="0,0,0,16" />
|
||||
|
||||
<ui:SettingsCard
|
||||
Header="图标"
|
||||
Description="点击跳转到图标设置页面"
|
||||
IsClickEnabled="True"
|
||||
Click="SettingsCard_Click">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Home}"/>
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
|
||||
<ui:SettingsCard
|
||||
Header="排版"
|
||||
Description="点击跳转到排版设置页面"
|
||||
IsClickEnabled="True"
|
||||
Click="SettingsCard_Click_1"
|
||||
Margin="0,8,0,0">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Font}"/>
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Page>
|
||||
@@ -1,31 +0,0 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace Ink_Canvas.Windows.SettingsViews.Pages
|
||||
{
|
||||
public partial class DesignPage : Page
|
||||
{
|
||||
public DesignPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void SettingsCard_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
SettingsWindow settingsWindow = Window.GetWindow(this) as SettingsWindow;
|
||||
if (settingsWindow != null)
|
||||
{
|
||||
settingsWindow.NavigateToPage("IconographyPage");
|
||||
}
|
||||
}
|
||||
|
||||
private void SettingsCard_Click_1(object sender, RoutedEventArgs e)
|
||||
{
|
||||
SettingsWindow settingsWindow = Window.GetWindow(this) as SettingsWindow;
|
||||
if (settingsWindow != null)
|
||||
{
|
||||
settingsWindow.NavigateToPage("TypographyPage");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
<ui:Page
|
||||
x:Class="Ink_Canvas.Windows.SettingsViews.Pages.FontsPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
|
||||
xmlns:ikw="http://schemas.inkore.net/lib/ui/wpf"
|
||||
Title="字体设置"
|
||||
mc:Ignorable="d">
|
||||
<Grid>
|
||||
<StackPanel Margin="24">
|
||||
<TextBlock Text="字体设置" Style="{DynamicResource TitleTextBlockStyle}" Margin="0,0,0,16" />
|
||||
<TextBlock Text="这里是字体设置页面" Style="{DynamicResource BodyTextBlockStyle}" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</ui:Page>
|
||||
@@ -1,12 +0,0 @@
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
|
||||
namespace Ink_Canvas.Windows.SettingsViews.Pages
|
||||
{
|
||||
public partial class FontsPage : Page
|
||||
{
|
||||
public FontsPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,57 +1,90 @@
|
||||
<Page x:Class="Ink_Canvas.Windows.SettingsViews.Pages.HomePage"
|
||||
<ui:Page x:Class="Ink_Canvas.Windows.SettingsViews.Pages.HomePage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Ink_Canvas.Windows.SettingsViews.Pages"
|
||||
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
|
||||
xmlns:ikw="http://schemas.inkore.net/lib/ui/wpf"
|
||||
xmlns:i18n="clr-namespace:Ink_Canvas.MarkupExtensions"
|
||||
xmlns:sys="clr-namespace:System;assembly=mscorlib"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800"
|
||||
mc:Ignorable="d"
|
||||
|
||||
Title="首页">
|
||||
|
||||
<ScrollViewer Padding="59,0,59,0">
|
||||
<FrameworkElement.Resources>
|
||||
<sys:Double x:Key="SettingsCardSpacing">4</sys:Double>
|
||||
<Style x:Key="SettingsSectionHeaderTextBlockStyle"
|
||||
BasedOn="{StaticResource BodyStrongTextBlockStyle}"
|
||||
TargetType="TextBlock">
|
||||
<Style.Setters>
|
||||
<Setter Property="Margin" Value="1,30,0,6" />
|
||||
</Style.Setters>
|
||||
</Style>
|
||||
</FrameworkElement.Resources>
|
||||
<Grid>
|
||||
<ikw:SimpleStackPanel MaxWidth="800"
|
||||
HorizontalAlignment="Stretch"
|
||||
Spacing="{StaticResource SettingsCardSpacing}">
|
||||
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}"
|
||||
Text="快速导航" />
|
||||
<ScrollViewer PanningMode="VerticalFirst">
|
||||
<Grid Margin="59,0,59,0">
|
||||
<FrameworkElement.Resources>
|
||||
<sys:Double x:Key="SettingsCardSpacing">4</sys:Double>
|
||||
<Style x:Key="SettingsSectionHeaderTextBlockStyle"
|
||||
BasedOn="{StaticResource BodyStrongTextBlockStyle}"
|
||||
TargetType="TextBlock">
|
||||
<Style.Setters>
|
||||
<Setter Property="Margin" Value="1,30,0,6" />
|
||||
</Style.Setters>
|
||||
</Style>
|
||||
</FrameworkElement.Resources>
|
||||
<Grid>
|
||||
<ikw:SimpleStackPanel MaxWidth="1000"
|
||||
HorizontalAlignment="Stretch"
|
||||
Spacing="{StaticResource SettingsCardSpacing}">
|
||||
|
||||
<ItemsControl x:Name="QuickNavItems">
|
||||
<ItemsControl.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<ikw:SimpleStackPanel Spacing="{StaticResource SettingsCardSpacing}" />
|
||||
</ItemsPanelTemplate>
|
||||
</ItemsControl.ItemsPanel>
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<ui:SettingsCard
|
||||
Header="{Binding Header}"
|
||||
Description="{Binding Description}"
|
||||
IsClickEnabled="True"
|
||||
Click="QuickNavCard_Click"
|
||||
Tag="{Binding PageTag}">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Glyph="{Binding IconGlyph}" FontFamily="{Binding IconFontFamily}" />
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</ikw:SimpleStackPanel>
|
||||
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}"
|
||||
Text="快速导航" />
|
||||
|
||||
<ui:SettingsCard Header="启动" Description="启动设置"
|
||||
IsClickEnabled="True" Click="QuickNavCard_Click" Tag="StartupPage">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Play}" />
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
|
||||
<ui:SettingsCard Header="隐私" Description="隐私与遥测设置"
|
||||
IsClickEnabled="True" Click="QuickNavCard_Click" Tag="PrivacyPage">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Shield}" />
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
|
||||
<ui:SettingsCard Header="窗口" Description="窗口设置"
|
||||
IsClickEnabled="True" Click="QuickNavCard_Click" Tag="WindowPage">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Pinned}" />
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
|
||||
<ui:SettingsCard Header="更新" Description="更新设置"
|
||||
IsClickEnabled="True" Click="QuickNavCard_Click" Tag="UpdatePage">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Sync}" />
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
|
||||
<ui:SettingsCard Header="实验性选项" Description="实验性选项"
|
||||
IsClickEnabled="True" Click="QuickNavCard_Click" Tag="ExperimentalPage">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.DeveloperTools}" />
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
|
||||
<ui:SettingsCard Header="画板" Description="画板与墨迹设置"
|
||||
IsClickEnabled="True" Click="QuickNavCard_Click" Tag="CanvasPage">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Edit}" />
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
|
||||
<ui:SettingsCard Header="关于" Description="关于 InkCanvasForClass"
|
||||
IsClickEnabled="True" Click="QuickNavCard_Click" Tag="AboutPage">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Info}" />
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
|
||||
<Rectangle Height="48" />
|
||||
|
||||
</ikw:SimpleStackPanel>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</ScrollViewer>
|
||||
</Page>
|
||||
</ui:Page>
|
||||
|
||||
@@ -1,111 +1,12 @@
|
||||
using iNKORE.UI.WPF.Modern.Common.IconKeys;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Reflection;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace Ink_Canvas.Windows.SettingsViews.Pages
|
||||
{
|
||||
public class QuickNavItem
|
||||
{
|
||||
public string Header { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string PageTag { get; set; }
|
||||
public string IconGlyph { get; set; }
|
||||
public FontFamily IconFontFamily { get; set; }
|
||||
}
|
||||
|
||||
public partial class HomePage
|
||||
{
|
||||
private readonly ObservableCollection<QuickNavItem> _navItems = new();
|
||||
|
||||
public HomePage()
|
||||
{
|
||||
InitializeComponent();
|
||||
QuickNavItems.ItemsSource = _navItems;
|
||||
Loaded += HomePage_Loaded;
|
||||
}
|
||||
|
||||
private void HomePage_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
LoadNavigationItems();
|
||||
}
|
||||
|
||||
private void LoadNavigationItems()
|
||||
{
|
||||
_navItems.Clear();
|
||||
|
||||
var settingsWindow = Window.GetWindow(this) as SettingsWindow;
|
||||
if (settingsWindow == null) return;
|
||||
|
||||
var navView = settingsWindow.GetNavigationView();
|
||||
if (navView == null) return;
|
||||
|
||||
CollectNavItems(navView.MenuItems);
|
||||
CollectNavItems(navView.FooterMenuItems);
|
||||
}
|
||||
|
||||
private void CollectNavItems(System.Collections.IEnumerable items)
|
||||
{
|
||||
foreach (var item in items)
|
||||
{
|
||||
if (item is NavigationViewItem navItem)
|
||||
{
|
||||
string tag = navItem.Tag as string;
|
||||
if (!string.IsNullOrEmpty(tag) && tag != "HomePage")
|
||||
{
|
||||
(string glyph, FontFamily fontFamily) = ExtractIconInfo(navItem);
|
||||
string description = ToolTipService.GetToolTip(navItem) as string
|
||||
?? $"点击跳转到{navItem.Content}";
|
||||
|
||||
_navItems.Add(new QuickNavItem
|
||||
{
|
||||
Header = navItem.Content?.ToString() ?? "",
|
||||
Description = description,
|
||||
PageTag = tag,
|
||||
IconGlyph = glyph,
|
||||
IconFontFamily = fontFamily
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private (string glyph, FontFamily fontFamily) ExtractIconInfo(NavigationViewItem navItem)
|
||||
{
|
||||
if (navItem.Icon is FontIcon fontIcon)
|
||||
{
|
||||
string glyph = fontIcon.Glyph ?? "\uE713";
|
||||
FontFamily fontFamily = fontIcon.FontFamily ?? new FontFamily("Segoe Fluent Icons");
|
||||
|
||||
if (fontIcon.Icon != null)
|
||||
{
|
||||
string iconStr = fontIcon.Icon.ToString();
|
||||
if (iconStr.Contains("_20_"))
|
||||
{
|
||||
string key24 = iconStr.Replace("_20_", "_24_");
|
||||
var field = typeof(FluentSystemIcons).GetField(key24, BindingFlags.Public | BindingFlags.Static);
|
||||
if (field != null)
|
||||
{
|
||||
var value = field.GetValue(null);
|
||||
if (value is FontIconData data24)
|
||||
{
|
||||
glyph = data24.Glyph ?? glyph;
|
||||
fontFamily = data24.FontFamily ?? fontFamily;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (glyph, fontFamily);
|
||||
}
|
||||
|
||||
if (navItem.Icon is SymbolIcon symbolIcon)
|
||||
return (char.ConvertFromUtf32((int)symbolIcon.Symbol), new FontFamily("Segoe Fluent Icons"));
|
||||
|
||||
return ("\uE713", new FontFamily("Segoe Fluent Icons"));
|
||||
}
|
||||
|
||||
private void QuickNavCard_Click(object sender, RoutedEventArgs e)
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
<Page x:Class="Ink_Canvas.Windows.SettingsViews.Pages.MainInterfacePage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Ink_Canvas.Windows.SettingsViews.Pages"
|
||||
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
|
||||
xmlns:ikw="http://schemas.inkore.net/lib/ui/wpf"
|
||||
xmlns:sys="clr-namespace:System;assembly=mscorlib"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800"
|
||||
Title="主界面">
|
||||
|
||||
<ScrollViewer Padding="59,0,59,0">
|
||||
<FrameworkElement.Resources>
|
||||
<sys:Double x:Key="SettingsCardSpacing">4</sys:Double>
|
||||
<Style x:Key="SettingsSectionHeaderTextBlockStyle"
|
||||
BasedOn="{StaticResource BodyStrongTextBlockStyle}"
|
||||
TargetType="TextBlock">
|
||||
<Style.Setters>
|
||||
<Setter Property="Margin" Value="1,30,0,6" />
|
||||
</Style.Setters>
|
||||
</Style>
|
||||
</FrameworkElement.Resources>
|
||||
<Grid>
|
||||
<ikw:SimpleStackPanel MaxWidth="800"
|
||||
HorizontalAlignment="Stretch"
|
||||
Spacing="{StaticResource SettingsCardSpacing}">
|
||||
|
||||
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}"
|
||||
Text="主界面" />
|
||||
|
||||
<ItemsControl x:Name="SubPageItems">
|
||||
<ItemsControl.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<ikw:SimpleStackPanel Spacing="{StaticResource SettingsCardSpacing}" />
|
||||
</ItemsPanelTemplate>
|
||||
</ItemsControl.ItemsPanel>
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<ui:SettingsCard
|
||||
Header="{Binding Header}"
|
||||
Description="{Binding Description}"
|
||||
IsClickEnabled="True"
|
||||
Click="SubPageCard_Click"
|
||||
Tag="{Binding PageTag}">
|
||||
<ui:SettingsCard.HeaderIcon>
|
||||
<ui:FontIcon Glyph="{Binding IconGlyph}" FontFamily="{Binding IconFontFamily}" />
|
||||
</ui:SettingsCard.HeaderIcon>
|
||||
</ui:SettingsCard>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
|
||||
</ikw:SimpleStackPanel>
|
||||
</Grid>
|
||||
</ScrollViewer>
|
||||
</Page>
|
||||
@@ -1,116 +0,0 @@
|
||||
using iNKORE.UI.WPF.Modern.Common.IconKeys;
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Reflection;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
using SWC = System.Windows.Controls;
|
||||
|
||||
namespace Ink_Canvas.Windows.SettingsViews.Pages
|
||||
{
|
||||
public partial class MainInterfacePage : SWC.Page
|
||||
{
|
||||
private readonly ObservableCollection<SubPageNavItem> _subPageItems = new();
|
||||
|
||||
public MainInterfacePage()
|
||||
{
|
||||
InitializeComponent();
|
||||
SubPageItems.ItemsSource = _subPageItems;
|
||||
Loaded += MainInterfacePage_Loaded;
|
||||
}
|
||||
|
||||
private void MainInterfacePage_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
LoadSubPages();
|
||||
}
|
||||
|
||||
private void LoadSubPages()
|
||||
{
|
||||
_subPageItems.Clear();
|
||||
|
||||
var settingsWindow = Window.GetWindow(this) as SettingsWindow;
|
||||
if (settingsWindow == null) return;
|
||||
|
||||
var navView = settingsWindow.GetNavigationView();
|
||||
if (navView == null) return;
|
||||
|
||||
foreach (var item in navView.MenuItems)
|
||||
{
|
||||
if (item is NavigationViewItem navItem)
|
||||
{
|
||||
string tag = navItem.Tag as string;
|
||||
if (tag == "MainInterfacePage" && navItem.MenuItems.Count > 0)
|
||||
{
|
||||
foreach (var child in navItem.MenuItems)
|
||||
{
|
||||
if (child is NavigationViewItem childItem)
|
||||
{
|
||||
string childTag = childItem.Tag as string;
|
||||
if (!string.IsNullOrEmpty(childTag))
|
||||
{
|
||||
(string glyph, FontFamily fontFamily) = ExtractIconInfo(childItem);
|
||||
string description = SWC.ToolTipService.GetToolTip(childItem) as string
|
||||
?? $"点击跳转到{childItem.Content}";
|
||||
|
||||
_subPageItems.Add(new SubPageNavItem
|
||||
{
|
||||
Header = childItem.Content?.ToString() ?? "",
|
||||
Description = description,
|
||||
PageTag = childTag,
|
||||
IconGlyph = glyph,
|
||||
IconFontFamily = fontFamily
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private (string glyph, FontFamily fontFamily) ExtractIconInfo(NavigationViewItem navItem)
|
||||
{
|
||||
if (navItem.Icon is FontIcon fontIcon)
|
||||
{
|
||||
string glyph = fontIcon.Glyph ?? "\uE737";
|
||||
FontFamily fontFamily = fontIcon.FontFamily ?? new FontFamily("Segoe Fluent Icons");
|
||||
|
||||
if (fontIcon.Icon != null)
|
||||
{
|
||||
string iconStr = fontIcon.Icon.ToString();
|
||||
if (iconStr.Contains("_20_"))
|
||||
{
|
||||
string key24 = iconStr.Replace("_20_", "_24_");
|
||||
var field = typeof(FluentSystemIcons).GetField(key24, BindingFlags.Public | BindingFlags.Static);
|
||||
if (field != null)
|
||||
{
|
||||
var value = field.GetValue(null);
|
||||
if (value is FontIconData data24)
|
||||
{
|
||||
glyph = data24.Glyph ?? glyph;
|
||||
fontFamily = data24.FontFamily ?? fontFamily;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (glyph, fontFamily);
|
||||
}
|
||||
|
||||
if (navItem.Icon is SymbolIcon symbolIcon)
|
||||
return (char.ConvertFromUtf32((int)symbolIcon.Symbol), new FontFamily("Segoe Fluent Icons"));
|
||||
|
||||
return ("\uE737", new FontFamily("Segoe Fluent Icons"));
|
||||
}
|
||||
|
||||
private void SubPageCard_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (sender is FrameworkElement element && element.Tag is string pageTag)
|
||||
{
|
||||
var settingsWindow = Window.GetWindow(this) as SettingsWindow;
|
||||
settingsWindow?.NavigateToPage(pageTag);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
<Page x:Class="Ink_Canvas.Windows.SettingsViews.Pages.Page2Page"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Ink_Canvas.Windows.SettingsViews.Pages"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800"
|
||||
Title="Page2">
|
||||
|
||||
<Grid>
|
||||
|
||||
</Grid>
|
||||
</Page>
|
||||
@@ -1,15 +0,0 @@
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace Ink_Canvas.Windows.SettingsViews.Pages
|
||||
{
|
||||
/// <summary>
|
||||
/// Page2.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class Page2Page : Page
|
||||
{
|
||||
public Page2Page()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -54,7 +54,7 @@
|
||||
<controls:LabeledSettingsCard x:Name="CardExternalProtocol"
|
||||
Header="{i18n:I18n Key=Startup_ExternalProtocol}"
|
||||
Description="{i18n:I18n Key=Startup_ExternalProtocolHint}"
|
||||
Icon="{x:Static ui:FluentSystemIcons.Link_20_Regular}"
|
||||
Icon="{x:Static ui:SegoeFluentIcons.Link}"
|
||||
SwitchName="ToggleSwitchExternalProtocol"
|
||||
Toggled="ToggleSwitchExternalProtocol_Toggled" />
|
||||
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
<ui:Page
|
||||
x:Class="Ink_Canvas.Windows.SettingsViews.Pages.ThemePage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
|
||||
xmlns:ikw="http://schemas.inkore.net/lib/ui/wpf"
|
||||
Title="主题设置"
|
||||
mc:Ignorable="d">
|
||||
<Grid>
|
||||
<StackPanel Margin="24">
|
||||
<TextBlock Text="主题设置" Style="{DynamicResource TitleTextBlockStyle}" Margin="0,0,0,16" />
|
||||
<TextBlock Text="这里是主题设置页面" Style="{DynamicResource BodyTextBlockStyle}" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</ui:Page>
|
||||
@@ -1,12 +0,0 @@
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
|
||||
namespace Ink_Canvas.Windows.SettingsViews.Pages
|
||||
{
|
||||
public partial class ThemePage : Page
|
||||
{
|
||||
public ThemePage()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
<ui:Page
|
||||
x:Class="Ink_Canvas.Windows.SettingsViews.Pages.TypographyPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
|
||||
xmlns:ikw="http://schemas.inkore.net/lib/ui/wpf"
|
||||
Title="排版设置"
|
||||
mc:Ignorable="d">
|
||||
<Grid>
|
||||
<StackPanel Margin="24">
|
||||
<TextBlock Text="排版设置" Style="{DynamicResource TitleTextBlockStyle}" Margin="0,0,0,16" />
|
||||
<TextBlock Text="这里是排版设置页面" Style="{DynamicResource BodyTextBlockStyle}" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</ui:Page>
|
||||
@@ -1,12 +0,0 @@
|
||||
using iNKORE.UI.WPF.Modern.Controls;
|
||||
|
||||
namespace Ink_Canvas.Windows.SettingsViews.Pages
|
||||
{
|
||||
public partial class TypographyPage : Page
|
||||
{
|
||||
public TypographyPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -128,7 +128,7 @@
|
||||
<ui:NavigationViewItem
|
||||
x:Name="BasicItem"
|
||||
Content="基本"
|
||||
Tag="BasicPage"
|
||||
Tag="StartupPage"
|
||||
SelectsOnInvoked="True"
|
||||
ToolTipService.ToolTip="基本设置">
|
||||
<ui:NavigationViewItem.Icon>
|
||||
@@ -160,10 +160,10 @@
|
||||
<ui:NavigationViewItem
|
||||
x:Name="MainInterfaceItem"
|
||||
Content="主界面"
|
||||
Tag="MainInterfacePage"
|
||||
Tag="WindowPage"
|
||||
ToolTipService.ToolTip="主界面设置">
|
||||
<ui:NavigationViewItem.Icon>
|
||||
<ui:FontIcon Icon="{x:Static ui:FluentSystemIcons.Desktop_20_Regular}" FontSize="20" Margin="-2"/>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.TVMonitor}"/>
|
||||
</ui:NavigationViewItem.Icon>
|
||||
<ui:NavigationViewItem.MenuItems>
|
||||
<ui:NavigationViewItem
|
||||
@@ -172,7 +172,7 @@
|
||||
Tag="WindowPage"
|
||||
ToolTipService.ToolTip="窗口设置">
|
||||
<ui:NavigationViewItem.Icon>
|
||||
<ui:FontIcon Icon="{x:Static ui:FluentSystemIcons.Window_20_Regular}" FontSize="20" Margin="-2"/>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Pinned}"/>
|
||||
</ui:NavigationViewItem.Icon>
|
||||
</ui:NavigationViewItem>
|
||||
</ui:NavigationViewItem.MenuItems>
|
||||
@@ -196,7 +196,7 @@
|
||||
Tag="ExperimentalPage"
|
||||
ToolTipService.ToolTip="实验性选项">
|
||||
<ui:NavigationViewItem.Icon>
|
||||
<ui:FontIcon Icon="{x:Static ui:FluentSystemIcons.Beaker_20_Regular}" FontSize="20" Margin="-2"/>
|
||||
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.DeveloperTools}"/>
|
||||
</ui:NavigationViewItem.Icon>
|
||||
</ui:NavigationViewItem>
|
||||
|
||||
|
||||
@@ -37,10 +37,8 @@ namespace Ink_Canvas.Windows.SettingsViews
|
||||
_pageTypes = new Dictionary<string, Type>
|
||||
{
|
||||
{ "HomePage", typeof(HomePage) },
|
||||
{ "BasicPage", typeof(BasicPage) },
|
||||
{ "StartupPage", typeof(StartupPage) },
|
||||
{ "PrivacyPage", typeof(PrivacyPage) },
|
||||
{ "MainInterfacePage", typeof(MainInterfacePage) },
|
||||
{ "WindowPage", typeof(WindowPage) },
|
||||
{ "UpdatePage", typeof(UpdatePage) },
|
||||
{ "ExperimentalPage", typeof(ExperimentalPage) },
|
||||
|
||||
Reference in New Issue
Block a user