讓WPF的初始化啟動窗體動起來

2021-02-13 DotNetCore學習站

當程序啟動初始化時間比較長時,我們一般會設置一張圖片作為啟動畫面,讓用戶知道我們的程序不是崩了,是還在跑。

1 常用作法

常規啟動畫面使用步驟很簡單,我們從網上找一張圖片:點擊下載圖片[1]

下載啟動圖片用途演示

將下載的圖片放在主工程目錄下,修改圖片生成操作屬性為SplashScreen,然後其他啥都不用改,直接啟動項目即可。

修改圖片屬性

下面是設置圖片屬性,啟動後的效果:

靜態圖片設置為啟動畫面效果2 自定義窗體作為啟動畫面

此事例由博客園博主驚鏵投稿,原文連結:WPF實現等待界面效果[2]。

作者的話:

在使用一些應用的時候會發現等待界面做的用戶體驗很好,所以打算使用wpf實現一篇。

博文效果圖:

動態窗體2.1 開始實現上面的效果還差啥?

除上面下載的啟動畫面圖片外,還需要效果圖中的飛機:

飛機2.2 剩下的就是代碼了

xaml代碼

<Window.Resources>
    <ImageBrush x:Key="freeMachineImageBrush" ImageSource="/Images/飛機132x48.png"/>
</Window.Resources>

<Canvas Name="myCanvas" Focusable="True">
    <Rectangle Name="background" Height="400" Width="1262"/>
    <Rectangle Name="background2" Height="400" Width="1262" Canvas.Left="1262" />
    <Rectangle  Fill="{StaticResource freeMachineImageBrush}" 
               Height="48" Width="128" Canvas.Left="336"/>
</Canvas>

xaml.cs代碼

//創建定時器
DispatcherTimer timer = new DispatcherTimer();
//定義圖像畫刷
ImageBrush backgroundBrush = new ImageBrush();

//構造

timer.Tick += Engine;
timer.Interval = TimeSpan.FromMilliseconds(20);
backgroundBrush.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Images/timg.jpg"));
background.Fill = backgroundBrush;
background2.Fill = backgroundBrush;Start();


private void Engine(object sender, EventArgs e)
{
    var backgroundLeft = Canvas.GetLeft(background) - 3;
    var background2Left = Canvas.GetLeft(background2) - 3;

    Canvas.SetLeft(background, backgroundLeft);
    Canvas.SetLeft(background2, background2Left);
    if (backgroundLeft <= -1262)
     {
        timer.Stop();
        Start();
     }

}
private void Start()
{
  Canvas.SetLeft(background, 0); 
  Canvas.SetLeft(background2, 1262); 
  timer.Start();
}

2.3 站長測試

站長按博主提供的代碼寫了事例,感覺還是差了那麼點意思,經私下再和博主勾兌,下了其Github源碼(SoftWareHelper[3])後,看了實際效果如下:

SoftwareHelper的啟動畫面效果

看了啟動窗體的代碼,xaml中代碼與博文中相差不大,加了幾個文本控制項,用於顯示加載提示信息,實際使用時可以動態添加,這段代碼我就不複製展示了,點擊這裡可以查看(StartView.xaml[4])。

啟動窗體後臺代碼也與博文有差異,待啟動窗體Loaded完成後,使用了BackgroundWorker,將費時操作放在了DoWork中處理,待DoWork費時操作完成後,再啟動了主窗體、關閉啟動窗體。

var bw = new BackgroundWorker();

bw.DoWork += (s, y) =>
{

    Common.TemporaryFile();
    Common.ApplicationListCache = Common.AllApplictionInstalled();
    Common.GetDesktopAppliction(Common.ApplicationListCache);

    string json = JsonHelper.Serialize(Common.ApplicationListCache);
    FileHelper.WriteFile(json, Common.temporaryApplicationJson);
    Thread.Sleep(2000);
};

