資源和程式碼
本概述將著重於如何使用程式碼存取或建立 Windows Presentation Foundation (WPF) 資源,而非 Extensible Application Markup Language (XAML) 語法。 如需從 XAML 語法觀點來了解一般資源使用方式和資源的詳細資訊,請參閱 XAML 資源。
從程式碼存取資源
如果在程式碼中要求資源,則識別資源是否透過 XAML 定義的索引鍵也會用於擷取特定資源。 從程式碼擷取資源的最簡單方式是,從應用程式中的架構層級物件呼叫 FindResource 或 TryFindResource 方法。 這些方法之間的行為差異在於,找不到要求的索引鍵時會發生什麼情況。 FindResource 會引發例外狀況:TryFindResource 不會引發例外狀況,但會傳回 null
。 每個方法都會取得資源索引鍵做為輸入參數,並傳回弱類型的物件。 一般而言,資源索引鍵是一個字串,但偶而會有非字串的使用方式;如需詳細資訊,請參閱使用物件做為索引鍵一節。 通常您會將傳回的物件轉型為您在要求資源時設定之屬性所需的類型。 程式碼資源解析的查詢邏輯與動態資源參考 XAML 案例相同。 資源的搜尋會從呼叫元素開始,然後繼續進行邏輯樹狀結構中後續的父元素。 查閱會視需要繼續尋找應用程式資源、主題和系統資源。 資源的程式碼要求會實際負責資源字典中的運行時間變更,這些可能是在從 XAML 載入該資源字典之後所進行的變更,同時也會負責處理即時系統資源變更。
以下的簡短程式碼範例會依索引鍵尋找資源,然後使用傳回的值來設定屬性,如同 Click 事件處理常式所實作。
void SetBGByResource(object sender, RoutedEventArgs e)
{
Button b = sender as Button;
b.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub SetBGByResource(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim b As Button = TryCast(sender, Button)
b.Background = CType(Me.FindResource("RainbowBrush"), Brush)
End Sub
另一種指派資源參考的方法是 SetResourceReference。 這個方法會採用兩個參數︰資源的索引鍵,以及特殊相依性屬性的識別碼,該屬性會出現在應指派資源值的元素執行個體上。 在功能上,這個方法是一樣的,而且優點是不需要對傳回值進行任何轉型。
此外,以程式設計方式存取資源的另一個方式是以字典的形式存取 Resources 屬性內容。 同樣地,存取這個屬性所包含的字典包括,您如何將新資源新增至現有的集合、檢查以查看是否已經在集合中取得指定的索引鍵名稱,以及其他的字典/集合作業。 如果您想完全使用程式碼編寫 WPF 應用程式,也可以使用程式碼建立整個集合、將索引鍵指派給它,然後將完成的集合指派給已建立元素的 Resources 屬性。 下一節將說明此動作。
您可以使用特定的索引鍵做為索引,在任何指定的 Resources 集合中編製索引,但要注意,用這種方式存取資源不符合資源解析的標準執行階段規則。 您只能存取該特定的集合。 如果在要求的索引鍵上在找不到任何有效的物件,資源查閱就不會將範圍周遊至根項目或應用程式。 不過,此方法在某些情況下恰巧具有效能優點,因為索引鍵的搜尋範圍更加限定。 請參閱 ResourceDictionary 類別了解更多如何直接使用資源字典的相關資訊。
使用程式碼建立資源
如果您想要使用程式碼來建立整個 WPF 應用程式,則也可以使用程式碼在應用程式中建立任何資源。 想這麼做,請建立新的 ResourceDictionary 實體,然後使用後續對 ResourceDictionary.Add 的呼叫,將所有資源新增到字典中。 接著,使用以此方式建立的 ResourceDictionary,在出現於頁面範圍中的元素上設定 Resources 或 Application.Resources。 您也可以保留 ResourceDictionary 做為獨立物件,而不將它新增到元素。 不過,如果這麼做,您必須依項目索引鍵存取其中的資源,就如同它是泛型字典。 未附加至元素 Resources
屬性的 ResourceDictionary 不會作為專案樹狀結構的一部分存在,而且在查詢序列中沒有任何範圍可供 FindResource 和相關方法使用。
使用物件做為索引鍵
大多數的資源使用方式會將資源的索引鍵設定為字串。 不過,許多 WPF 功能會刻意不使用字串類型來指定索引鍵,而是此參數就是一個物件。 讓物件將資源當成索引鍵的功能,是透過 WPF 樣式和佈景主題支援來使用。 主題中的樣式會成為非樣式控制項的預設樣式,每個樣式都由它們應套用的控制項的 Type 用來當作索引鍵。 依類型做為索引鍵,會提供可靠的查閱機制,在每個控制項類型的預設執行個體上運作,而且類型可以依反射來偵測,並用於設定衍生類型的樣式,即使衍生的類型不具預設樣式也一樣。 您可以使用 X:Type 標記延伸,針對 XAML 中定義的資源指定 Type 索引鍵。 還有類似的延伸可供支援 WPF 功能的其他非字串索引鍵用法使用,例如 ComponentResourceKey 標記延伸。