WPF 全局加载界面、多界面实现渐变过渡效果

WPF 全局加载界面与渐变过渡效果

完整实现方案

MainWindow.xaml

<Window x:Class="LoadingScreenDemo.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:LoadingScreenDemo"mc:Ignorable="d"WindowStyle="None"AllowsTransparency="True"WindowState="Maximized"Background="Transparent"Loaded="Window_Loaded"><!-- 窗口阴影效果 --><Border Margin="20" CornerRadius="10"><Grid><!-- 黑色加载覆盖层(初始显示) --><Grid x:Name="LoadingOverlay" Background="#FF0A0A0A"Opacity="1"Panel.ZIndex="100"IsHitTestVisible="True"><!-- 加载动画 --><Grid VerticalAlignment="Center" HorizontalAlignment="Center"><StackPanel Orientation="Vertical" HorizontalAlignment="Center"><!-- 加载进度条 --><ProgressBar x:Name="LoadingProgress" Width="400" Height="20" Margin="0,0,0,20"IsIndeterminate="True"Foreground="#FF4A90E2"Style="{StaticResource ModernProgressBar}"/><!-- 加载文本 --><TextBlock Text="正在初始化应用程序..." HorizontalAlignment="Center"Foreground="#CCFFFFFF"FontSize="18"FontWeight="SemiBold"/><!-- 加载提示 --><TextBlock Text="请稍候,正在准备您的体验" HorizontalAlignment="Center"Margin="0,10,0,0"Foreground="#99FFFFFF"FontSize="14"/></StackPanel></Grid></Grid><!-- 主内容区域(初始隐藏) --><Grid x:Name="MainContent" Opacity="0" Panel.ZIndex="0"><!-- 背景图片 --><Grid.Background><ImageBrush ImageSource="https://images.unsplash.com/photo-1519681393784-d120267933ba?ixlib=rb-4.0.3&auto=format&fit=crop&w=1920&q=80"Stretch="UniformToFill" Opacity="0.9"/></Grid.Background><!-- 半透明覆盖层 --><Rectangle Fill="#80111111"/><!-- 主界面内容 --><Grid Margin="30"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><!-- 主内容区 --><Border Grid.Row="1" Background="#20000000" Padding="20"></Border></Grid></Border>
</Window>

MainWindow.xaml.cs

using System.Windows;
using System.Windows.Media.Animation;
using System.Threading.Tasks;namespace LoadingScreenDemo
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();this.Loaded += Window_Loaded;}private async void Window_Loaded(object sender, RoutedEventArgs e){// 模拟应用程序初始化过程await SimulateLoadingAsync();// 加载完成后显示主界面ShowMainContent();}private async Task SimulateLoadingAsync(){// 模拟加载进度for (int i = 0; i < 100; i++){await Task.Delay(30); // 模拟耗时操作// 更新进度(实际应用中替换为真实进度)if (i % 10 == 0){// 更新加载提示文本if (i < 30)LoadingProgress.ToolTip = "正在初始化核心模块...";else if (i < 60)LoadingProgress.ToolTip = "正在加载用户数据...";else if (i < 90)LoadingProgress.ToolTip = "正在准备用户界面...";elseLoadingProgress.ToolTip = "完成初始化...";}}}private void ShowMainContent(){// 创建动画var fadeInAnimation = new DoubleAnimation{From = 0,To = 1,Duration = TimeSpan.FromSeconds(1.5),EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut }};var fadeOutAnimation = new DoubleAnimation{From = 1,To = 0,Duration = TimeSpan.FromSeconds(1),EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut }};// 动画完成后移除加载层fadeOutAnimation.Completed += (s, args) => {LoadingOverlay.Visibility = Visibility.Collapsed;LoadingOverlay.IsHitTestVisible = false; // 允许与主内容交互};// 启动动画MainContent.BeginAnimation(UIElement.OpacityProperty, fadeInAnimation);LoadingOverlay.BeginAnimation(UIElement.OpacityProperty, fadeOutAnimation);}private void MinimizeButton_Click(object sender, RoutedEventArgs e){this.WindowState = WindowState.Minimized;}private void MaximizeButton_Click(object sender, RoutedEventArgs e){this.WindowState = this.WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;}private void CloseButton_Click(object sender, RoutedEventArgs e){this.Close();}}
}

实现要点说明