bw.RunWorkerCompleted += (s, y) => 
{
    tbMsg.Text = "開始體驗";
    timer.Stop();
    MainView mView = new MainView();
    mView.Show();

    var closeAnimation = new DoubleAnimation 
    {
        From = this.Width,
        To = 0,
        Duration = new Duration(TimeSpan.FromSeconds(0.5)),
        EasingFunction = new BackEase { EasingMode= EasingMode.EaseIn }
    };
    closeAnimation.Completed += (s1, e1) =>
    {
        this.Close();
    };
    //this.BeginAnimation(Window.OpacityProperty, closeAnimation);
    this.BeginAnimation(Window.WidthProperty, closeAnimation);
};
tbMsg.Text = "即將進入";
bw.RunWorkerAsync();

結語

自定義啟動窗體動畫,站長個人覺得還是挺有意思,比靜態圖片使用SplashScreen屬性的實現方式更加有趣了。

大家參考時,初始化的一些細節可以嘗試列印在啟動窗體上,能讓用戶覺得這程序在運行呀,原來在執行這個操作,才不會讓人覺得突兀,更能理解為啥啟動一個界面還等這麼久,我理解了,我才好表揚你噻,是不?

站長也將這個啟動窗體加在了TerminalMACS[5]項目上,後面有空再完善,看看下面的效果:

TerminalMACS啟動窗體❝

時間如流水,只能流去不流回。

微信公眾號:Dotnet9參考資料[1]

點擊下載圖片: http://www.quanjing.com/imgbuy/QJ8706798336.html

[2]

WPF實現等待界面效果: https://www.cnblogs.com/yanjinhua/p/14053344.html

[3]

SoftWareHelper: https://github.com/yanjinhuagood/SoftWareHelper

[4]

StartView.xaml: https://github.com/yanjinhuagood/SoftWareHelper/blob/master/SoftWareHelper/Views/StartView.xaml

[5]

TerminalMACS: https://github.com/dotnet9/TerminalMACS.ManagerForWPF/tree/master/src/TerminalMACS/Views

