Power Apps 中的 App 物件

適用於: 畫布應用程式 模型導向應用程式

提供目前正在執行之應用程式和對應用程式行為控制的相關資訊。

描述

與控制項一樣,應用程式 物件提供屬性,可標識正在顯示的畫面以及提示使用者儲存變更,以免遺失。 每個應用程式都有一個應用程式物件。

您可以為應用程式物件的某些屬性編寫公式。 在樹狀檢視窗格的頂端,選取您要為任何其他控制項或畫面做的應用程式物件。 在公式列左側的下拉式清單中選取物件,即可查看並編輯其中一個物件的屬性。

樹狀檢視中的應用程式物件。

ActiveScreen 屬性

ActiveScreen 屬性標示正在顯示的畫面。

此屬性會傳回畫面物件。 使用它來參考目前顯示畫面的屬性,例如帶有公式 App.ActiveScreen.Name 的名稱。 您還可以將此屬性與另一個畫面物件進行比較,例如使用比較公式 App.ActiveScreen = Screen2 來測試 Screen2 是否為目前顯示的畫面。

使用 BackNavigate 函式來變更顯示畫面。

BackEnabled 屬性

BackEnabled 屬性可變更應用程式在 Power Apps 行動裝置中執行時回應裝置返回手勢 (在 Android 裝置上滑動或使用硬體返回按鈕、在 iOS 裝置上從左側滑動) 的方式。 啟用後,裝置返回手勢會瀏覽回最近顯示的畫面,這類似於 Back 公式。 停用後,裝置返回手勢會將使用者返回應用程式清單。

ConfirmExit 屬性

沒人想要遺失未儲存的變更。 在使用者關閉應用程式之前,會使用 ConfirmExitConfirmExitMessage 屬性來警告使用者。

Note

  • ConfirmExit 無法在 Power BI 和 SharePoint 等嵌入的應用程式中運作。
  • 目前,如果已啟用延遲載入預覽功能(預設適用於新的應用程式)的話,這些屬性就只能參照第一個畫面上的控制項。 如果是參照,則 Power Apps Studio 不會顯示錯誤,但是所產生並已發佈的應用程式將無法在行動版 Power Apps 或瀏覽器中開啟。 我們正積極改善這項限制。 同時,您可以在設定>即將推出的功能中 (在預覽下) 關閉延遲載入

ConfirmExit

ConfirmExit是一種布林值屬性,當設定為 true 時,會在應用程式關閉之前,開啟確認對話方塊。 根據預設,此屬性設定為 false,且不會顯示任何對話方塊。

如果使用者在應用程式中可能有未儲存的變更,請使用此屬性在退出應用程式之前顯示確認對話方塊。 請使用可檢查變數和控制項屬性(例如,Edit form 控制項的 Unsaved 屬性)的公式。

確認對話方塊會出現在所有可能會遺失資料的情形中,如下列範例所示:

  • 執行 Exit 函式。
  • 如果應用程式是在瀏覽器中執行:
    • 關閉正在執行應用程式的瀏覽器或瀏覽器索引標籤。
    • 選取瀏覽器上的「上一頁」按鈕。
    • SelfLaunchTarget 執行 Launch 函數。
  • 如果應用程式是在 Power Apps Mobile (iOS 或 Android) 上執行:
    • 輕掃即可切換至行動版 Power Apps 中的不同應用程式。
    • 在 Android 裝置上選取返回鍵。
    • 執行 Launch 函數以啟動另一個畫布應用程式。

確認對話方塊的實際外觀可能會因裝置與 Power Apps 版本的不同而有所不同 。

確認對話方塊未出現在 Power Apps Studio 中。

ConfirmExitMessage

根據預設,確認對話方塊會顯示一般訊息,例如,以使用者語言表示您可能有未儲存的變更。

使用 ConfirmExitMessage,在確認對話方塊中提供自訂訊息。 如果此屬性為空白,則會使用預設值。 自訂訊息會視需要在確認對話方塊中被截斷以符合空間,因此請將訊息保持在最多幾行就好。

在瀏覽器中,確認對話方塊可能會顯示來自瀏覽器的一般訊息。

Note

應用程式物件還有兩個實驗性屬性,OnMessageBackEnabled。 這些屬性最終會從應用程式物件中移除。 建議您不要在生產環境中使用這些屬性。

