之前寫過一篇《WPF MVVM 模式下的彈窗》,裡面實作了确認框和消息框,經過一段時間的演化,目前又新增了可顯示自定義内容的彈框、可進行資訊錄入的彈框、以及本文将要介紹的加載等待框。
先來看看效果,首先是其它彈框(動圖):

然後是等待彈框(動圖):
下面來看如何實作,當然,是在之前的基礎上進行的,前一篇文章沒看的話,需要先看一下,或者直接擷取文末提供的代碼檢視。
首先改造的是,給右上角的 X 和底下的确認取消按鈕區域的是否顯示特性 Visibility 綁定了相關屬性,可以控制是否顯示,這樣在消息框情況下可以隐藏底部按鈕,在等待框情況下可以都隐藏掉。
然後是中間的主體區域,圖上看不出什麼變化,實際上變化還是比較大的,代碼如下:
文字版:
最外層使用 ScrollViewer 包裹,如果内容過多則可滾動。往裡一層是 StackPanel,裡面有一個 TextBlock 用于顯示文本内容,還有一個 ContentControl 用于顯示自定義内容(綁定一個 FrameworkElement 類型的對象)。兩種内容可以分别控制顯示和隐藏,也可以同時顯示,本文介紹的等待框就是使用了同時顯示。
按照設想,等待框的動畫部分作為自定義内容放入彈框的 ContentControl 中,是以我們需要建立個使用者控件。(此節參考朝夕教育 Jovan 老師在 B 站釋出的 WPF 教學視訊的“動畫實戰”一節)
将一個 Grid 分為四列,每列中放置一個不同顔色的 Border (以 Grid 包裹)并設定 LayoutTransform 變換類型為 ScaleTransform,并給每個 ScaleTransform 命名:
Border 顯示為圓形并居中的代碼為:
也就是設定寬度為包裹它的 Grid 的寬度的一半,即每列寬度的一半,這個平分的操作是通過轉換器 DivideConverter 實作的,具體可下載下傳代碼檢視。然後,高度綁定寬度,這樣就是正方形了。最後再設定圓角,就成圓形了。注釋的部分是設定 LayoutTransform 變換的,具體的 ScaleTransform 變換有個 ScaleX 和 ScaleY 值,分别設定 X 和 Y 方向上的變換數值(變大為 1.6 倍),由于後面需要對這兩個值設定動畫,是以此處不能寫死,注釋掉。
動畫直接在背景設定:
界面載入後執行動畫方法,動畫方法中先定義了一個 DoubleAnimation 類型的動畫:間隔一秒,目标值為 1.6,一直重複,自動反轉。然後在循環中按照命名規則,依次先使用 FindName 方法找到 ScaleTransform 元素對象,并對其設定 X 和 Y 方向上的動畫,等待 300 毫秒再設定下一個,總共四個。
彈窗 ViewModel 中添加了一個辨別是否是等待框的屬性 IsWaitDialog,在倒計時計時器裡面,當是等待框時改為正計時,自然也就不會觸發關閉操作,代碼如下:
在控制彈框顯示隐藏的屬性 IsShowDialog 的 set 方法中,當是等待框時,倒計時設為零,友善後面(上面說的)直接進行正計時:
關鍵是幫助方法中,新增一個彈出等待框方法:
先将自定義内容設定為等待動畫使用者控件,接下來是一些顯示方面的設定。
關鍵是如何在執行完業務方法後才關閉彈窗呢?
一開始 Func
後來把參數類型改為 Func
使用就比較簡單了:
代碼位址:https://gitee.com/dlgcy/WPFTemplate