1. 全局黑屏加载效果

  • 使用 LoadingOverlay 网格覆盖整个窗口
  • Panel.ZIndex="100" 确保加载层在最上方
  • IsHitTestVisible="True" 阻止用户与下层内容交互
  • 黑色背景 (#FF0A0A0A) 提供沉浸式加载体验

2. 加载进度指示器

  • 使用 ProgressBar 显示加载进度(设置为不确定模式)
  • 添加加载状态文本提示
  • 自定义进度条样式使其更现代化

3. 渐变显示主界面

  • 使用 DoubleAnimation 创建透明度渐变动画
  • 加载层淡出 (Opacity 1 → 0)
  • 主内容淡入 (Opacity 0 → 1)
  • 使用 CubicEase 缓动函数实现平滑过渡

4. 加载期间禁用交互

  • 设置 LoadingOverlay.IsHitTestVisible="True" 捕获所有输入事件
  • 动画完成后设置 IsHitTestVisible="False" 恢复交互

5. 主界面设计

  • 添加专业背景图片
  • 使用半透明覆盖层提升文字可读性
  • 实现自定义标题栏(最小化/最大化/关闭按钮)
  • 添加导航菜单和内容区域
  • 底部状态栏显示应用信息

6. 视觉效果增强

  • 窗口周围添加阴影效果
  • 所有元素使用圆角设计
  • 按钮添加悬停和点击效果
  • 使用半透明层创造深度感

实际应用建议

  1. 真实加载逻辑
private async Task RealLoadingAsync()
{// 1. 初始化核心模块await InitializeCoreModules();UpdateLoadingText("核心模块初始化完成...");// 2. 加载配置数据await LoadConfiguration();UpdateLoadingText("配置加载完成...");// 3. 连接数据库/服务await ConnectToServices();UpdateLoadingText("服务连接成功...");// 4. 准备用户界面await PrepareUserInterface();UpdateLoadingText("界面准备就绪...");
}private void UpdateLoadingText(string message)
{Dispatcher.Invoke(() => {LoadingProgress.ToolTip = message;});
}
  1. 错误处理
private async void Window_Loaded(object sender, RoutedEventArgs e)
{try{await RealLoadingAsync();ShowMainContent();}catch (Exception ex){// 显示错误信息ShowErrorDialog("初始化失败", ex.Message);// 退出应用Application.Current.Shutdown();}
}
  1. 性能优化
  • 使用异步加载避免UI冻结
  • 后台线程执行耗时操作
  • 分阶段加载资源

这个实现提供了专业的应用启动体验,确保在加载过程中用户无法与主界面交互,加载完成后通过平滑过渡显示主界面内容。您可以根据实际需求调整加载时间、动画效果和界面设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/83374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ深度解析:从基础实践到高阶架构设计

引言​​ 在分布式系统与微服务架构主导的现代软件开发中&#xff0c;服务间通信的可靠性、异步处理能力及流量管控成为核心挑战。​​RabbitMQ​​作为基于AMQP协议的企业级消息中间件&#xff0c;凭借其灵活的路由机制、高可用架构与丰富的扩展能力&#xff0c;成为异步通信…

华为OD机试真题——矩形相交的面积(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

基于随机函数链接神经网络(RVFL)的锂电池健康状态(SOH)预测

基于随机函数链接神经网络(RVFL)的锂电池健康状态(SOH)预测 一、RVFL网络的基本原理与结构 随机向量功能链接(Random Vector Functional Link, RVFL)网络是一种单隐藏层前馈神经网络的随机化版本,其核心特征在于输入层到隐藏层的权重随机生成且固定,输出层权重通过最…

阿里云国际站,如何通过代理商邀请的链接注册账号

阿里云国际站&#xff1a;如何通过代理商邀请链接注册&#xff0c;解锁“云端超能力”与专属福利&#xff1f; 渴望在全球化浪潮中抢占先机&#xff1f;想获得阿里云国际站的海量云资源、遍布全球的加速节点与前沿AI服务&#xff0c;同时又能享受专属折扣、VIP级增值服务支持或…

PMOS以及电源转换电路设计

PMOS的使用 5V_EN5V时&#xff0c;PMOS截止&#xff1b; 5V_EN0V时&#xff0c;PMOS导通&#xff1b; 电源转换电路 当Vout0V时&#xff0c;Vg0V, Vgs>Vth, PMOS导通&#xff0c;只有电池供电&#xff1b; 当Vout5V时&#xff0c;Vg4.9V, Vs4.8V?, Vgs<Vth, PMOS截止&am…

云时代:DMZ安全架构的演进与实践

随着云计算的普及,传统的DMZ安全边界正在经历根本性变革。本文探讨如何在云环境中重新设计和实现DMZ架构,以应对现代安全挑战。 1. 传统DMZ与云DMZ的对比 传统DMZ(隔离区)是网络安全的经典架构,但云环境带来了新的挑战: 特性传统DMZ云DMZ物理边界明确的物理网络分区虚拟网…

mqtt协议连接阿里云平台

首先现在的阿里云物联网平台已经不在新购了&#xff0c;如下图所示&#xff1a; 解决办法&#xff1a;在咸鱼上租用一个账号&#xff0c;先用起来。 搭建阿里云平台&#xff0c;参考博客&#xff1a; &#xff08;一&#xff09;MQTT连接阿里云物联网平台&#xff08;小白向&…

职业本科院校无人机专业人才培养解决方案

2023年的中央经济工作会议强调了以科技创新推动现代化产业体系构建的重要性&#xff0c;并提出发展生物制造、商业航天、低空经济等战略性新兴产业。低空经济&#xff0c;依托民用无人机等低空飞行器&#xff0c;在多场景低空飞行活动的牵引下&#xff0c;正逐步形成一个辐射广…

Go语言字符串类型详解

1. 定义字符串类型 package mainimport ("fmt");func main() {var str1 string "你好 GoLang 1"var str2 "你好 GoLang 2"str3 : "你好 GoLang 3"fmt.Printf("%v--%T\n", str1, str1)// 你好 GoLang 1--stringfmt.Printf…

设计模式——中介者设计模式(行为型)

摘要 文章详细介绍了中介者设计模式&#xff0c;这是一种行为型设计模式&#xff0c;通过中介者对象封装多个对象间的交互&#xff0c;降低系统耦合度。文中阐述了其核心角色、优缺点、适用场景&#xff0c;并通过类图、时序图、实现方式、实战示例等多方面进行讲解&#xff0…

也说字母L:柔软的长舌

英语单词 tongue&#xff0c;意为“舌头” tongue n.舌&#xff0c;舌头&#xff1b;语言 很显然&#xff0c;“语言”是引申义&#xff0c;因为语言是抽象的&#xff0c;但舌头是具象的&#xff0c;根据由简入繁的原则&#xff0c;tongue显然首先是象形起义&#xff0c;表达…

性能测试实例(http和ldap协议压测)

一、某授权服务器生成授权码效率验证&#xff08;http协议&#xff09; 测试背景 在存量数据23万条的情况下&#xff0c;生成一条授权数据&#xff0c;需要10秒左右&#xff0c;用户反应数据生成效率太差&#xff0c;需要优化。初步判断是由于在授权数据生成时&#xff0c;有查…

Spring Boot中的事件与JMS消息集成

Spring Boot事件机制 Spring框架的事件处理是其核心特性之一,通过ApplicationEvent类和ApplicationListener接口实现。在Spring Boot应用中,事件机制是实现模块间消息传递的重要方式,通常用于业务逻辑内部通信。 内置事件类型 Spring应用上下文在启动时会触发多种内置事件…

第12次12: 修改和删除收货地址

第1步&#xff1a;在users应用下views.py中新增实现修改收货地址的视图类 class UpdateDestroyAddressView(LoginRequiredJSONMixin, View):def put(self, request, address_id):"""修改收货地址"""json_dict json.loads(request.body.decode(…

python常用库-pandas、Hugging Face的datasets库(大模型之JSONL(JSON Lines))

文章目录 python常用库pandas、Hugging Face的datasets库&#xff08;大模型之JSONL&#xff08;JSON Lines&#xff09;&#xff09;背景什么是JSONL&#xff08;JSON Lines&#xff09;通过pandas读取和保存JSONL文件pandas读取和保存JSONL文件 Hugging Face的datasets库Hugg…

【论文笔记】SecAlign: Defending Against Prompt Injection with Preference Optimization

论文信息 论文标题&#xff1a;SecAlign: Defending Against Prompt Injection with Preference Optimization - CCS 25 论文作者&#xff1a; Sizhe Chen - UC Berkeley &#xff1b;Meta, FAIR 论文链接&#xff1a;https://arxiv.org/abs/2410.05451 代码链接&#xff1a;h…

NLP学习路线图(十六):N-gram模型

一、为何需要语言模型&#xff1f;概率视角下的语言本质 自然语言处理的核心挑战在于让机器“理解”人类语言。这种理解的一个关键方面是处理语言的歧义性、创造性和结构性。语言模型&#xff08;Language Model, LM&#xff09;为此提供了一种强大的数学框架&#xff1a;它赋…

HTML 中 class 属性介绍、用法

1、&#x1f516; 什么是 class class 是 HTML 元素的一个核心属性&#xff0c;用来为元素指定一个或多个类名。它在网页开发中承担三大作用&#xff1a; &#x1f3a8; 连接样式&#xff08;CSS&#xff09;&#xff1a;让元素应用预定义的视觉效果⚙️ 绑定行为&#xff08…

MybatisPlus(含自定义SQL、@RequiredArgsConstructor、静态工具类Db)

大家在日常开发中应该能发现&#xff0c;单表的CRUD功能代码重复度很高&#xff0c;也没有什么难度。而这部分代码量往往比较大&#xff0c;开发起来比较费时。 因此&#xff0c;目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…

信贷风控规则策略累计增益lift测算

在大数据风控业务实践过程中&#xff0c;目前业内主要还是采用规则叠加的办法做策略&#xff0c;但是会遇到一些问题&#xff1a; 1.我们有10条规则&#xff0c;我上了前7条后&#xff0c;后面3条的绝对风险增益是多少&#xff1f; 2.我的规则之间应该做排序吗&#xff0c;最重…