範例

  1. 建立包含兩個表單控制項,AccountFormContactForm 的應用程式 。

  2. 應用程式物件的 ConfirmExit 屬性設為此運算式:

    AccountForm.Unsaved Or ContactForm.Unsaved
    

    如果使用者變更其中一個表單的資料,然後嘗試關閉應用程式但未儲存這些變更的話,就會顯示此對話方塊。

    一般確認對話方塊。

  3. 應用程式物件的 ConfirmExitMessage 屬性設為此公式:

    If( AccountsForm.Unsaved,
        "Accounts form has unsaved changes.",
        "Contacts form has unsaved changes."
    )
    

    如果使用者變更帳戶表單的資料,然後嘗試關閉應用程式但未儲存這些變更的話,就會顯示此對話方塊。

    針對表單的確認對話方塊。

公式屬性

使用 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 的值建立之前執行的 OnStartBGColor 也可能在製作者不知道的某個應用程式角落被人操縱,由其他人做出的變更,並且很難追蹤。

命名公式提供了另一種選擇。 就像我們常編寫的 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 將使用相同的 FirstErrorAllErrors 範圍變數來評估,如果整個公式包裝在 IfError 函數 中。

如果 OnError 為空白,將會顯示預設錯誤橫幅和錯誤的 FirstError.Message。 定義 OnError 公式會覆寫此行為,讓製作者能夠按照他們認為合適的方式處理錯誤報告。 透過使用 Error 函數 重新擲回錯誤,可以在 OnError 中要求預設行為。 如果要篩選錯誤或以不同的方式處理錯誤,而通過其他錯誤,使功能會很有用。

OnError 不能像 IfError 那樣取代計算中的錯誤。 在叫用 OnError 時,已發生錯誤且已透過公式計算進行處理。 *OnError* 只控制錯誤報告。

OnError 公式是同時計算的,而且其計算可能會與其他錯誤處理重疊。 例如,如果您在 OnError 的頂端設定了全域變數,並稍後在相同的公式中讀取它,則該值可能已變更。 使用 With 函數來建立公式本機的命名值。

雖然每個錯誤都是由 OnError 單獨處理,但預設錯誤橫幅可能不會單獨顯示每個錯誤。 若要避免同時顯示太多錯誤橫幅,如果最近顯示相同的錯誤,則不會觸發新的錯誤橫幅。

範例

考慮透過公式繫結在一起的 Label控制項和 Slider 控制項:

Label1.Text = 1/Slider1.Value

透過公式 Label1.Text = 1/Slider1.Value 繫結標籤和 slider 控制項。

滑桿預設為 50。 如果滑桿移至 0,則 Label1 將不會顯示任何值並會顯示錯誤橫幅:

Slider 控制項移至 0,會導致除數為零錯誤和錯誤橫幅。

讓我們詳細看看發生了什麼:

  1. 使用者將滑桿移至左側,而 Slide1.Value 屬性變更為 0。
  2. Label1.Text 會自動重新評估。 發生除數為零,產生錯誤。
  3. 此公式中沒有 IfError。 除數為零錯誤由公式評估傳回。
  4. Label1.Text 無法顯示此錯誤的任何內容,因此它會顯示空白狀態。
  5. OnError 已叫用。 因為沒有處理常式,所以會顯示標準錯誤橫幅和錯誤資訊。

如有需要,我們也可以將公式修改為 Label1.Text = IfError( 1/Slider1.Value, 0 )。 這樣會導致沒有錯誤或錯誤橫幅。 我們無法從 OnError 變更錯誤的值,因為此時錯誤已經發生,問題只在於回報方式。

如果我們新增了 OnError 處理常式,其不會在步驟 5 之前產生影響,但是會影響報告錯誤的方式:

Trace( $"Error {FirstError.Message} in {FirstError.Source}" )

App.OnError 公式設定為產生追蹤。

有了這個,從應用程式使用者的角度來看,不會有任何錯誤。 但是錯誤將新增至顯示器的追蹤中,並附有來自 FirstError 的錯誤資訊來源:

Slider 控制項移至 0 會導致除數為零錯誤,但沒有錯誤橫幅。

如果我們還想在追蹤之外顯示相同的預設錯誤橫幅,我們可以在追蹤呼叫之後使用 Error 函數重新擲回錯誤,就像追蹤不存在:

Trace( $"Error {FirstError.Message} in {FirstError.Source}" );
Error( FirstError )

OnStart 屬性

Note

