使用和更新動態資源

已完成

在上一個單元中,您已在 XAML 中定義一個資源並使用它作為靜態值。 不過,有一些情況不適用 StaticResource。 請考量下列案例:

  • 假設您想要實作可讓使用者在執行階段變更應用程式外觀的色彩佈景主題。 StaticResource 標記延伸只會對字典進行一次查閱,因此無法動態更新 UI。

  • 您將使用者喜好設定儲存在 Web 伺服器上,並在應用程式啟動時載入它們。 如果字典中找不到索引鍵,StaticResource 標記延伸就會擲回例外狀況。

此單元會告訴您如何使用動態資源來處理這類問題。

如何在執行階段更新資源

您可以將資源儲存在資源字典中。 您可以撰寫程式碼,在執行階段上更新這些資源。 您甚至可以新增新的資源,或移除現有的資源。

請考慮下列範例:

<ContentPage.Resources>
    <Color x:Key="PanelBackgroundColor">Blue</Color>
</ContentPage.Resources>

假設您想要在應用程式執行時變更 PanelBackgroundColor 資源的值。 您可以將程式碼新增至頁面的程式碼後置檔案,以存取 Resources 屬性。 下列範例會將資源值從先前的 XAML 範例更新為不同的顏色。

this.Resources["PanelBackgroundColor"] = Colors.Green;

什麼是 DynamicResource?

DynamicResource 是另一個用於在資源字典中尋找資源的標記延伸。 與 StaticResource 的相似之處在於,其會在目標物件建立時執行字典查閱。 但它也會接聽字典中資源的變更。 如果字典中的資源值發生變更,DynamicResource 會自動更新 UI。

DynamicResource 有一個勝過 StaticResource 的優點。 如果 DynamicResource 無法在字典中找到該索引鍵,則會使該屬性保持未設定狀態。 與 StaticResource 不同,遺漏的索引鍵不是錯誤,也不會擲回例外狀況。

注意

DynamicResource 標記延伸的性質會對您的應用程式造成少量效能影響。 雖然您可以在 XAML 頁面中使用 DynamicResource 來取代 StaticResource,但如果資源沒有變更,則您應該使用 StaticResource 標記延伸來進行參照。

若要使用先前範例中更新的背景色彩,您可以將 DynamicResource 套用到 XAML 程式碼,如下所示:

<ContentPage ...>
    <ContentPage.Resources>
        <Color x:Key="PanelBackgroundColor">Blue</Color>
    </ContentPage.Resources>

    <StackLayout BackgroundColor="{DynamicResource PanelBackgroundColor}">
    ...
    </StackLayout>
</ContentPage>

如果 PanelBackgroundColor 資源的值變更,則 StackLayout 控制項的 BackgroundColor 值會自動更新。

知識檢查

1.

DynamicResource 提供哪些 StaticResource 未提供的功能?