C# WPF 实现原神官网立绘图画显示效果
By
jerryxjr1220
at 2023-08-25 • 0人收藏 • 643人看过
WPF对于图片的渲染效果要比WinForm出色很多,模仿原神官网立绘图画显示效果

动画效果:https://note.youdao.com/s/WNX2e9RX
前端Xaml:
<Window x:Class="YuanShenBrowser.MainWindow" 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:local="clr-namespace:YuanShenBrowser" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="125"/> </Grid.RowDefinitions> <!--背景图片--> <Image Grid.RowSpan="2" Stretch="UniformToFill" Source="https://uploadstatic.mihoyo.com/contentweb/20200211/2020021114220951905.jpg"/> <!--角色立绘--> <Image x:Name="charPic" Grid.RowSpan="2" d:Source="https://webstatic.mihoyo.com/upload/contentweb/2022/06/30/c8a5da498d29faa1c8f2e2bfb60efbd5_7098200614657426672.png" /> <!--角色列表--> <ListBox x:Name="charListBox" Grid.Row="1" VerticalAlignment="Bottom" Background="#33f0f3ff" HorizontalAlignment="Center" SelectionChanged="charListBox_SelectionChanged"> <ListBox.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </ListBox.ItemsPanel> </ListBox> </Grid> </Window>
后端主程序:
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Security.Policy;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace YuanShenBrowser
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public JToken list { get; set; }
public MainWindow()
{
InitializeComponent();
}
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
var client = new HttpClient();
var req = new HttpRequestMessage(HttpMethod.Get, "https://content-static.mihoyo.com/content/ysCn/getContentList?pageSize=206&pageNum=1&order=asc&channelId=350");
req.Headers.Add("Accept", "*/*");
req.Headers.Add("User-Agent", "Mozilla 5.0");
var resp = await client.SendAsync(req);
var result = await resp.Content.ReadAsStringAsync();
list = JObject.Parse(result)["data"]["list"];
foreach (var item in list)
{
//var cpurl = item["ext"][1]["value"][0]["url"].ToString();
var iconurl = item["ext"][0]["value"][0]["url"].ToString();
var name = item["title"].ToString();
charListBox.Items.Add(new Image { Source = new BitmapImage(new Uri(iconurl)), Name=name, Stretch = Stretch.UniformToFill, Height = 100 });
}
}
private void charListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var img = e.AddedItems[0] as Image;
foreach (var item in list)
{
if (item["title"].ToString() == img.Name)
{
var cpurl = item["ext"][1]["value"][0]["url"].ToString();
charPic.Source = new BitmapImage(new Uri(cpurl));
return;
}
}
}
}
}
5 个回复 | 最后更新于 2023-08-29
2023-08-26
#2
旁边可以加个切换城市列表加载更多人物立绘

定制化RadioButton
<!--城市列表--> <ListBox x:Name="cityListBox" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Background="Transparent"> <ListBox.Resources> <Style TargetType="RadioButton"> <Setter Property="FontSize" Value="24"/> <Setter Property="Foreground" Value="OrangeRed" /> <Setter Property="Margin" Value="5,10,20,0" /> <Setter Property="VerticalContentAlignment" Value="Center"></Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="RadioButton"> <ContentPresenter /> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListBox.Resources> <RadioButton Content="蒙德城" x:Name="rb150" /> <RadioButton Content="须弥城" x:Name="rb324" /> <RadioButton Content="稻妻城" x:Name="rb350" /> </ListBox>
定制化下方的头像列表(头像+姓名)并异步加载
private async Task Load(string id)
{
var client = new HttpClient();
var req = new HttpRequestMessage(HttpMethod.Get, $"https://content-static.mihoyo.com/content/ysCn/getContentList?pageSize=206&pageNum=1&order=asc&channelId={id}");
req.Headers.Add("Accept", "*/*");
req.Headers.Add("User-Agent", "Mozilla 5.0");
var resp = await client.SendAsync(req);
var result = await resp.Content.ReadAsStringAsync();
list = JObject.Parse(result)["data"]["list"];
charListBox.Items.Clear();
foreach (var item in list)
{
var iconurl = item["ext"][0]["value"][0]["url"].ToString();
var name = item["title"].ToString();
var panel = new StackPanel();
var img = new Image { Source = new BitmapImage(new Uri(iconurl)), Name = name, Stretch = Stretch.UniformToFill, Height = 100 };
panel.Children.Add(img);
panel.Children.Add(new Label() { Content = name, Foreground = Brushes.White, HorizontalAlignment = HorizontalAlignment.Center });
charListBox.Items.Add(panel);
}
}
2023-08-26
#4
还可以做背景变换的动画,把变化速度调慢时候当桌面时缓慢变化。

WPF应该有更优雅的动画制作语句,不过我只叠加了一张图片,然后调了调透明度
private void RunAnimation()
{
Application.Current.Dispatcher.Invoke(() =>
{
// 在UI线程上访问或修改UI元素的代码
var o = this.animationImage.Opacity;
if (appear)
o += 0.01;
else
o -= 0.01;
if (o >= 0.98)
appear = false;
else if (o <= 0.02)
appear = true;
this.animationImage.Opacity = o;
});
_ = Task.Delay(20)
.ContinueWith(t => RunAnimation());
}登录后方可回帖
全屏当桌面效果也非常好
大小只有145k