add installer

This commit is contained in:
DismissedLight
2022-11-05 20:45:38 +08:00
parent f2d63e69ea
commit 77158fc708
30 changed files with 570 additions and 220 deletions

4
.gitignore vendored
View File

@@ -11,6 +11,10 @@ src/Snap.Hutao/Snap.Hutao/bin/
src/Snap.Hutao/Snap.Hutao/obj/
src/Snap.Hutao/Snap.Hutao/Snap.Hutao_TemporaryKey.pfx
src/Snap.Hutao/Snap.Hutao.Installer/bin/
src/Snap.Hutao/Snap.Hutao.Installer/obj/
src/Snap.Hutao/Snap.Hutao.Installer/Properties/PublishProfiles/FolderProfile.pubxml.user
src/Snap.Hutao/Snap.Hutao.SourceGeneration/bin/
src/Snap.Hutao/Snap.Hutao.SourceGeneration/obj/

View File

@@ -37,4 +37,3 @@
* [microsoft/vs-validation](https://github.com/microsoft/vs-validation)
* [microsoft/WindowsAppSDK](https://github.com/microsoft/WindowsAppSDK)
* [microsoft/microsoft-ui-xaml](https://github.com/microsoft/microsoft-ui-xaml)
* [MiniExcel/MiniExcel](https://github.com/MiniExcel/MiniExcel)

View File

@@ -0,0 +1,72 @@
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
namespace Snap.Hutao.Installer;
internal class Program
{
private const string AppxKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Appx";
private const string ValueName = "AllowDevelopmentWithoutDevLicense";
public static async Task Main(string[] args)
{
string ps1File = Path.Combine(AppContext.BaseDirectory, "Install.ps1");
if (!File.Exists(ps1File))
{
Console.WriteLine("未检测到 Install.ps1 文件");
Console.WriteLine("请勿移动该安装程序,按下任意键退出...");
Console.ReadKey();
return;
}
try
{
//以管理策略打开开发者模式
Registry.SetValue(AppxKey, ValueName, 1, RegistryValueKind.DWord);
}
catch (Exception)
{
Console.WriteLine("开发者模式未开启,请手动开启,参阅下方链接");
Console.WriteLine("https://learn.microsoft.com/zh-CN/windows/apps/get-started/developer-mode-features-and-debugging");
}
await InstallAsync(ps1File).ConfigureAwait(false);
Console.WriteLine();
Console.WriteLine("官方文档与使用教程");
Console.WriteLine("https://hut.ao");
Console.WriteLine();
Console.WriteLine("在开始菜单中启动 Snap.Hutao ,按下任意键退出...");
Console.ReadKey();
}
private static async Task InstallAsync(string ps1File)
{
Console.WriteLine("请注意 PowerShell 中的提示");
Process ps = new()
{
StartInfo = new ProcessStartInfo()
{
FileName = "powershell.exe",
Arguments = $"-ExecutionPolicy Unrestricted \"{ps1File}\"",
UseShellExecute = true,
}
};
try
{
ps.Start();
await ps.WaitForExitAsync();
Console.WriteLine("安装脚本运行完成");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}

View File

@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>enable</Nullable>
<PublishTrimmed>true</PublishTrimmed>
<ApplicationManifest>app.manifest</ApplicationManifest>
<DebugType>embedded</DebugType>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC 清单选项
如果想要更改 Windows 用户帐户控制级别,请使用
以下节点之一替换 requestedExecutionLevel 节点。
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化。
如果你的应用程序需要此虚拟化来实现向后兼容性,则移除此
元素。
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的
Windows 版本的列表。取消评论适当的元素,
Windows 将自动选择最兼容的环境。 -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
<!-- 指示该应用程序可感知 DPI 且 Windows 在 DPI 较高时将不会对其进行
自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI无需
选择加入。选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应
在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。
将应用程序设为感知长路径。请参阅 https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
-->
<!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>

View File

@@ -14,6 +14,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SettingsUI", "SettingsUI\Se
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Snap.Hutao.SourceGeneration", "Snap.Hutao.SourceGeneration\Snap.Hutao.SourceGeneration.csproj", "{8B96721E-5604-47D2-9B72-06FEBAD0CE00}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Snap.Hutao.Installer", "Snap.Hutao.Installer\Snap.Hutao.Installer.csproj", "{CEC01691-F65E-4874-9AE2-F571369A7631}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -82,6 +84,22 @@ Global
{8B96721E-5604-47D2-9B72-06FEBAD0CE00}.Release|x64.Build.0 = Release|x64
{8B96721E-5604-47D2-9B72-06FEBAD0CE00}.Release|x86.ActiveCfg = Release|Any CPU
{8B96721E-5604-47D2-9B72-06FEBAD0CE00}.Release|x86.Build.0 = Release|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Debug|arm64.ActiveCfg = Debug|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Debug|arm64.Build.0 = Debug|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Debug|x64.ActiveCfg = Debug|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Debug|x64.Build.0 = Debug|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Debug|x86.ActiveCfg = Debug|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Debug|x86.Build.0 = Debug|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Release|Any CPU.Build.0 = Release|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Release|arm64.ActiveCfg = Release|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Release|arm64.Build.0 = Release|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Release|x64.ActiveCfg = Release|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Release|x64.Build.0 = Release|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Release|x86.ActiveCfg = Release|Any CPU
{CEC01691-F65E-4874-9AE2-F571369A7631}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -25,6 +25,8 @@
<Thickness x:Key="InfoBarContentRootPadding">16,0,0,0</Thickness>
<!--Pivot Resource-->
<x:Double x:Key="PivotHeaderItemFontSize">16</x:Double>
<Thickness x:Key="PivotHeaderItemMargin">16,0,0,0</Thickness>
<Thickness x:Key="PivotItemMargin">0</Thickness>
<!--CornerRadius-->
<CornerRadius x:Key="CompatCornerRadius">6</CornerRadius>
<CornerRadius x:Key="CompatCornerRadiusTop">6,6,0,0</CornerRadius>
@@ -46,6 +48,22 @@
<shmmc:QualityColorConverter x:Key="QualityColorConverter"/>
<shmmc:WeaponTypeIconConverter x:Key="WeaponTypeIconConverter"/>
<shvc:BoolToVisibilityRevertConverter x:Key="BoolToVisibilityRevertConverter"/>
<!--Styles-->
<Style
x:Key="LargeGridViewItemStyle"
TargetType="GridViewItem"
BasedOn="{StaticResource DefaultGridViewItemStyle}">
<Setter Property="Margin" Value="0,0,12,12"/>
</Style>
<!--ItemsPanelTemplate-->
<ItemsPanelTemplate x:Key="ItemsStackPanelTemplate">
<ItemsStackPanel/>
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="HorizontalStackPanelTemplate">
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ResourceDictionary>
</Application.Resources>
</Application>

View File

@@ -7,7 +7,6 @@ using Snap.Hutao.Core;
using Snap.Hutao.Core.Exception;
using Snap.Hutao.Core.LifeCycle;
using Snap.Hutao.Core.Logging;
using Snap.Hutao.Core.Threading;
using Snap.Hutao.Extension;
using Snap.Hutao.Service.Metadata;
using System.Diagnostics;

View File

@@ -30,6 +30,7 @@ public class ScopedPage : Page
/// <summary>
/// 初始化
/// 应当在 InitializeComponent() 前调用
/// </summary>
/// <typeparam name="TViewModel">视图模型类型</typeparam>
public void InitializeWith<TViewModel>()

View File

@@ -11,6 +11,7 @@ global using Microsoft.Extensions.Logging;
// Snap.Hutao
global using Snap.Hutao.Core.DependencyInjection;
global using Snap.Hutao.Core.DependencyInjection.Annotation;
global using Snap.Hutao.Core.Threading;
global using Snap.Hutao.Core.Validation;
// Runtime

View File

@@ -21,6 +21,7 @@ public class ComplexAvatar
{
Name = avatar.Name;
Icon = AvatarIconConverter.IconNameToUri(avatar.Icon);
SideIcon = AvatarSideIconConverter.IconNameToUri(avatar.SideIcon);
Quality = avatar.Quality;
Rate = $"{rate:P3}";
}
@@ -35,6 +36,11 @@ public class ComplexAvatar
/// </summary>
public Uri Icon { get; set; } = default!;
/// <summary>
/// 侧面图标
/// </summary>
public Uri SideIcon { get; set; } = default!;
/// <summary>
/// 星级
/// </summary>

View File

@@ -12,9 +12,19 @@ internal class AvatarSideIconConverter : ValueConverterBase<string, Uri>
{
private const string BaseUrl = "https://static.snapgenshin.com/AvatarIcon/{0}.png";
/// <summary>
/// 名称转Uri
/// </summary>
/// <param name="name">名称</param>
/// <returns>链接</returns>
public static Uri IconNameToUri(string name)
{
return new Uri(string.Format(BaseUrl, name));
}
/// <inheritdoc/>
public override Uri Convert(string from)
{
return new Uri(string.Format(BaseUrl, from));
return IconNameToUri(from);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -40,7 +40,6 @@ internal class GameService : IGameService
/// </summary>
/// <param name="scopeFactory">范围工厂</param>
/// <param name="memoryCache">内存缓存</param>
/// <param name="gameLocators">游戏定位器集合</param>
public GameService(IServiceScopeFactory scopeFactory, IMemoryCache memoryCache)
{
this.scopeFactory = scopeFactory;

View File

@@ -48,8 +48,10 @@
<None Remove="Resource\Icon\UI_Icon_Locked.png" />
<None Remove="Resource\Icon\UI_Icon_None.png" />
<None Remove="Resource\Icon\UI_ItemIcon_201.png" />
<None Remove="Resource\Icon\UI_ItemIcon_210.png" />
<None Remove="Resource\Segoe Fluent Icons.ttf" />
<None Remove="stylecop.json" />
<None Remove="View\Control\BottomTextControl.xaml" />
<None Remove="View\Control\DescParamComboBox.xaml" />
<None Remove="View\Control\ItemIcon.xaml" />
<None Remove="View\Control\SkillPivot.xaml" />
@@ -67,6 +69,7 @@
<None Remove="View\Page\AnnouncementContentPage.xaml" />
<None Remove="View\Page\AnnouncementPage.xaml" />
<None Remove="View\Page\AvatarPropertyPage.xaml" />
<None Remove="View\Page\DailyNotePage.xaml" />
<None Remove="View\Page\GachaLogPage.xaml" />
<None Remove="View\Page\HutaoDatabasePage.xaml" />
<None Remove="View\Page\LaunchGamePage.xaml" />
@@ -104,6 +107,7 @@
<Content Include="Resource\Icon\UI_Icon_Locked.png" />
<Content Include="Resource\Icon\UI_Icon_None.png" />
<Content Include="Resource\Icon\UI_ItemIcon_201.png" />
<Content Include="Resource\Icon\UI_ItemIcon_210.png" />
</ItemGroup>
<ItemGroup>
@@ -150,6 +154,16 @@
<ItemGroup>
<None Include="..\.editorconfig" Link=".editorconfig" />
</ItemGroup>
<ItemGroup>
<Page Update="View\Page\DailyNotePage.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Page Update="View\Control\BottomTextControl.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Page Update="View\Dialog\GameAccountNameDialog.xaml">
<Generator>MSBuild:Compile</Generator>

View File

@@ -0,0 +1,26 @@
<ContentControl
x:Class="Snap.Hutao.View.Control.BottomTextControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Border
BorderThickness="1"
CornerRadius="{StaticResource CompatCornerRadius}"
BorderBrush="{StaticResource CardStrokeColorDefault}"
Background="{StaticResource CardBackgroundFillColorDefault}">
<StackPanel>
<ContentPresenter
Name="ContentHost"/>
<TextBlock
Name="TextHost"
Margin="0,0,0,2"
TextWrapping="NoWrap"
TextTrimming="CharacterEllipsis"
MaxWidth="80"
HorizontalAlignment="Center"/>
</StackPanel>
</Border>
</ContentControl>

View File

@@ -0,0 +1,55 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Markup;
using Snap.Hutao.Core;
namespace Snap.Hutao.View.Control;
/// <summary>
/// 底部带有文本的控件
/// </summary>
[ContentProperty(Name = nameof(TopContent))]
public sealed partial class BottomTextControl : ContentControl
{
private static readonly DependencyProperty TextProperty = Property<BottomTextControl>.Depend(nameof(Text), string.Empty, OnTextChanged);
private static readonly DependencyProperty TopContentProperty = Property<BottomTextControl>.Depend<UIElement>(nameof(TopContent), default!, OnContentChanged2);
/// <summary>
/// 构造一个新的底部带有文本的控件
/// </summary>
public BottomTextControl()
{
InitializeComponent();
}
/// <summary>
/// 顶部内容
/// </summary>
public UIElement TopContent
{
get { return (UIElement)GetValue(TopContentProperty); }
set { SetValue(TopContentProperty, value); }
}
/// <summary>
/// 文本
/// </summary>
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
private static void OnTextChanged(DependencyObject sender, DependencyPropertyChangedEventArgs dp)
{
((BottomTextControl)sender).TextHost.Text = (string)dp.NewValue;
}
private static void OnContentChanged2(DependencyObject sender, DependencyPropertyChangedEventArgs dp)
{
((BottomTextControl)sender).ContentHost.Content = dp.NewValue;
}
}

View File

@@ -38,6 +38,11 @@
shvh:NavHelper.NavigateTo="shvp:GachaLogPage"
Icon="{shcm:BitmapIcon Source=ms-appx:///Resource/Icon/UI_BtnIcon_Gacha.png}"/>
<NavigationViewItem
Content="实时便笺"
shvh:NavHelper.NavigateTo="shvp:DailyNotePage"
Icon="{shcm:BitmapIcon Source=ms-appx:///Resource/Icon/UI_ItemIcon_210.png}"/>
<NavigationViewItem
Content="成就管理"
shvh:NavHelper.NavigateTo="shvp:AchievementPage"

View File

@@ -18,22 +18,22 @@
<mxi:Interaction.Behaviors>
<shcb:InvokeCommandOnLoadedBehavior Command="{Binding OpenUICommand}"/>
</mxi:Interaction.Behaviors>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid>
<Grid.Background>
<SolidColorBrush Color="{ThemeResource CardBackgroundFillColorSecondary}"/>
</Grid.Background>
<Grid Background="{StaticResource CardBackgroundFillColorDefaultBrush}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="252"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<CommandBar
Grid.Column="1"
DefaultLabelPosition="Right">
<CommandBar.Content>
<AutoSuggestBox
Text="{Binding SearchText,Mode=TwoWay}"
@@ -57,7 +57,7 @@
<AppBarElementContainer>
<ComboBox
MinWidth="120"
MinWidth="140"
Height="36"
Margin="2,6,3,6"
DisplayMemberPath="Name"
@@ -138,16 +138,8 @@
<ScrollViewer Padding="0,0,16,0">
<ItemsControl
Margin="16,0,0,16"
ItemsSource="{Binding Achievements}">
<!--ContentThemeTransition here can make items blinking-->
<!--<ItemsControl.Transitions>
<ContentThemeTransition/>
</ItemsControl.Transitions>-->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
ItemsSource="{Binding Achievements}"
ItemsPanel="{StaticResource ItemsStackPanelTemplate}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid
@@ -194,8 +186,7 @@
VerticalAlignment="Center"
Grid.Column="0"
Text="{Binding Time}"
Visibility="{Binding IsChecked,Converter={StaticResource BoolToVisibilityConverter}}"
/>
Visibility="{Binding IsChecked,Converter={StaticResource BoolToVisibilityConverter}}"/>
<Image
Grid.Column="1"
Height="32"

View File

@@ -14,6 +14,8 @@
xmlns:shca="using:Snap.Hutao.Control.Animation"
xmlns:shcb="using:Snap.Hutao.Control.Behavior"
xmlns:shci="using:Snap.Hutao.Control.Image"
xmlns:shv="using:Snap.Hutao.ViewModel"
d:DataContext="{d:DesignInstance shv:AnnouncementViewModel}"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<mxi:Interaction.Behaviors>
@@ -28,7 +30,7 @@
HorizontalAlignment="Stretch"
ItemsSource="{Binding Announcement.List}"
Padding="0"
Margin="12,12,0,-12">
Margin="16,16,0,-6">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
@@ -41,13 +43,9 @@
SelectionMode="None"
DesiredWidth="300"
HorizontalAlignment="Stretch"
ItemContainerStyle="{StaticResource LargeGridViewItemStyle}"
ItemsSource="{Binding List}"
Margin="0,0,2,0">
<cwucont:AdaptiveGridView.ItemContainerStyle>
<Style TargetType="GridViewItem" BasedOn="{StaticResource DefaultGridViewItemStyle}">
<Setter Property="Margin" Value="0,0,12,12"/>
</Style>
</cwucont:AdaptiveGridView.ItemContainerStyle>
<cwucont:AdaptiveGridView.ItemTemplate>
<DataTemplate>
<Border

View File

@@ -15,9 +15,7 @@
xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:shcp="using:Snap.Hutao.Control.Panel"
xmlns:shct="using:Snap.Hutao.Control.Text"
xmlns:shmmc="using:Snap.Hutao.Model.Metadata.Converter"
xmlns:shvcont="using:Snap.Hutao.View.Control"
xmlns:shvconv="using:Snap.Hutao.View.Converter"
xmlns:shv="using:Snap.Hutao.ViewModel"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
@@ -45,7 +43,7 @@
</Grid.RowDefinitions>
<CommandBar
DefaultLabelPosition="Right"
Background="{StaticResource CardBackgroundFillColorSecondary}">
Background="{StaticResource CardBackgroundFillColorSecondaryBrush}">
<CommandBar.Content>
<Grid>
<Grid.ColumnDefinitions>
@@ -54,7 +52,9 @@
<ColumnDefinition Width="72"/>
<ColumnDefinition Width="72"/>
</Grid.ColumnDefinitions>
<shcp:PanelSelector Margin="6,6,0,0" x:Name="ItemsPanelSelector"/>
<shcp:PanelSelector
Margin="6,6,0,0"
x:Name="ItemsPanelSelector"/>
<StackPanel
Grid.Column="1"
Margin="12,6,0,0">
@@ -90,12 +90,12 @@
</StackPanel>
</Grid>
</CommandBar.Content>
<AppBarSeparator/>
<AppBarButton
Label="刷新"
Icon="{shcm:FontIcon Glyph=&#xE72C;}"
Command="{Binding RefreshByUserGameRoleCommand}"/>
<AppBarButton
Label="按UID查询"
Icon="{shcm:FontIcon Glyph=&#xE721;}"
@@ -236,12 +236,8 @@
CornerRadius="{StaticResource CompatCornerRadius}"
Background="{StaticResource CardBackgroundFillColorSecondary}">
<ItemsControl
ItemsSource="{Binding SelectedAvatar.Skills}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
ItemsSource="{Binding SelectedAvatar.Skills}"
ItemsPanel="{StaticResource HorizontalStackPanelTemplate}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button
@@ -450,12 +446,8 @@
SelectionMode="None"
HorizontalAlignment="Left"
ItemsSource="{Binding SelectedAvatar.Reliquaries}"
Margin="0,12,0,-12">
<cwucont:AdaptiveGridView.ItemContainerStyle>
<Style TargetType="GridViewItem" BasedOn="{StaticResource DefaultGridViewItemStyle}">
<Setter Property="Margin" Value="0,0,12,12"/>
</Style>
</cwucont:AdaptiveGridView.ItemContainerStyle>
Margin="0,12,0,-12"
ItemContainerStyle="{StaticResource LargeGridViewItemStyle}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border

View File

@@ -0,0 +1,53 @@
<shc:ScopedPage
x:Class="Snap.Hutao.View.Page.DailyNotePage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:shc="using:Snap.Hutao.Control"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:sc="using:SettingsUI.Controls"
xmlns:shv="using:Snap.Hutao.ViewModel"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance shv:DailyNoteViewModel}"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<CommandBar
Background="{StaticResource CardBackgroundFillColorDefaultBrush}"
DefaultLabelPosition="Right">
<AppBarButton Label="添加角色" Icon="{shcm:FontIcon Glyph=&#xE710;}"/>
<AppBarButton Label="立即刷新" Icon="{shcm:FontIcon Glyph=&#xE72C;}"/>
<AppBarButton Label="通知设置" Icon="{shcm:FontIcon Glyph=&#xE713;}">
<AppBarButton.Flyout>
<Flyout>
<StackPanel>
<RadioButtons ItemsSource="{Binding RefreshTimes}">
<RadioButtons.Header>
<TextBlock Text="刷新间隔时间" Style="{StaticResource BaseTextBlockStyle}"/>
</RadioButtons.Header>
<RadioButtons.ItemTemplate>
<DataTemplate>
<TextBlock Margin="0,0,0,0" Text="{Binding Name}"/>
</DataTemplate>
</RadioButtons.ItemTemplate>
</RadioButtons>
<sc:SettingsGroup Header="通知" Margin="0,-16,0,0">
<sc:Setting
Icon="&#xEA8F;"
Header="提醒通知"
Description="防止通知自动收入操作中心">
<ToggleSwitch Margin="24,0,0,0" Style="{StaticResource ToggleSwitchSettingStyle}"/>
</sc:Setting>
</sc:SettingsGroup>
</StackPanel>
</Flyout>
</AppBarButton.Flyout>
</AppBarButton>
</CommandBar>
</Grid>
</shc:ScopedPage>

View File

@@ -0,0 +1,22 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Snap.Hutao.Control;
using Snap.Hutao.ViewModel;
namespace Snap.Hutao.View.Page;
/// <summary>
/// 实时便笺页面
/// </summary>
public sealed partial class DailyNotePage : ScopedPage
{
/// <summary>
/// 构造一个新的实时便笺页面
/// </summary>
public DailyNotePage()
{
InitializeWith<DailyNoteViewModel>();
InitializeComponent();
}
}

View File

@@ -19,11 +19,6 @@
<shcb:InvokeCommandOnLoadedBehavior Command="{Binding OpenUICommand}"/>
</mxi:Interaction.Behaviors>
<shc:ScopedPage.Resources>
<Thickness x:Key="PivotHeaderItemMargin">8,0,8,0</Thickness>
<Thickness x:Key="PivotItemMargin">0</Thickness>
</shc:ScopedPage.Resources>
<Grid Visibility="{Binding IsInitialized,Converter={StaticResource BoolToVisibilityConverter}}">
<Rectangle
Height="48"
@@ -34,7 +29,7 @@
<ComboBox
MinWidth="120"
Height="36"
Margin="16,6,12,6"
Margin="16,6,0,6"
DisplayMemberPath="Uid"
SelectedItem="{Binding SelectedArchive,Mode=TwoWay}"
ItemsSource="{Binding Archives}"/>
@@ -44,14 +39,14 @@
<AppBarButton Label="刷新" Icon="{shcm:FontIcon Glyph=&#xE72C;}">
<AppBarButton.Flyout>
<MenuFlyout Placement="Bottom">
<MenuFlyoutItem
Text="从缓存刷新"
Icon="{shcm:FontIcon Glyph=&#xE81E;}"
Command="{Binding RefreshByWebCacheCommand}"/>
<MenuFlyoutItem
Text="Stoken刷新"
Icon="{shcm:FontIcon Glyph=&#xE192;}"
Command="{Binding RefreshByStokenCommand}"/>
<MenuFlyoutItem
Text="从缓存刷新"
Icon="{shcm:FontIcon Glyph=&#xE81E;}"
Command="{Binding RefreshByWebCacheCommand}"/>
<MenuFlyoutItem
Text="手动输入Url"
Icon="{shcm:FontIcon Glyph=&#xE765;}"

View File

@@ -20,11 +20,6 @@
<shcb:InvokeCommandOnLoadedBehavior Command="{Binding OpenUICommand}"/>
</mxi:Interaction.Behaviors>
<shc:ScopedPage.Resources>
<Thickness x:Key="PivotHeaderItemMargin">8,0,8,0</Thickness>
<Thickness x:Key="PivotItemMargin">0</Thickness>
</shc:ScopedPage.Resources>
<Grid>
<Pivot>
<Pivot.RightHeader>
@@ -55,25 +50,15 @@
<GridView
SelectionMode="None"
ItemsSource="{Binding Avatars}"
Margin="12,12,0,-12">
<GridView.ItemContainerStyle>
<Style TargetType="GridViewItem" BasedOn="{StaticResource DefaultGridViewItemStyle}">
<Setter Property="Margin" Value="0,0,12,12"/>
</Style>
</GridView.ItemContainerStyle>
Margin="16,16,6,-6"
ItemContainerStyle="{StaticResource LargeGridViewItemStyle}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="{StaticResource CardBackgroundFillColorDefault}">
<StackPanel>
<shvc:ItemIcon
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
<TextBlock
Margin="0,0,0,2"
HorizontalAlignment="Center"
Text="{Binding Rate}"/>
</StackPanel>
</Border>
<shvc:BottomTextControl Text="{Binding Rate}">
<shvc:ItemIcon
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
</shvc:BottomTextControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</GridView>
@@ -95,25 +80,15 @@
<GridView
SelectionMode="None"
ItemsSource="{Binding Avatars}"
Margin="12,12,0,-12">
<GridView.ItemContainerStyle>
<Style TargetType="GridViewItem" BasedOn="{StaticResource DefaultGridViewItemStyle}">
<Setter Property="Margin" Value="0,0,12,12"/>
</Style>
</GridView.ItemContainerStyle>
Margin="16,16,6,-6"
ItemContainerStyle="{StaticResource LargeGridViewItemStyle}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="{StaticResource CardBackgroundFillColorDefault}">
<StackPanel>
<shvc:ItemIcon
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
<TextBlock
Margin="0,0,0,2"
HorizontalAlignment="Center"
Text="{Binding Rate}"/>
</StackPanel>
</Border>
<shvc:BottomTextControl Text="{Binding Rate}">
<shvc:ItemIcon
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
</shvc:BottomTextControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</GridView>
@@ -128,7 +103,7 @@
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid Margin="12,0,12,0">
<Grid Margin="16,0,16,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="48"/>
<ColumnDefinition />
@@ -152,6 +127,7 @@
</Grid>
<ScrollViewer Grid.Row="1">
<ItemsControl
Margin="0,0,0,8"
HorizontalContentAlignment="Stretch"
ItemsSource="{Binding AvatarConstellationInfos}">
<ItemsControl.ItemsPanel>
@@ -164,7 +140,7 @@
<Border
Background="{StaticResource CardBackgroundFillColorDefault}"
CornerRadius="{StaticResource CompatCornerRadius}"
Margin="12,0,12,12">
Margin="16,0,16,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>

View File

@@ -34,13 +34,13 @@
<RowDefinition/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<ScrollViewer Grid.Column="0" CanContentRenderOutsideBounds="True">
<ScrollViewer Grid.RowSpan="2">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="800"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<StackPanel Margin="32,0,24,24">
<StackPanel Margin="16,-16,16,16">
<sc:SettingsGroup Header="常规" Margin="0,0,0,0">
<sc:Setting
Icon="&#xE8AB;"
@@ -246,15 +246,21 @@
</ScrollViewer>
<Grid
Grid.Row="1"
VerticalAlignment="Bottom"
Background="{StaticResource SystemControlAcrylicElementMediumHighBrush}">
VerticalAlignment="Bottom">
<Button
Style="{StaticResource AccentButtonStyle}"
Command="{Binding LaunchCommand}"
HorizontalAlignment="Right"
Grid.Column="3"
Margin="24"
Width="138"
Content="启动游戏"/>
MinWidth="80"
Width="100"
Height="80">
<StackPanel>
<FontIcon Glyph="&#xE7FC;" FontSize="36"/>
<TextBlock Margin="0,4,0,0" Text="启动游戏"/>
</StackPanel>
</Button>
</Grid>
</Grid>
</shc:ScopedPage>

View File

@@ -23,17 +23,22 @@
<ColumnDefinition MaxWidth="1000"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<StackPanel Margin="32,0,24,24">
<StackPanel Margin="16,-16,24,16">
<sc:SettingsGroup Header="关于 胡桃">
<Grid Margin="0,4,0,16">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Image
Grid.Column="0"
<Border
Width="80"
Source="ms-appx:///Assets/Square150x150Logo.scale-200.png"/>
BorderThickness="1"
CornerRadius="{StaticResource CompatCornerRadius}"
BorderBrush="{StaticResource CardStrokeColorDefault}"
Background="{StaticResource CardBackgroundFillColorDefault}">
<Image Source="ms-appx:///Assets/Square150x150Logo.scale-200.png"/>
</Border>
<Grid
Margin="16,0,0,0"
Grid.Column="1">

View File

@@ -60,10 +60,6 @@
</shct:DescriptionTextBlock.Resources>
</shct:DescriptionTextBlock>
</DataTemplate>
<ItemsPanelTemplate x:Key="HorizontalStackPanelTemplate">
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</Page.Resources>
<SplitView
@@ -372,19 +368,13 @@
ItemsSource="{Binding Selected.Collocation.Avatars}">
<GridView.ItemTemplate>
<DataTemplate>
<Border
<shvc:BottomTextControl
ToolTipService.ToolTip="{Binding Name}"
Background="{StaticResource CardBackgroundFillColorDefault}">
<StackPanel>
<shvc:ItemIcon
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
<TextBlock
Margin="0,0,0,2"
HorizontalAlignment="Center"
Text="{Binding Rate}"/>
</StackPanel>
</Border>
Text="{Binding Rate}">
<shvc:ItemIcon
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
</shvc:BottomTextControl>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
@@ -397,23 +387,16 @@
ItemsSource="{Binding Selected.Collocation.Weapons}">
<GridView.ItemTemplate>
<DataTemplate>
<Border
<shvc:BottomTextControl
ToolTipService.ToolTip="{Binding Name}"
Background="{StaticResource CardBackgroundFillColorDefault}">
<StackPanel>
<shvc:ItemIcon
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
<TextBlock
Margin="0,0,0,2"
HorizontalAlignment="Center"
Text="{Binding Rate}"/>
</StackPanel>
</Border>
Text="{Binding Rate}">
<shvc:ItemIcon
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
</shvc:BottomTextControl>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
<TextBlock Text="搭配圣遗物" Style="{StaticResource BaseTextBlockStyle}" Margin="16,0,0,0"/>
<GridView
Margin="16,16,0,0"
@@ -423,30 +406,49 @@
ItemsSource="{Binding Selected.Collocation.ReliquarySets}">
<GridView.ItemTemplate>
<DataTemplate>
<Border
<shvc:BottomTextControl
ToolTipService.ToolTip="{Binding Name}"
Background="{StaticResource CardBackgroundFillColorDefault}">
<StackPanel>
<Grid>
<shvc:ItemIcon Quality="QUALITY_ORANGE"/>
<ItemsControl
Margin="0,0,16,0"
HorizontalAlignment="Center"
ItemsSource="{Binding Icons}"
ItemsPanel="{StaticResource HorizontalStackPanelTemplate}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<shci:CachedImage Width="48" Margin="0,0,-16,0" Source="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
<TextBlock
Margin="0,0,0,2"
HorizontalAlignment="Center"
Text="{Binding Rate}"/>
</StackPanel>
</Border>
Text="{Binding Rate}">
<cwuc:SwitchPresenter Value="{Binding Icons.Count,Mode=OneWay}">
<cwuc:Case IsDefault="True">
<cwuc:Case.Value>
<x:Int32>0</x:Int32>
</cwuc:Case.Value>
<Grid>
<shvc:ItemIcon Quality="QUALITY_ORANGE"/>
</Grid>
</cwuc:Case>
<cwuc:Case>
<cwuc:Case.Value>
<x:Int32>1</x:Int32>
</cwuc:Case.Value>
<Grid>
<shvc:ItemIcon Quality="QUALITY_ORANGE"/>
<shci:CachedImage Width="80" Margin="0,0,0,0" Source="{Binding Icons[0]}"/>
</Grid>
</cwuc:Case>
<cwuc:Case>
<cwuc:Case.Value>
<x:Int32>2</x:Int32>
</cwuc:Case.Value>
<Grid>
<shvc:ItemIcon Quality="QUALITY_ORANGE"/>
<shci:CachedImage
Width="54"
Margin="0,4,0,0"
Source="{Binding Icons[0]}"
HorizontalAlignment="Left"
VerticalAlignment="Top"/>
<shci:CachedImage
Width="54"
Margin="0,0,0,4"
Source="{Binding Icons[1]}"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"/>
</Grid>
</cwuc:Case>
</cwuc:SwitchPresenter>
</shvc:BottomTextControl>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
@@ -510,59 +512,29 @@
Text="特殊料理"
Grid.Column="0"
Style="{StaticResource BaseTextBlockStyle}"/>
<Border
<shvc:BottomTextControl
Grid.Row="1"
Grid.Column="0"
Margin="16,16,0,16"
CornerRadius="{StaticResource CompatCornerRadius}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Background="{StaticResource CardBackgroundFillColorDefault}"
BorderThickness="1"
BorderBrush="{StaticResource CardStrokeColorDefault}">
<StackPanel>
<shvc:ItemIcon
Text="{Binding Selected.FetterInfo.CookBonus.Name}">
<shvc:ItemIcon
Icon="{Binding Selected.FetterInfo.CookBonus.Icon,Converter={StaticResource ItemIconConverter}}"
Quality="{Binding Selected.FetterInfo.CookBonus.RankLevel}"/>
<TextBlock
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"
MaxWidth="80"
Margin="0,0,0,2"
HorizontalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding Selected.FetterInfo.CookBonus.Name}"/>
</StackPanel>
</Border>
</shvc:BottomTextControl>
<TextBlock
Margin="16,16,0,0"
Text="原料理"
Grid.Column="1"
Style="{StaticResource BaseTextBlockStyle}"/>
<Border
<shvc:BottomTextControl
Grid.Row="1"
Grid.Column="1"
Margin="16,16,0,16"
CornerRadius="{StaticResource CompatCornerRadius}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Background="{StaticResource CardBackgroundFillColorDefault}"
BorderThickness="1"
BorderBrush="{StaticResource CardStrokeColorDefault}">
<StackPanel>
<shvc:ItemIcon
Text="{Binding Selected.FetterInfo.CookBonus.OriginName}">
<shvc:ItemIcon
Icon="{Binding Selected.FetterInfo.CookBonus.OriginIcon,Converter={StaticResource ItemIconConverter}}"
Quality="{Binding Selected.FetterInfo.CookBonus.RankLevel}"/>
<TextBlock
TextWrapping="NoWrap"
TextTrimming="CharacterEllipsis"
MaxWidth="80"
Margin="0,0,0,2"
HorizontalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding Selected.FetterInfo.CookBonus.OriginName}"/>
</StackPanel>
</Border>
</shvc:BottomTextControl>
<Rectangle
Grid.Column="2"
Grid.RowSpan="2"
@@ -581,30 +553,14 @@
ItemsPanel="{StaticResource HorizontalStackPanelTemplate}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border
<shvc:BottomTextControl
ToolTipService.ToolTip="{Binding Name}"
Grid.Row="1"
Grid.Column="1"
Margin="16,16,0,16"
CornerRadius="{StaticResource CompatCornerRadius}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Background="{StaticResource CardBackgroundFillColorDefault}"
BorderThickness="1"
BorderBrush="{StaticResource CardStrokeColorDefault}">
<StackPanel>
<shvc:ItemIcon
Icon="{Binding Icon,Converter={StaticResource ItemIconConverter}}"
Quality="{Binding RankLevel}"/>
<TextBlock
TextTrimming="CharacterEllipsis"
MaxWidth="80"
Margin="0,0,0,2"
HorizontalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding Count}"/>
</StackPanel>
</Border>
Text="{Binding Count}">
<shvc:ItemIcon
Icon="{Binding Icon,Converter={StaticResource ItemIconConverter}}"
Quality="{Binding RankLevel}"/>
</shvc:BottomTextControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

View File

@@ -0,0 +1,32 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using CommunityToolkit.Mvvm.ComponentModel;
using Snap.Hutao.Control;
using Snap.Hutao.Model;
namespace Snap.Hutao.ViewModel;
/// <summary>
/// 实时便笺视图模型
/// </summary>
[Injection(InjectAs.Scoped)]
internal class DailyNoteViewModel : ObservableObject, ISupportCancellation
{
private readonly List<NamedValue<int>> refreshTimes = new()
{
new("4 分钟 | 0.5 树脂", 240),
new("8 分钟 | 1 树脂", 480),
new("30 分钟 | 3.75 树脂", 1800),
new("40 分钟 | 5 树脂", 2400),
new("60 分钟 | 7.5 树脂", 3600),
};
/// <inheritdoc/>
public CancellationToken CancellationToken { get; set; }
/// <summary>
/// 刷新时间
/// </summary>
public List<NamedValue<int>> RefreshTimes { get => refreshTimes; }
}

View File

@@ -68,6 +68,11 @@ public enum KnownReturnCode : int
/// </summary>
NotDefined = 7,
/// <summary>
/// 账号有风险
/// </summary>
CODE1034 = 1034,
/// <summary>
/// 数据未公开
/// </summary>