在載入應用程式時,使用 OnStart 屬性會造成效能問題。 我們正在為使用屬性的兩大原因 (快取資料和設定全域變數) 建立替代方案。 我們已建立一個替代方案來定義要顯示的第一個 Navigate 畫面。 根據您的內容,預設可能會停用此屬性。 如果您沒看到但又需要使用此屬性,請檢查應用程式的 [進階] 設定以找到開關來啟用它。 也可以使用畫面的 OnVisible 屬性。

當使用者開始應用程式時,OnStart 屬性即會執行。 此屬性通常是用於執行以下工作:

  • 使用 Collect 函式,檢索並緩存資料至集合。
  • 使用 Set 函式建立全域變數。

在第一個畫面出現之前,會先計算此公式。 未載入任何畫面,因此您不能使用 UpdateContext 函式來設定內容變數。 不過,您可以使用 Navigate 函式來傳遞內容變數 。

變更 OnStart 屬性之後,請將滑鼠懸停在樹狀結構檢視窗格中的應用程式物件上,選取省略符號 (...),然後選取執行 OnStart 以測試該屬性。 與應用程式第一次載入時不同,現有的集合和變數將會是已經設定好的。 若要從空的集合開始,請使用 ClearCollect 函式,而不是 Collect 函式。

適用於執行 OnStart 的應用程式物件捷徑功能表

注意

  • OnStart 屬性中使用 Navigate 函數已淘汰。 現有的應用程式將繼續運作。 在有限的時間內,您仍可以在應用程式設定中啟用它 (在已淘汰下)。 不過,以這種方式使用 Navigate 可能會造成應用程式載入延遲,因為這會強制系統在顯示第一個畫面之前完成 OnStart 的評估。 請改為使用 StartScreen 屬性來計算顯示的第一個畫面。
  • 對於 2021 年 3 月前建立,且從 2021 年 3 月至今有將 Navigate 新增至 OnStart 的應用程式,將會關閉已淘汰開關。 當您在 Power Apps Studio 中編輯此類應用程式時,可能會看到錯誤。 開啟上面提及的已淘汰開關來解決此錯誤。

StartScreen 屬性

Note

已開啟淘汰選項增強型公式列時,StartScreen 屬性將不會出現在屬性清單中。 若要關閉增強型公式列,請移至設定>即將推出的功能>已淘汰> 關閉增強型公式列開關,當您想使用 StartScreen 屬性時。

StartScreen 屬性決定要先顯示的畫面。 其會在應用程式載入時評估一次,並返回要顯示的畫面物件。 根據預設,此屬性將會是空白的,且會先顯示 [工作室樹狀結構] 檢視中的第一個畫面。

StartScreen 是資料流程屬性,不能包含行為函數。 所有資料流程函數都可使用,尤其是使用這些函數和訊號來判斷要先顯示哪個畫面:

  • Param 函數可讀取用於啟動應用程式的參數。
  • User 函數可讀取目前使用者的資訊。
  • LookUpFilterCountRowsMax,和其他從資料來源讀取的函數。
  • 透過連接器呼叫任何 API,但要注意其會快速傳回。
  • 訊號,例如連線羅盤應用程式

Note

全域變數和集合 (包括在 OnStart 中建立的變數和集合) 在 StartScreen 中無法使用。 某些宣告式替代方案可做到這一點。 如需有關此限制的意見反應,請移至 Power Apps 社群論壇

如果 StartScreen 傳回錯誤,則 [工作室樹狀結構] 檢視的第一個畫面會顯示為好像 StartScreen 尚未設定一樣。 使用 IfError 函數來擷取任何錯誤,並重定導向至適當的錯誤畫面。

在工作室中變更 StartScreen 後,請將滑鼠懸停在樹狀結構檢視窗格中的應用程式物件上,選取省略符號 (...),然後選取瀏覽至 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 呼叫將應用程式導向到 ForestScreenOceanScreen。 如果因任何原因而導致 API 失敗,則改為使用 ErrorScreen

StudioVersion 屬性

使用 StudioVersion 屬性可以顯示或記錄用於發佈應用程式的 Power Apps Studio 版本。 這在偵錯時非常有用,並可確保您的應用程式已使用最新版本的 Power Apps Studio 重新發佈。

StudioVersion 以文字形式傳回。 文字的格式可能會隨著時間的推移而改變,應作為一個整體來對待; 避免擷取單獨的部分。