Power Apps 中的 App 物件
適用於: 畫布應用 模型驅動應用
提供目前正在執行之應用程式和對應用程式行為控制的相關資訊。
描述
與控制項一樣,應用程式 物件提供屬性,可標識正在顯示的畫面以及提示使用者儲存變更,以免遺失。 每個應用程式都有一個應用程式物件。
您可以為應用程式物件的某些屬性編寫公式。 在樹狀檢視窗格的頂端,選取您要為任何其他控制項或畫面做的應用程式物件。 在公式列左側的下拉式清單中選取物件,即可查看並編輯其中一個物件的屬性。
ActiveScreen 屬性
ActiveScreen 屬性標示正在顯示的畫面。
此屬性會傳回畫面物件。 使用它來參考目前顯示畫面的屬性,例如帶有公式 App.ActiveScreen.Name 的名稱。 您還可以將此屬性與另一個畫面物件進行比較,例如使用比較公式 App.ActiveScreen = Screen2 來測試 Screen2 是否為目前顯示的畫面。
BackEnabled 屬性
BackEnabled 屬性可變更應用程式在 Power Apps 行動裝置中執行時回應裝置返回手勢 (在 Android 裝置上滑動或使用硬體返回按鈕、在 iOS 裝置上從左側滑動) 的方式。 啟用後,裝置返回手勢會瀏覽回最近顯示的畫面,這類似於 Back 公式。 停用後,裝置返回手勢會將使用者返回應用程式清單。
ConfirmExit 屬性
沒人想要遺失未儲存的變更。 在使用者關閉應用程式之前,會使用 ConfirmExit 及 ConfirmExitMessage 屬性來警告使用者。
Note
- ConfirmExit 在嵌入的應用程式中不起作用,例如, Power BI and SharePoint。
- 目前,如果已啟用延遲載入預覽功能 (預設適用於新的應用程式) 的話,這些屬性就只能參照第一個畫面上的控制項。 如果是參照,則 Power Apps Studio 不會顯示錯誤,但是所產生並已發佈的應用程式將無法在行動版 Power Apps 或瀏覽器中開啟。 我們正積極改善這項限制。 同時,您可以在設定>即將推出的功能中 (在預覽下) 關閉延遲載入。
ConfirmExit
ConfirmExit 是一個布林值屬性,如果 為 true,則會在關閉應用程式之前打開一個確認對話方塊。 根據預設,此屬性設定為 false,且不會顯示任何對話方塊。
如果使用者在應用程式中可能有未儲存的變更,請使用此屬性在退出應用程式之前顯示確認對話方塊。 請使用可檢查變數和控制項屬性 (例如,Edit form 控制項的 Unsaved 屬性) 的公式。
確認對話方塊會出現在所有可能會遺失資料的情形中,如下列範例所示:
- 執行 Exit 函式。
- 如果應用程式是在瀏覽器中執行:
- 關閉正在執行應用程式的瀏覽器或瀏覽器索引標籤。
- 選取瀏覽器上的「上一頁」按鈕。
- 以 Self 的 LaunchTarget 執行 Launch 函數。
- 如果應用程式是在 Power Apps Mobile (iOS 或 Android) 上執行:
- 輕掃即可切換至行動版 Power Apps 中的不同應用程式。
- 在 Android 裝置上選取返回鍵。
- 執行 Launch 函數以啟動另一個畫布應用程式。
確認對話方塊的實際外觀可能會因裝置與 Power Apps 版本的不同而有所不同。
確認對話方塊未出現在 Power Apps Studio 中。
ConfirmExitMessage
根據預設,確認對話方塊會顯示一般訊息,例如,以使用者語言表示您可能有未儲存的變更。
使用 ConfirmExitMessage,在確認對話方塊中提供自訂訊息。 如果此屬性為空白,則會使用預設值。 自訂訊息會視需要在確認對話方塊中被截斷以符合空間,因此請將訊息保持在最多幾行就好。
在瀏覽器中,確認對話方塊可能會顯示來自瀏覽器的一般訊息。
Note
應用程式物件還有兩個實驗性屬性,OnMessage
和 BackEnabled
。 這些屬性最終會從應用程式物件中移除。 建議您不要在生產環境中使用這些屬性。
範例
建立包含兩個表單控制項,AccountForm 和 ContactForm 的應用程式。
將應用程式物件的 ConfirmExit 屬性設為此運算式:
AccountForm.Unsaved Or ContactForm.Unsaved
如果使用者變更其中一個表單的資料,然後嘗試關閉應用程式但未儲存這些變更的話,就會顯示此對話方塊。
將應用程式物件的 ConfirmExitMessage 屬性設為此公式:
If( AccountsForm.Unsaved, "Accounts form has unsaved changes.", "Contacts form has unsaved changes." )
如果使用者變更帳戶表單的資料,然後嘗試關閉應用程式但未儲存這些變更的話,就會顯示此對話方塊。
設定 Application Insights 的偵測金鑰
若要將系統產生的應用程式記錄匯出到 Application Insights,您需要為畫布應用程式設定偵測金鑰。
- 在 Power Apps Studio 中開啟您的應用程式以進行編輯。
- 在左側導覽樹狀結構檢視中選取 App 物件。
- 在屬性窗格中輸入偵測金鑰。
如果資料未傳送到 App Insights,請聯絡您的 Power Platform 管理員,確認 App Insights 是否在租用戶層級停用。
公式屬性
使用 Formulas 屬性中的命名公式,定義可在整個應用程式中重複使用的公式。
在 Power Apps 中,控制項屬性是由公式所驅動。 例如,若要在應用程式中設定一致的背景色,您可以將每個 Fill 屬性設定為通用公式:
Label1.Fill: ColorValue( Param( "BackgroundColor" ) )
Label2.Fill: ColorValue( Param( "BackgroundColor" ) )
Label3.Fill: ColorValue( Param( "BackgroundColor" ) )
由於這種公式可能出現在很多地方,因此如果需要變更,更新它們會使人厭煩且容易出錯。 您可以改在 OnStart 中建立全域變數來設定顏色一次,然後在應用程式中重複使用該值:
App.OnStart: Set( BGColor, ColorValue( Param( "BackgroundColor" ) ) )
Label1.Fill: BGColor
Label2.Fill: BGColor
Label3.Fill: BGColor
雖然這種方法更好,但它還依賴於在 BGColor 的值建立之前執行的 OnStart。 BGColor 也可能在製造商不知道的應用程式的某些角落縱,這是其他人所做的更改,並且可能很難追蹤。
命名公式提供了另一種選擇。 就像我們常編寫的 control-property = expression 一樣,我們可以給為寫入 name = expression,然後在整個應用程式中重複使用 name 來取代 expression。 這些公式的定義是在 Formulas 屬性中進行:
App.Formulas: BGColor = ColorValue( Param( "BackgroundColor" ) );
Label1.Fill: BGColor
Label2.Fill: BGColor
Label3.Fill: BGColor
使用命名公式的優點包括:
- 公式的值永遠可用。 沒有時間相依性,沒有在設定值之前必須先執行的 OnStart,也沒有公式值不正確的時間。 命名公式可以依任何順序互相參考,只要它們不會造成循環參考。 它們可以同時計算。
- 公式的值永遠是最新的。 該公式可以執行相依於控制項屬性或資料庫記錄的計算,且隨著它們的變化,公式的值會自動更新。 您不需要像使用變數一樣手動更新值。 且只有在需要時,才會重新計算公式。
- 公式的定義是不可變的。 Formulas 中的定義是單一的事實來源,且無法在應用程式的其他位置變更值。 對於變數,某些程式碼可能會意外變更值,但命名公式就不可能發生這種情況。
- 公式的計算可以順延。 因為值是不可變的,所以總是可以在需要時計算,代表直到需要時才需要計算它。 在顯示應用程式的 screen2 之前,不使用的公式值不需要在 screen2 顯示之前計算。 推遲這項工作可以縮短應用程式載入時間。 命名公式是宣告式的,並為系統提供了最佳化計算方式和時間的機會。
- 命名公式是 Excel 概念。 Power Fx盡可能使用 Excel 概念,因為很多人都非常了解 Excel。 命名公式相當於 Excel 中的命名儲存格和命名公式,並由名稱管理員管理。 它們像試算表一樣自動重新計算,就像控制項屬性一樣。
命名公式在 Formulas 屬性中一個接一個地定義,每個都以分號結尾。 公式的類型是從運算式的類型推斷而來,其根據運算式中的元素類型以及它們如何一起使用而定。 例如,這些命名公式會從 Dataverse 中擷取關於目前使用者的實用資訊:
UserEmail = User().Email;
UserInfo = LookUp( Users, 'Primary Email' = User().Email );
UserTitle = UserInfo.Title;
UserPhone = Switch( UserInfo.'Preferred Phone',
'Preferred Phone (Users)'.'Mobile Phone', UserInfo.'Mobile Phone',
UserInfo.'Main Phone' );
如果需要更新UserTitle 的公式,可在此位置輕鬆完成。 如果應用程式不需要 UserPhone,則不會對 Dataverse 中的 Users 資料表進行這些呼叫。 包含未使用的公式定義不會造成任何損失。
命名公式的一些限制:
- 它們無法在應用程式中使用行為函數,不然可能造成副作用。
- 他們無法建立循環參考。 不允許在同一個應用程式中使用 a = b; 和 b = a;。
OnError 屬性
在偵測到錯誤之後,使用 OnError 執行動作。 它提供了向使用者顯示錯誤橫幅之前,先攔截錯誤橫幅的全域機會。 它還可以用於使用 Trace 函數記錄錯誤或寫入資料庫或 web 服務。
檢查每個公式評估的結果是否有錯誤。 如果有錯,OnError 將使用相同的 FirstError 和 AllErrors 範圍變數來評估,如果整個公式包裝在 IfError 函數 中。
如果 OnError 為空白,將會顯示預設錯誤橫幅和錯誤的 FirstError.Message。 定義 OnError 公式會覆寫此行為,讓製作者能夠按照他們認為合適的方式處理錯誤報告。 透過使用 Error 函數 重新擲回錯誤,可以在 OnError 中要求預設行為。 如果要篩選錯誤或以不同的方式處理錯誤,而通過其他錯誤,使功能會很有用。
OnError 無法像 IfError 那樣替換計算中的錯誤。 在叫用 OnError 時,已發生錯誤且已透過公式計算進行處理。 *OnError* 僅控制錯誤報告。
OnError 公式是併發計算的,它們的計算可能會與其他錯誤的處理重疊。 例如,如果您在 OnError 的頂端設定了全域變數,並稍後在相同的公式中讀取它,則該值可能已變更。 使用 With 函數來建立公式本機的命名值。
雖然每個錯誤都是由 OnError 單獨處理,但預設錯誤橫幅可能不會單獨顯示每個錯誤。 若要避免同時顯示太多錯誤橫幅,如果最近顯示相同的錯誤,則不會觸發新的錯誤橫幅。
範例
考慮透過公式繫結在一起的 Label控制項和 Slider 控制項:
Label1.Text = 1/Slider1.Value
滑桿預設為 50。 如果滑桿移至 0,則 Label1 將不會顯示任何值並會顯示錯誤橫幅:
讓我們詳細看看發生了什麼:
- 使用者將滑桿移至左側,而 Slide1.Value 屬性變更為 0。
- Label1.Text 已自動重新計算。 發生除數為零,產生錯誤。
- 此公式中沒有 IfError。 除數為零錯誤由公式評估傳回。
- Label1.Text 無法顯示此錯誤的任何內容,因此它顯示 空白 狀態。
- OnError 被調用。 因為沒有處理常式,所以會顯示標準錯誤橫幅和錯誤資訊。
如有需要,我們也可以將公式修改為 Label1.Text = IfError( 1/Slider1.Value, 0 )
。 這樣會導致沒有錯誤或錯誤橫幅。 我們無法從 OnError 變更錯誤的值,因為此時錯誤已經發生,問題只在於回報方式。
如果我們新增了 OnError 處理常式,其不會在步驟 5 之前產生影響,但是會影響報告錯誤的方式:
Trace( $"Error {FirstError.Message} in {FirstError.Source}" )
有了這個,從應用程式使用者的角度來看,不會有任何錯誤。 但是錯誤將新增至顯示器的追蹤中,並附有來自 FirstError 的錯誤資訊來源:
如果我們還想在追蹤之外顯示相同的預設錯誤橫幅,我們可以在追蹤呼叫之後使用 Error 函數重新擲回錯誤,就像追蹤不存在:
Trace( $"Error {FirstError.Message} in {FirstError.Source}" );
Error( FirstError )
OnStart 屬性
Note
在載入應用程式時,使用 OnStart 屬性會造成效能問題。 我們正在為使用屬性的兩大原因 (快取資料和設定全域變數) 建立替代方案。 我們已建立一個替代方案來定義要顯示的第一個 Navigate 畫面。 根據您的內容,預設可能會停用此屬性。 如果您沒看到但又需要使用此屬性,請檢查應用程式的 [進階] 設定以找到開關來啟用它。 也可以使用畫面的 OnVisible 屬性。
當使用者開始應用程式時,OnStart 屬性即會執行。 此屬性通常是用於執行以下工作:
在第一個畫面出現之前,會先計算此公式。 未載入任何畫面,因此您不能使用 UpdateContext 函式來設定內容變數。 不過,您可以使用 Navigate 函式來傳遞內容變數。
變更 OnStart 屬性之後,請將滑鼠懸停在樹狀結構檢視窗格中的應用程式物件上,選取省略符號 (...),然後選取執行 OnStart 以測試該屬性。 與應用程式第一次載入時不同,現有的集合和變數將會是已經設定好的。 若要從空的集合開始,請使用 ClearCollect 函式,而不是 Collect 函式。
注意
- 在 OnStart 屬性中使用 Navigate 函數已淘汰。 現有的應用程式將繼續運作。 在有限的時間內,您仍可以在應用程式設定中啟用它 (在已淘汰下)。 不過,以這種方式使用 Navigate 可能會造成應用程式載入延遲,因為這會強制系統在顯示第一個畫面之前完成 OnStart 的評估。 請改為使用 StartScreen 屬性來計算顯示的第一個畫面。
- 對於在 2021 年 3 月之前創建的應用程式,您在 2021 年 3 月至今期間添加了 導航到 OnStart 的應用程式,將關閉停用開關。 當您在 Power Apps Studio 中編輯此類應用程式時,可能會看到錯誤。 開啟上面提及的已淘汰開關來解決此錯誤。
StartScreen 屬性
Note
當停用選項 Enhanced formula bar 打開時,StartScreen 屬性將不會顯示在屬性清單中。 若要關閉增強型公式列,請移至設定 > 即將推出的功能 > 已淘汰 > 關閉增強型公式列開關,當您想使用 StartScreen 屬性時。
StartScreen 屬性決定要先顯示的畫面。 其會在應用程式載入時評估一次,並返回要顯示的畫面物件。 根據預設,此屬性將會是空白的,且會先顯示 [工作室樹狀結構] 檢視中的第一個畫面。
StartScreen 是一個數據流屬性,不能包含行為函數。 所有資料流程函數都可使用,尤其是使用這些函數和訊號來判斷要先顯示哪個畫面:
- Param 函數讀取用於啟動應用程式的參數。
- User 函數讀取當前用戶的資訊。
- LookUp、 Filter、 CountRows、 Max 和其他從資料來源讀取的函數。
- 透過連接器呼叫任何 API,但要注意其會快速傳回。
- 訊號,例如連線、羅盤和應用程式。
Note
全域變數和集合 (包括在 OnStart 中建立的變數和集合) 在 StartScreen 中無法使用。 某些宣告式替代方案可做到這一點。 如需有關此限制的意見反應,請移至 Power Apps 社群論壇。
如果 StartScreen 傳回錯誤,則 [工作室樹狀結構] 檢視的第一個畫面會顯示為好像 StartScreen 尚未設定一樣。 使用 IfError 函數來擷取任何錯誤,並重定導向至適當的錯誤畫面。
在工作室中變更 StartScreen 後,請將滑鼠懸停在樹狀結構檢視窗格中的應用程式物件上,選取省略符號 (...),然後選取瀏覽至 StartScreen 以測試該屬性。 畫面將會變更為好像已載入應用程式一樣。
範例
Screen9
表示每當應用程式啟動時,應先顯示 Screen9
。
If( Param( "admin-mode" ) = 1, HomeScreen, AdminScreen )
檢查使用者是否已設定了 Param「管理員模式」,並使用它來決定是要先顯示 HomeScreen 還是 AdminScreen。
If( LookUp( Attendees, User = User().Email ).Staff, StaffPortal, HomeScreen )
檢查會議的與會者是否為工作人員,並在啟動時將他們引導至適當的畫面。
IfError( If( CustomConnector.APICall() = "Forest",
ForestScreen,
OceanScreen
),
ErrorScreen
)
根據 API 呼叫將應用程式導向到 ForestScreen
或 OceanScreen
。 如果因任何原因而導致 API 失敗,則改為使用 ErrorScreen
。
StudioVersion 屬性
使用 StudioVersion 屬性可以顯示或記錄用於發佈應用程式的 Power Apps Studio 版本。 這在偵錯時非常有用,並可確保您的應用程式已使用最新版本的 Power Apps Studio 重新發佈。
StudioVersion 以文本形式返回。 文字的格式可能會隨著時間的推移而改變,應作為一個整體來對待; 避免擷取單獨的部分。