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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83374.shtml
英文地址,請注明出處:http://en.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;最重…