適用於:畫布應用
獲取有關當前運行的應用程序的信息並控制應用程序的行為。
描述
就像控制項一樣, App 物件具有屬性,可識別正在顯示的畫面,並提示您儲存變更,以免遺失變更。 每個應用程式都有一個應用程式物件。
撰寫 App 物件某些屬性的公式。 在樹狀檢視窗格的頂端,選取您要為任何其他控制項或畫面做的應用程式物件。 若要檢視或編輯其中一個物件的屬性,請在資料編輯列左側的下拉式清單中選取該屬性。
ActiveScreen 屬性
ActiveScreen 屬性會識別目前顯示的畫面。
此屬性會傳回畫面物件。 使用它來參考目前畫面的屬性,例如具有公式 App.ActiveScreen.Name 的名稱。 您也可以將此屬性與另一個螢幕物件進行比較,例如使用比較公式 App.ActiveScreen = Screen2 來檢查 Screen2 是否為目前的螢幕。
BackEnabled 屬性
BackEnabled 屬性會變更應用程式在 Power Apps 行動版中執行時回應裝置後退手勢的方式 (在 Android 裝置上撥動或使用硬體返回按鈕,或在 iOS 裝置上從左側撥動)。 啟用後,裝置返回手勢會返回最近顯示的螢幕,這類似於 返回 公式。 停用時,裝置返回手勢會將使用者帶到應用程式清單。
ConfirmExit 屬性
沒人想要遺失未儲存的變更。 使用 ConfirmExit 和 ConfirmExitMessage 屬性,在關閉應用程式之前警告使用者。
注意
- ConfirmExit 無法在內嵌在 Power BI 和 SharePoint 中的應用程式中運作。
- 自訂頁面不支援 ConfirmExit。
- 現在,如果啟用了 延遲加載 預覽功能(默認情況下,新應用程序是該功能),這些屬性只能在第一個屏幕上引用控件。 如果您參考其他畫面,Power Apps Studio 不會顯示錯誤,但已發佈的應用程式不會在 Power Apps 行動版或瀏覽器中開啟。 我們正在努力取消這項限制。 同時,在「設定>」(在「預覽」下)中關閉延遲載入。
ConfirmExit
ConfirmExit 是布林值屬性,當 true 時,會在應用程式關閉之前開啟確認對話方塊。 根據預設,此屬性設定為 false,且不會顯示任何對話方塊。
當使用者在應用程式中可能有未儲存的變更時,請使用此屬性在結束應用程式之前顯示確認對話方塊。 使用檢查變數和控制項屬性的公式 (例如,編輯表單控制項的 Unsaved 屬性)。
確認對話方塊會出現在任何可能遺失資料的情況下,例如:
- 執行 Exit 函數。
- 如果應用程式在瀏覽器中執行:
- 關閉執行應用程式的瀏覽器或瀏覽器索引標籤。
- 選取瀏覽器的 [後退] 按鈕。
- 使用 Self 的 LaunchTarget 執行 Launch 函式。
- 如果應用程式在 Power Apps Mobile (iOS 或 Android) 中執行:
- 撥動以切換至 Power Apps Mobile 中的其他應用程式。
- 選擇 Android 設備上的後退按鈕。
- 執行 啟動 函數以啟動另一個畫布應用程式。
確認對話方塊的確切外觀可能會因裝置和 Power Apps 版本而異。
確認對話方塊不會顯示在 Power Apps Studio 中。
ConfirmExitMessage
根據預設,確認對話方塊會顯示一般訊息,例如,以使用者語言表示您可能有未儲存的變更。
使用 ConfirmExitMessage,在確認對話方塊中提供自訂訊息。 如果此屬性為空白,則會使用預設值。 自訂訊息會視需要截斷,以符合確認對話方塊,因此訊息最多保留為幾行。
在瀏覽器中,確認對話方塊可以顯示來自瀏覽器的一般訊息。
注意
App 物件還有兩個實驗性屬性 OnMessage ,和 BackEnabled。 這些屬性最終會從應用程式物件中移除。 請勿在生產環境中使用這些屬性。
範例
將應用程式物件的 ConfirmExit 屬性設為此運算式:
AccountForm.Unsaved Or ContactForm.Unsaved對話方塊會顯示使用者是否變更任一表單中的資料,然後嘗試關閉應用程式而不儲存這些變更。例如,使用者會變更任一表單中的資料,然後嘗試關閉應用程式而不儲存這些變更。
[!div clas1。 將應用程式物件的 ConfirmExitMessage 屬性設為此公式:
If( AccountsForm.Unsaved, "Accounts form has unsaved changes.", "Contacts form has unsaved changes." )對話方塊會顯示使用者是否變更 [帳戶] 表單中的資料,然後嘗試關閉應用程式而不儲存這些變更。
設定 Application Insights 的連接字串
若要將系統產生的應用程式記錄匯出至 Application Insights,請設定畫布應用程式的 [連接字串 ]。
- 在 Power Apps Studio 中開啟您的應用程式以進行編輯。
- 在左側導覽樹狀結構檢視中選取 App 物件。
- 在屬性窗格中輸入 [連接字串 ]。
如果資料未傳送至 Application 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;。
使用者定義的函式
Power Fx 包含一長串内建函數,例如 If、Text 和 Set。 使用者定義的函數可讓您撰寫自己的函數,這些函數就像内建函數一樣,也會接受參數並傳回值。 您可以將使用者定義的函數視為具名公式用於新增參數及支援行為公式的擴充。
例如,您可能會定義一個從圖書館傳回小說書籍的具名公式:
Library = [ { Title: "The Hobbit", Author: "J. R. R. Tolkien", Genre: "Fiction" },
{ Title: "Oxford English Dictionary", Author: "Oxford University", Genre: "Reference" } ];
LibraryFiction = Filter( Library, Genre = "Fiction" );
如果沒有參數,就需要為每個類型定義不同的具名公式。 不過,我們來將具名公式參數化:
LibraryType := Type( [ { Title: Text, Author: Text, Genre: Text } ] );
LibraryGenre( SelectedGenre: Text ): LibraryType = Filter( Library, Genre = SelectedGenre );
現在我們可以呼叫 LibraryGenre( "Fiction" )、LibraryGenre( "Reference" ),或使用單一使用者定義函數來篩選其他類型。
語法如下:
FunctionName( [ ParameterName1: ParameterType1 [ , ParameterName2: ParameterType2 ... ] ] ) : ReturnType = 公式;
- FunctionName – 必要。 使用者定義函數的名稱。
- ParameterName(s) – 選用。 函數參數的名稱。
- ParameterType(s) – 選用。 類型的名稱,可以是内建資料類型名稱、資料來源名稱,也可以是透過 Type 函數定義的類型。
- ReturnType – 必要。 函數傳回值的類型。
- Formula – 必要。 根據參數計算函數值的公式。
必須鍵入使用者定義函數的每個參數和輸出。 在此範例中,SelectedGenre: Text 將函數的第一個參數定義為文字類型,而 SelectedGenre 是在本文中用於篩選作業的參數名稱。 如需支援的類型名稱,請參閱資料類型。
Type 函數用於為圖書館建立彙總類型,讓我們可以從函數傳回書籍資料表。
我們已將 LibraryType 定義為記錄類型的複數資料表。 如果要將一本書傳遞至函數,我們可以透過 RecordOf 函數擷取此資料表的記錄類型:
BookType := Type( RecordOf( LibraryType ) );
IsGenre( Book: BookType, SelectedGenre: Text ): Boolean = (Book.Genre = SelectedGenre);
函數參數的記錄比對比 Power Fx 其他部分中的比對更嚴格。 記錄值的欄位必須是類型定義的適當子集,不能包含額外的欄位。 例如,IsGenre( { Title: "My Book", Published: 2001 }, "Fiction" ) 會產生錯誤。
請注意,使用者定義函數目前不支援遞迴。
行為使用者定義函數
具名公式和大多數使用者定義函數不支援有副作用的行為函數,例如 Set 或 Notify。 一般而言,如果可以的話,最好避免更新狀態,取而代之的是依賴函數式程式設計模式,讓 Power Fx 在需要時自動重新計算公式。 但有些情況是無法避免的。 若要將行為邏輯包含在使用者定義函數中,請以大括弧包住主體:
Spend( Amount: Number ) : Void = {
If( Amount > Savings,
Error( $"{Amount} is more than available savings" ),
Set( Savings, Savings - Amount );
Set( Spent, Spent + Amount)
);
}
現在可以呼叫 Spend( 12 ) 來檢查 Savings 中是否有 12,如果有,則將其借記為 12 並將 12 加到 Spent 變數中。 此函數沒有傳回值,因此其傳回類型為 Void。
行為使用者定義函數的語法如下:
FunctionName( [ ParameterName1: ParameterType1 [ , ParameterName2: ParameterType2 ... ] ] ) : ReturnType = { Formula1 [ ; 公式2 ... ]};
- FunctionName – 必要。 使用者定義函數的名稱。
- ParameterName(s) – 選用。 函數參數的名稱。
- ParameterType(s) – 選用。 類型的名稱,可以是内建資料類型名稱、資料來源名稱,也可以是透過 Type 函數定義的類型。
- ReturnType – 必要。 函數傳回值的類型。 如果函數沒有傳回值,請使用 Void。
- Formula(s) – 必要。 根據參數計算函數值的公式。
與所有 Power Fx 公式一樣,發生錯誤時不會結束執行。 呼叫 Error 函數之後,If 函數會讓 Savings 和 Spent 無法發生變更。 IfError 函數也可以用來防止在發生錯誤後進一步執行。 即使其傳回 Void,如果有問題,公式仍然可以傳回錯誤。
使用者定義型別
重要
- 使用者定義型別是實驗性功能。
- 實驗性功能並非供生產使用,也可能不完整。 這些功能是在正式發行前先行推出,讓您能夠搶先體驗並提供意見反應。 其他資訊:了解畫布應用程式中的實驗性、預覽及已淘汰功能
- 只有在使用者定義型別實驗性功能已於設定 > 即將推出的功能 > 實驗性中開啟 (預設為關閉狀態) 時,才能使用本文所述的行為。
- 您的意見反應對我們很有價值。 在 Power Apps 實驗性功能社群論壇中告訴我們您的想法。
可以將具名公式與 Type 函數搭配用來建立使用者定義型別。 使用 := 而不使用 = 來定義使用者定義型別,例如 Book := Type( { Title: Text, Author: Text } )。 如需詳細資訊和範例,請參閱 Type 函數。
OnError 屬性
使用 OnError 以在應用程式中的任何位置發生錯誤時採取動作。 這會讓您有機會在向使用者顯示錯誤橫幅之前,全域攔截該橫幅。 它還可以用於使用 Trace 函數記錄錯誤或寫入資料庫或 web 服務。
在畫布應用程式中,檢查每個公式評估的結果是否有錯誤。 如果發生錯誤,則使用與整個公式包裝在 IfError 函數中時所用相同的 FirstError 和 AllErrors 範圍變數來評估 OnError。
如果 OnError 是空的,預設錯誤橫幅會顯示錯誤的 FirstError.Message 。 定義 OnError 公式會覆寫此行為,因此製作者可以視需要處理錯誤報告。 您可以使用 Error 函式重新擲回錯誤,以要求 OnError 中的預設行為。 如果您想要以不同的方式過濾或處理某些錯誤,但讓其他錯誤通過,請使用重新拋出方法。
OnError 不能像 IfError 那樣取代計算中的錯誤。 如果叫用 OnError,則錯誤已經發生,而且已透過公式計算 (例如 IfError) 進行處理;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 )。 使用 IfError 表示沒有錯誤或錯誤橫幅。 您無法從 OnError 變更錯誤值,因為錯誤已經發生,OnError 只會控制報告方式。
如果您新增 OnError 處理常式,不會影響步驟 5 之前的步驟,但會變更錯誤的報告方式:
Trace( $"Error {FirstError.Message} in {FirstError.Source}" )
使用此 OnError 處理常式時,應用程式使用者不會看到任何錯誤。 但錯誤會新增至監視器的追蹤,包括來自 FirstError 的錯誤資訊來源:
如果您也想要顯示預設錯誤橫幅與追蹤,請在追蹤呼叫之後使用 Error 函式重新擲回錯誤,就像追蹤不存在一樣:
Trace( $"Error {FirstError.Message} in {FirstError.Source}" );
Error( FirstError )
OnStart 屬性
注意
使用 OnStart 屬性可能會導致載入應用程式時發生效能問題。 我們正在建立替代方案,以達到使用此屬性的前兩個原因 - 快取資料和設定全域變數。 已經有另一種選擇來定義要使用 Navigate 顯示的第一個屏幕。 視您的內容而定,預設可以停用此屬性。 如果您沒有看到它並且需要使用它,請檢查應用程式的進階設定是否有啟用它的開關。 您也可以使用螢幕的 OnVisible 屬性。 根據預設,當啟用非封鎖 OnStart 規則時,它會讓 OnStart 函式與其他應用程式規則同時執行。 因此,如果其他應用程式規則中參考的變數是在 OnStart 函式內初始化,則可能尚未完全初始化。 此外,螢幕可以在 Screen.OnVisible 或 App.OnStart 函式完成執行之前轉譯並變成互動式,特別是當它們需要很長時間才能完成時。
當使用者開始應用程式時,OnStart 屬性即會執行。 此屬性通常用於:
此公式會在第一個畫面出現之前執行。 未載入任何畫面,因此您不能使用 UpdateContext 函式來設定內容變數。 但您可以使用 Navigate 函數傳遞內容變數。
變更 OnStart 屬性之後,請將滑鼠停留在 [樹狀結構檢視] 窗格中的 [應用程式] 物件上,選取省略符號 (...),然後選取 [執行 OnStart] 來測試它。 與應用程式第一次載入時不同,現有的集合和變數已設定。 若要從空的集合開始,請使用 ClearCollect 函式,而不是 Collect 函式。
注意
- 在 OnStart 屬性中使用 Navigate 函式已淘汰。 現有應用程式仍然有效。 在有限的時間內,您可以在應用程式設定中啟用它(在 「已停用」下)。 但以這種方式使用 導航可能會導致 應用程序加載延遲,因為它會強制系統在顯示第一個屏幕之前完成運行 OnStart 。 改用 StartScreen 屬性來設定顯示的第一個畫面。
- 對於 2021 年 3 月之前建立的應用程式,您在 2021 年 3 月和現在之間新增了 [導覽 至 OnStart ],已淘汰的開關會關閉。 當您在 Power Apps Studio 中編輯這些應用程式時,您會看到錯誤。 開啟 retired 參數以清除此錯誤。
StartScreen 屬性
StartScreen 屬性會設定哪個畫面先顯示。 當應用程式載入並傳回要顯示的螢幕物件時,會評估一次。 依預設,此屬性是空的,且 Studio Tree 檢視中的第一個畫面會先顯示。
StartScreen 是資料流程屬性,不能包含行為函數。 所有資料流程功能都可用。 使用這些功能和訊號來決定要先顯示哪個螢幕:
- Param 函數可讀取用於啟動應用程式的參數。
- User函數可讀取目前使用者的資訊。
- LookUp、Filter、CountRows、Max 和其他從資料來源讀取的函數。
- 透過連接器呼叫 API 。 確保通話快速返回。
- 訊號,例如連線、羅盤和應用程式。
注意
全域變數和集合,包括在 OnStart 中建立的變數和集合,無法在 StartScreen 中使用。 可以使用具名公式,這通常是在整個應用程式中重複使用公式的更好選擇。
如果 StartScreen 傳回錯誤,Studio Tree 檢視中的第一個畫面會顯示為未設定 StartScreen 。 使用 IfError 函式來攔截任何錯誤,並重新導向至錯誤畫面。
在 Studio 中變更 StartScreen 之後,請將滑鼠停留在 [樹狀結構檢視] 窗格中的 [應用程式] 物件上,選取省略符號 (...),然後選取 [瀏覽至 StartScreen] 來測試它。 屏幕會發生變化,就好像應用程序剛剛加載一樣。
範例
Screen9
Screen9 每當應用程式啟動時都會先顯示。
If( Param( "admin-mode" ) = 1, HomeScreen, AdminScreen )
檢查是否設定了參數「admin-mode」,並使用它來決定是先顯示 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 會傳回文字。 此文本的格式可能會隨著時間的推移而變化,因此請將其視為一個整體,不要提取單個部分。