相關焦點

  • [翻譯]用於.NET Core的Windows窗體設計器發布
    Visual Studio中的.NET Core Windows窗體設計器不要忘記在「工具」 > 「選項」 > 「環境」 > 「預覽功能」中啟用設計器 。許多人可能還記得我們在 開源 Windows 窗體[1] 並將其移植到.NET Core 3.0 的.NET Core 中。
  • WPF開發的實用小工具 - 快捷懸浮菜單
    想要什麼應用,滑鼠只要簡單一滾動,看到目標應用一點就啟動了,看看下面的操作是不是你想要的?快捷查找應用並啟動市面上有很多類似的軟體小工具,做得功能可能更強大,但誰叫我們是程式設計師,不搞點自己開發的小玩意兒,那還有面出去說道說道?
  • C# WPF MVVM模式Prism框架從零搭建(經典)
    的建議看看這位大牛的系列博文http://www.cnblogs.com/yunfeifei/p/3922668.html安裝庫在nuget上安裝Prism相關常用的庫項目搭建step1:新建解決方案:我這裡命名為PrismFrameTest;step2:刪除MainWindow.xaml,刪除App.xaml中啟動引導
  • wpf實現sql的AppendLine拼接轉換
    實現的主要功能點如下:先來看下wpf的最終效果
  • 手把手教你構建WPF官方開源框架原始碼
    \build.cmd -pack -ci -configuration Release -prepareMachine /p:Platform=x86沒錯,將這個清單文件放在清單文件夾裡面,如 這個 commit 的做法 就可以讓 WPF 構建起來上面的清單文件也是最簡單的讓 WPF 構建的代碼了,核心代碼是 .
  • DotNET 讀 WPF 原始碼筆記 啟動歡迎界面 SplashScreen 的原理
    在 WPF 中的啟動界面,為了能讓 WPF 的啟動界面顯示足夠快,需要在應用的 WPF 主機還沒有啟動完成之前就顯示出啟動圖,此時的啟動圖需要自己解析圖片同時也需要自己創建顯示窗口。如果想要指定本地路徑的任意圖片作為啟動圖的,可以使用 lsj 提供的 kkwpsv/SplashImage: Fast splash Image with GDI+ in C# 庫,當然了,這個庫代碼量特別少,我推薦大家可以抄抄代碼。
  • 手把手教你如何構建 WPF 官方開源框架原始碼
    \build.cmd -pack -ci -configuration Release -prepareMachine /p:Platform=x86沒錯,將這個清單文件放在清單文件夾裡面,如 這個 commit 的做法 就可以讓 WPF 構建起來上面的清單文件也是最簡單的讓 WPF 構建的代碼了,核心代碼是 .
  • WPF動態更新ListBox
    namespace wpfbase { public partial class PageMes : Page { private FilesModel filesmodel; // 聲明FilesModel類型成員filesmodel public PageMes() { InitializeComponent();
  • 推薦一個IT老鳥肝了2月有餘的免費開源WPF企業級開發框架
    itemName=PeterSpa.XamlBinding開發環境因為項目是使用WPF來開發的,自然基於【MVVM】的理念搭建了這麼一個快速開發框架,適用於開發【傳統類型的管理系統】,並通過調用web api的方式來完成所有的業務操作,在WPF的Page,窗體(Window),用戶控制項的後置代碼,幾乎不會有任何的業務代碼,除了一些控制界面行為的功能。
  • WPF實現窗口內頁面跳轉
    namespace wpfbase{ public partial class MainWindow : Window { PageIndex pageindex; PageHelp pagehelp; ...
  • WPF 製作便攜小空調
    今天看到群裡一個小頁面挺有意思的,就是這個:https://ac.yunyoujun.cn/於是想著用w
  • Android啟動優化最佳方案:去啟動頁和異步初始化
    最近在慕課get了一些不錯的優化方案,將原來的冷啟動從3s左右提升到了1s左右。優化一:去掉啟動頁IPC是個比較耗時的操作,往往我們會設置一個閃屏頁,去掉之後可以一定幅度減少啟動時間。我的做法是直接刪除SplashActivity,將MainActivity設為啟動頁。然後在manifests中將其theme設為啟動時的theme:
  • 快速搞定Java圖形繪製之JDialog窗體與JFrame窗體
    一、JDialog窗體Java中的JDialog窗體是Swing組建中的對話框,他繼承了AWT組件中的java.awt.Dialog類。JDialog窗體的功能是從另外一個窗體中彈出另外一個窗體,就像是在使用IE瀏覽器時彈出的確定對話框一樣。
  • 如何在Mysql的Docker容器啟動時初始化資料庫
    那麼怎麼初始化 SQL腳本以及數據呢?我這裡有兩個傳統方案。第一種方案是在容器啟動後手動導入,太 low 了不行。第二種在Spring Boot客戶端連接Mysql容器時初始化資料庫,你可以參考使用 flyway 進行資料庫版本控制一文,但是這依賴客戶端的能力。能不能做到Mysql容器啟動時就自己初始化資料庫呢?當然可以!今天就來演示一下。全部代碼見文末。
  • 【薦】牛逼的WPF動畫庫:XamlFlair
    Rectangle Fill="RoyalBlue"           xf:Animations.Primary="{StaticResource SampleColorAnimation}" />覆蓋全局默認值如果需要全局更改默認動畫值之一(例如,默認Duration為750而不是500),則可以在應用程式的初始化代碼中調用
  • 給窗體增加背景音樂(不修窗體原始碼)
    給窗體增加背景音樂(不修改窗體原始碼)耿祥義
  • WPF文件選擇
    1.選擇文件的後臺代碼:在wpf框架中使用文件框選擇文件比較容易實現,可以直接使用Microsoft.Win32.OpenFIleDialog
  • WPF的渲染原理原來是這麼回事~
    SecurityCriticalDataClass<WeakReferenceList>(new WeakReferenceList()); } _hooks.Value.Insert(0, hook);}因為垃圾微軟的代碼,所以才在 Dispatcher 的構造函數調用 AddHook ,也就是在構造函數創建了 MessageOnlyHwndWrapper 在這個類初始化
  • 巧用窗體域 讓Word文檔受保護不被刪除
    step01 打開Word,點擊菜單「視圖—工具欄—窗體」,打開「窗體」工具欄。step02 在文檔中選中客戶輸入文字的地方,一般都是下劃線的範圍,選擇後點擊工具欄上的「文字型窗體域」就可以了。巧用窗體域 讓Word文檔受保護不被刪除 - 選擇「文字型窗體域」step03 如果是一些只有幾個固定內容的,我們可以來設置下拉型窗體域,如性別。